何为分形,简单来说,它就是一种具有自相似特性的现象、图象或者物理过程。虽然定义简单易懂,就是自己包含许许多多相识的部分,但正如黄金分割比0.618一样,它能产生大量令人叹为观止的图案。
常见的分形例子有:谢尔宾斯基三角形和地毯、门格海绵、龙形曲线、空间填充曲线和科赫曲线等等。
大家可以上网轻松地找到。而制作分形也不是件难事,通过PS,Matlab或者Java等软件我们可以试着设计自己独属的分形,作为一种标志。
下面就附上一段制作简单分形的代码,数学公式来源于网上。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ls {
double x = 0, y = 0;
Random random = new Random();
/**
* @param args
*/
public static void main(String[] args) {
Ls py = new Ls();
py.init();
}
//初始化界面
public void init() {
JFrame jf = new JFrame();
jf.setSize(800, 800);
jf.setTitle("分形");
jf.setDefaultCloseOperation(3);
jf.setResizable(false);
// jf.setBackground(Color.BLACK);
jf.setVisible(true);
Graphics g = jf.getGraphics();
draw(g);
draw2(g);
}
public void draw(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// 使用循环计算出每次迭代值,并完成绘制
for (int i = 0; i < 10000; i++) {
double a = -1.7, b = -2.5, c = -2, d = -2;
x = d * Math.sin(a * x * Math.PI) - Math.cos(b * y * Math.PI);
y = c * Math.cos(a * x * Math.PI) + Math.sin(b * y * Math.PI);
int m = (int) ((d * Math.sin(a * x * Math.PI) - Math.cos(b * y
* Math.PI)) * 100 + 400);
int n = (int) ((c * Math.cos(a * x * Math.PI) + Math.sin(b * y
* Math.PI)) * 100 + 350);
// 给每个点上颜色,并绘制
// g2.setColor(new
// Color(random.nextInt(250)+5,random.nextInt(250)+5,random.nextInt(250)+5));
g2.setColor(new Color(150, i % 255, i % 255));
// 画出这个点
// g.drawLine(m, n, m, n);
// g.drawOval(m, n, 5, 5);
// g.drawRect(m, n, 3, 3);
// g.draw3DRect(m, n,5, 5, false);
// g2.fill3DRect(m, n, 2, 2, true);
g2.fillRect(m + 1, n + 1, 3, 3);
}
}
public void draw2(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
double a = 1.40, b = 1.56, c = 1.40, d = -6.56;
//循环改变像素点颜色
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 80; j++) {
Color color = new Color(j++, j * 2, j * 3);
g.setColor(color);
}
//数学公式
double x1 = d * Math.sin(a * x) - Math.sin(b * y);
double y1 = c * Math.cos(a * x) + Math.cos(b * y);
int x2 = (int) (x1 * 50) + 400;
int y2 = (int) (y1 * 50) + 350;
//g.drawLine(x2, y2, x2, y2);
g.drawOval(x2, y2, 2, 2);
//改变坐标
x = x1;
y = y1;
}
}
}
编写分形图案的程序,重在递归这一思想。通过递归,我们可以容易重复相似的部分,同时也简化了代码。
现在,我们就可以通过分形,来创造属于我们眼中的美啦!!!