对分形很感兴趣,想用java画一下Koch曲线。非常好玩好看。先给大家看一下效果。 下面是程序的实现代码。可以改变参数设置分形的次数。 public class Vector { private int pointX; private int pointY; Vector(int x, int y) { pointX = x; pointY = y; } public int getX() { return pointX;} public int getY() {return pointY;} //向量的加法运算 public Vector add(Vector point) { return new Vector(this.pointX + point.getX(), this.pointY + point.getY()); } //向量的数乘 public Vector multiPly(double number) { return new Vector((int) (number * pointX), (int) (number * pointY)); } //向量的减法运算 public Vector subtract(Vector point) { return new Vector(this.pointX - point.getX(), this.pointY - point.getY()); } //求该向量的法向量 public Vector vertial() { return new Vector(pointY, -pointX).multiPly(Math.sqrt(3) / 6); } } import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; public class FenXinFrame extends JFrame { List<Vector> list = new ArrayList<Vector>(); Vector vectorStart = new Vector(0, 400); Vector vectorEnd = new Vector(600, 400); FenXinFrame() { this.setBounds(200, 200, 600, 600); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); create(4,vectorStart,vectorEnd); repaint(); } public void create(int n, Vector startPosition, Vector endPosition) { if (n == 0); else { Vector temp = endPosition.subtract(startPosition); Vector vectorFirst = startPosition.add(temp.multiPly(0.333));//求得第一个点的坐标 create(n - 1, startPosition, vectorFirst);//在第一个点和第二个点递归调用create list.add(vectorFirst);//把第一个点的坐标加入list Vector vectorSecond = temp.multiPly(0.5).add(startPosition).add( temp.vertial());//求得第二个点的坐标 create(n - 1, vectorFirst, vectorSecond);//在第二个点和第三个点递归调用create list.add(vectorSecond);//把第二个点的坐标加入list Vector vectorThird = startPosition.add(temp.multiPly(0.666));//求得第三个点的坐标 create(n - 1, vectorSecond, vectorThird);//在第三个点和第四个点递归调用create list.add(vectorThird);//把第三个点的坐标加入list create(n - 1,vectorThird,endPosition);//在第四个点和第五个点递归调用create } } public void paint(Graphics g) { super.paint(g); Vector temp = vectorStart; for (Vector vec : list) { g.drawLine(temp.getX(), temp.getY(), vec.getX(), vec.getY()); temp = vec; } g.drawLine(temp.getX(), temp.getY(), vectorEnd.getX(), vectorEnd.getY()); } public static void main(String[] args) { new FenXinFrame(); } }