C#曼德博集合渲染器迭代数始终返回2的问题求助
问题根源分析
你的代码出现迭代数最多为2的问题,核心原因有两个:
1. 坐标映射完全错误
曼德博集合的核心计算区域是x∈[-2, 1],y∈[-1.5, 1.5],但你当前的Run方法中:
fromX、fromY是整数0,h是整数1- 计算出的
x = 0 + i*1、y = 0 + j*1,最终x和y的范围是0到249(因为size=250)
这些点全部位于曼德博集合的外部区域,几乎所有点都会在2次迭代内就超过逃逸阈值(模长平方>4),自然迭代数最多为2。
2. 整数参数导致步长过大
Run方法的h参数是int类型,传入值为1,这意味着每个像素对应的坐标跨度是1,远大于曼德博集合的实际范围,进一步加剧了所有点都快速逃逸的问题。
修复方案
步骤1:修正坐标映射逻辑
修改Run方法,将像素坐标转换到曼德博集合的标准范围:
public static int[,] Run(int size, float minX, float maxX, float minY, float maxY) { int[,] output = new int[size, size]; float stepX = (maxX - minX) / size; float stepY = (maxY - minY) / size; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { // 将像素坐标(i,j)映射到曼德博集合的坐标范围 float x = minX + i * stepX; float y = minY + j * stepY; output[i, j] = IterCount(x, y, MaxIterations); } } return output; }
步骤2:修改Main方法的调用参数
调用修正后的Run方法,传入正确的坐标范围:
int[,] grid = Run(size, -2f, 1f, -1.5f, 1.5f);
步骤3:优化IterCount方法的初始计算(可选)
当前IterCount方法的初始xSquared和ySquared是0,第一次循环会重新计算,虽然不影响结果,但可以调整为更清晰的逻辑:
public static int IterCount(float constX, float constY, int maxIterations) { const float maxMagnitudeSquared = 4f; int i = 0; float x = 0.0f, y = 0.0f; while (x*x + y*y <= maxMagnitudeSquared && i < maxIterations) { float xtmp = x*x - y*y + constX; y = 2.0f * x * y + constY; x = xtmp; i++; } return i; }
验证效果
修复后,大部分点的迭代数会超过2,你会看到正确的曼德博集合图案(黑色点为集合内的点,迭代数达到MaxIterations)。
内容的提问来源于stack exchange,提问作者Ovicior
相关产品推荐
相关产品推荐

