TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
对分形很感兴趣,想用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
-
- list = new ArrayList
-
- ();
- 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();
- }
-
- }
-
-
复制代码
源码下载:http://file.javaxxz.com/2014/11/17/235808390.zip |
|