曲折的递归分形山
Troubling Recursive Fractal Mountain
我正在写一些OpenGl代码来创建一个分形山。我正在使用递归,并且遇到了困难。
我遇到的问题是三角形的撕裂和重叠:https://i.stack.imgur.com/ha7gx.jpg
问题是,我以为我已经解决了这个问题,这是我的代码。
我的三角类,vec2只是一个通用的二维向量
struct Triangle {
vec2 A, B, C;
Triangle(vec2 a, vec2 b, vec2 c) {
A = a;
B = b;
C = c;
};
这是我的递归函数,它最初是用默认查看体积中的顶点(-1,-1)、(0,1)和(1,-1)的三角形调用的。
void divide_triangle(const Triangle& baseTriangle, int count) {
if (count > 0) {
std::vector<Triangle> subTriangles = subdivideTriangle(baseTriangle);
for (int i = 0; i < subTriangles.size(); i++) {
divide_triangle(subTriangles[i], count - 1);
}
}
else {
triangle(baseTriangle); // Draw triangle at the end of recursion
}
这是我的subDivideTriangles函数,它简单地将经过的三角形划分为四个独立的三角形
std::vector<Triangle> subdivideTriangle(const Triangle& triangle){
vec4 aPrime = getMidpoint(triangle.B, triangle.C);
vec4 bPrime = getMidpoint(triangle.C, triangle.A);
vec4 cPrime = getMidpoint(triangle.A, triangle.B);
return{
{ Triangle(triangle.A, cPrime, bPrime) }, // Top triangle
{ Triangle(cPrime, triangle.B, aPrime) }, // Bottom left triangle
{ Triangle(bPrime, aPrime, triangle.C) }, // Bottom right triangle
{ Triangle(cPrime, aPrime, bPrime) } // Center triangle
};
这是一个我认为可以停止撕裂的函数,我跟踪一对向量对应的中点值,如果我找到对应的向量对,我会返回原始中点,因此不会移动中点两次。
然而,这种方法似乎并不像我想的那样奏效。
vec4 getMidpoint(const vec4& a, const vec4& b) {
auto AB = std::make_pair(a, b), BA = std::make_pair(b, a);
auto foundResult1 = memo.find(AB);
auto foundResult2 = memo.find(BA);
if (foundResult1 != memo.end())
return memo[AB];
if (foundResult2 != memo.end())
return memo[BA];
auto result = (a + b) / 2;
result += randVector() * getLength(a, b) * randomness;
memo.insert(std::make_pair(AB, result));
memo.insert(std::make_pair(BA, result));
return result;
你们有什么见解吗,我的中点函数有问题吗?
您的问题来自相邻的边。
假设你有两个三角形ABC和DBC,BC是公共边,你想通过添加一些有噪声的中点来修改它们。
根据三角形的不同,可以使用两个不同的点作为BC的中间。
- 当你在ABC上修改它时,让E是BC的中间
- 当您对DBC进行修改时,让F是BC的中间
E和F必须相同。否则就会出现很大的差距。它在你的照片上很容易看到。
在我看来,您应该使用索引顶点,并使用一个表(或任何方法)来查找给定边的现有中间。即:当在DBC中计算BC的F中间时,我们检查并发现它已经作为E.存在
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 变分模板递归构造函数问题
- 如何将这种递归解决方案转换为分而治之?
- C / SFML:使用两个递归调用在屏幕上打印凸形形状仅显示第一个递归调用中的形状,而不是第二个
- 变分递归模板mem有趣的专业化
- 曲折的递归分形山
- C++ 递归排序通过分而治之和迭代排序
- 可变模板,递归,非typename形参