我需要使用算法
Iterated Function System绘制分形漩涡.
这个分形有系数:
0.745455 -0.459091 0.406061 0.887121 1.460279 0.691072 0.912675 -0.424242 -0.065152 -0.175758 -0.218182 3.809567 6.741476 0.087325
这里是我的代码:
import java.awt.Graphics; import javax.swing.JPanel; public class Surface extends JPanel { double a1 = 0.745455; double b1 = -0.459091; double d1 = 0.406061; double e1 = 0.887121; double c1 = 1.460279; double f1 = 0.691072; double p1 = 0.912675; double a2 = -0.424242; double b2 = -0.065152; double d2 = -0.175758; double e2 = -0.218182; double c2 = 3.809567; double f2 = 6.741476; double p2 = 0.087325; double x1(double x,double y) { return a1 * x + b1 * y + c1; } double y1(double x,double y) { return d1 * x + e1 * y + f1; } double x2(double x,double y) { return a2 * x + b2 * y + c2; } double y2(double x,double y) { return d2 * x + e2 * y + f2; } public void paint(Graphics g) { drawFractal(g); } void drawFractal(Graphics g) { double x1 = 300; double y1 = 300; double x2 = 0; double y2 = 0; g.fillOval(300 + (int) x1,300 + (int) y1,3,3); for (int i = 0; i < 10000; i++) { double p = Math.random(); if (p < 0.91675) { x2 = x1(x1,y1); y2 = y1(x1,y1); g.fillOval(300 + (int) x2,300 + (int) y2,3); x1 = x2; y1 = y2; } else { x2 = x2(x1,y1); y2 = y2(x1,3); x1 = x2; y1 = y2; } } } }
如果有人可以指出我的错误,那将是巨大的.
解决方法
你的一代似乎是正确的(即不要做x1 = x2 300; y1 = y2 300;),但是你的问题是为了渲染的目的而离开规模.这意味着有很少的点落在图像的中心之外.
你的窗口是[0..600] x [0..600].尝试将x2和y2乘以50,以便您渲染[-6..6] x [-6..6]区域而不是[-300..300] x [-300..300]区域的空间.
请注意,绘制单个像素(作为自己的行)而不是3×3椭圆应该是足够的.
int xp = 300 + (int) (x2 * scale); int yp = 300 + (int) (y2 * scale); g.drawLine(xp,yp,xp,yp);
根据所渲染的内容,您可能需要稍微调整刻度,以合理的边界获得整个图像.注意第二个变换偏移为-6.7,因此30的比例应该是正确的.
另请注意,通过使用x1 = x2 300; y1 = y2 300;你改变变换并得到一个不同的分形(按你期望的比例).