Java Mandelbrot关于缩放和着色的可视化问题
我正在尝试用java为Mandelbrot集合编写一个可视化程序,有几件事我正在努力编写。我意识到围绕这个主题的问题已经被问了很多,网上有很多文档,但是很多事情看起来非常复杂,我对编程相对来说是个新手 第一期 我的第一个问题是放大分形。我的目标是对分形进行“无限”缩放(当然不是无限的,只要普通计算机在计算时间和精度方面允许)。我目前采用的方法是以下计时器:Java Mandelbrot关于缩放和着色的可视化问题,java,mandelbrot,Java,Mandelbrot,我正在尝试用java为Mandelbrot集合编写一个可视化程序,有几件事我正在努力编写。我意识到围绕这个主题的问题已经被问了很多,网上有很多文档,但是很多事情看起来非常复杂,我对编程相对来说是个新手 第一期 我的第一个问题是放大分形。我的目标是对分形进行“无限”缩放(当然不是无限的,只要普通计算机在计算时间和精度方面允许)。我目前采用的方法是以下计时器: 在实轴(-2,2)和虚轴(2,2)范围内使用一定次数的迭代绘制集合 将这些范围更改为放大 使用迭代次数重新绘制集合的该部分 这是我挣扎的
- 在实轴(-2,2)和虚轴(2,2)范围内使用一定次数的迭代绘制集合李>
- 将这些范围更改为放大李>
- 使用迭代次数重新绘制集合的该部分
for (int Py = beginY; Py < endY; Py++) {
for (int Px = beginX; Px < endX; Px++) {
double x0 = map(Px, 0, height,-2, 2);
double y0 = map(Py, 0, width, -2, 2);
for(int-Py=beginY;Py
Px和Py是图像中像素的坐标。图像为1000x1000。贴图函数取一个数字,在本例中为Px或Py,范围为(0,1000),并在范围(-2,2)上均匀地对其进行划分,因此它返回该范围内的相应值
我认为为了放大,我必须在计时器中以某种方式更改-2和2的值,但无论我尝试什么,它似乎都不起作用。缩放总是在一段时间后变慢,或者它最终会放大集合中的一部分,而不是边框。我试着在每个计时器中将它们乘以一些比例因子ck,但这并没有真正产生我想要的结果
现在我有两个关于这个问题的问题
Color[] colors = new Color[maxIterations + 2];
for (int i = 0; i < colors.length; i++) {
colors[i] = new Color((int)map(i, 0, maxIterations + 2, 0, 255),
(int)map(i, 0, maxIterations + 2, 0, 255),
(int)map(i, 0, maxIterations + 2, 0, 255));
}
Color[]colors=新颜色[maxIterations+2];
for(int i=0;i
然后我在数组中填入迭代次数,并将该颜色分配给像素。关于这一点,我有两个问题:
听起来你已经有了一个好的开始 第一个问题:我相信有一些方法可以自动选择要放大的集合中“有趣”的部分,但我不知道它们是什么。我很确定这不仅仅是对当前的边界矩形应用一些线性函数,这听起来像是你在做的 因此,您可以尝试找出这些方法是什么(可能在数学上变得复杂),但如果您是编程新手,您可能会发现让用户选择缩放位置更容易。这在开始时也更有趣,因为您可以重复运行程序,每次都可以探索集合中的新部分 一种简单的方法是让用户在图像上绘制一个矩形,并使用
map
函数将绘制矩形的像素坐标转换为缩放区域的新实坐标和虚坐标
您还可以将这两种方法结合起来:一旦您通过手动选择缩放区域找到了感兴趣的地方,您可以将其设置为“最终目的地”,并让代码逐渐平滑地放大,以创建一部漂亮的电影
当你开始使用越来越精确的坐标时,它总是会逐渐变慢,直到你用double
达到精度极限,它就会变成一个像素化的混乱。从那里开始,如果你想进一步放大,你必须用bigdecime
研究任意精度的算法,它将继续变为get越来越慢
关于第二个问题:首先计算每个像素的numIterations/maxIterations
(即介于0和1之间)值是正确的想法(我认为这基本上就是您正在做的)
从那里,有各种各样的方法将这个值转换成一种颜色,是时候开始创造了
一个简单的方法是有几个非常不同的颜色数组。例如,如果你有白色(0.0)、红色(0.25)、绿色(0.5)、蓝色(0.75)、黑色(1.0),那么如果你计算的数字正好是列出的其中一个,你会使用相应的颜色。如果颜色介于两者之间,你会混合颜色,例如,对于0.3,你会选择:
((0.5-0.3)*red + (0.3-0.25)*green) / (0.5 - 0.25)
= 0.8*red + 0.2*green
将两种颜色的加权平均值作为练习;)
(提示:分别取r、g和b值的平均值。使用alpha值也可能有效)
如果你愿意的话,再来一杯