一,什么是迭代分形
迭代就是更替,轮换的意思。使用一系列循环对一组指令进行重复执行;分形是其组成部分与其整体相似的形,比如一个图形组成部分以某种方式与整体相似,那么该图形称为分形;迭代分形就是运用一系列循环操作按照一定的规律得到的由许多相似图形组成的图形。
二,迭代分形示例
1.
public void IFS1(double x, double y) {
double a = -1.8, b = -2.0, c = -0.5, d = -0.9;
//固定参数
for (int i = 0; i < 100000; i++) {
double tempX = Math.sin(a * y) + c * Math.cos(a * x);
double tempY = Math.sin(b * x) + d * Math.cos(b * y);
//计算下一组坐标
x = tempX;
y = tempY;
//交换数据
int X = (int) (x * 100) + x1;
int Y = (int) (y * 100) + y1;
//放大图形,调整图形比例
g.setColor(new Color(200,100,100));
g.drawLine(X, Y, X, Y);
//绘制出图形
}
}
2.
public void IFS3(double x, double y) {
int n = 0;
double[] a = {0.787879, -0.121212, 0.181818};
double[] b = {-0.424242, 0.257576, -0.136364};
double[] c = {0.242424, 0.151515, 0.090909};
double[] d = {0.859848, 0.053030, 0.181818};
double[] e = {1.758647, -6.721654, 6.086107};
double[] f = {1.408065, 1.377236, 1.568035};
//参数数组
for (int i = 0; i < 100000; i++) {
Random random = new Random();
int j = random.nextInt(100);
//这里是为了模拟概率
if (j <= 90) {//90%的概率调用第一组参数
n = 0;
} else if (j <= 95 && j > 90) {5%的概率调用第二组参数
n = 1;
} else if (j <= 100 && j > 95) {5%的概率调用第三组参数
n = 2;
}
double tempX = a[n] * x + b[n] * y + e[n];
double tempY = c[n] * x + d[n] * y + f[n];
//计算下一组坐标
x = tempX;
y = tempY;
//交换数据
int X = (int) (tempX * 50) + x1;
int Y = (int) (tempY * 50) + y1;
//调整比例
g.drawLine(X, Y, X, Y);
//绘出图形
}
}
3.
public void IFS5(double x , double y){
double a ,b ,c ,d ,e ,f;
double[]an = { 0.0000 , 0.7248 , 0.1583 , 0.3386} ;
double[]bn = { 0.2439 , 0.0337 , -0.1297 , 0.3694} ;
double[]cn = { 0.0000 , -0.0253 , 0.3550 , 0.2227} ;
double[]dn = { 0.3053 , 0.7426 , 0.3676 , -0.0756} ;
double[]en = { 0.0000 , 0.2060 , 0.1383 , 0.0679} ;
double[]fn = { 0.0000 , 0.2538 , 0.1750 , 0.0826} ;
//建立参数数组
for (int i = 0; i <1000000 ; i++) {
Random random = new Random();
int n = random.nextInt(4);
//随机选取一组参数
a = an[n];
b = bn[n];
c = cn[n];
d = dn[n];
e = en[n];
f = fn[n];
double tempX = a*x + b*y +e;
double tempY = c*x + d*y +f;
//计算下一组坐标
x=tempX;
y=tempY;
//数据代换
int X = (int) (tempX * 500) + x1;
int Y = (int) (tempY * 500) + y1;
//调整比例
g.setColor(Color.GREEN);
g.drawLine(X,Y,X,Y);
绘图
}
}