package SRC;
//FractalFrame.java
import javax.swing.*;
import java.awt.*;
public class FractalFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public static Toolkit kit = Toolkit.getDefaultToolkit();
public static Dimension screenSize = kit.getScreenSize();
public static FractalFrame FF;
public static JLabel JL = new JLabel("Recursion Time : ");
public static JTextField JF = new JTextField("3",10);
public static JButton JB = new JButton("START");
public static JLabel jL = new JLabel("Unit length (unit : pixels) : ");
public static JTextField jF = new JTextField("1",10);
public static FractalPanel FP;
public static JPanel JP = new JPanel();
public static JScrollPane JSP = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
public FractalFrame(int width,int height){
super("Dragon fractal");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(width,height);
int w = screenSize.width;
int h = screenSize.height;
setLocation((w - width) / 2,(h - height) / 2);
setVisible(true);
}
public static void main(String[] args){
FF = new FractalFrame(1500,1000);
FP = new FractalPanel(1,3);
JB.addActionListener((e) -> {
FP.setUnitLength(Integer.parseInt(jF.getText()));
FP.setRecursionTime(Integer.parseInt(JF.getText()));
FP.start();
});
JSP.getViewport().add(FP);
JP.add(jL);
JP.add(jF);
JP.add(JL);
JP.add(JF);
JP.add(JB);
FF.add(JSP,BorderLayout.CENTER);
FF.add(JP,BorderLayout.SOUTH);
FF.repaint();
}
}
package SRC;
//FractalPanel.java
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class FractalPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
public Vector<Point> PointSet = new Vector<Point>();
private int UnitLength,RecursionTime;
public boolean DO = false;
public FractalPanel(int UnitLength,int RecursionTime){
super();
PointSet.add(new Point(FractalFrame.FF.getWidth() / 2,FractalFrame.FF.getHeight() / 2));
this.UnitLength = UnitLength;
this.RecursionTime = RecursionTime;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(DO) {
ResetPointSet(RecursionTime);
int Pointer = 0;
while((Pointer + 2) <= (PointSet.size())) {
Point p1 = PointSet.get(Pointer);
Point p2 = PointSet.get(Pointer + 1);
System.out.println("Pointer : " + Pointer);
System.out.println("p1 : " + p1);
System.out.println("p2 : " + p2);
g.drawLine(p1.x,p1.y,p2.x,p2.y);
Pointer ++;
}
DO = false;
}
}
private void ResetPointSet(int time){
System.out.println("ResetPointSet()");
if(time > 0) {
if(PointSet.size() != 1){
Vector<Point> PrimevalPointSet = new Vector<Point>();
for(Point PrimevalPoint : PointSet){
PrimevalPointSet.add(PrimevalPoint);
}
Collections.reverse(PrimevalPointSet);
Point RotateOrigin = PrimevalPointSet.get(0);
System.out.println("RotateOrigin : " + RotateOrigin);
int Indicator = 0;
for(Point PrimevalPoint : PrimevalPointSet){
Point ModifiedPoint = new Point(RotateOrigin.x - RotateOrigin.y + PrimevalPoint.y
,RotateOrigin.y + RotateOrigin.x - PrimevalPoint.x);
if(Indicator != (PrimevalPointSet.size())) {
PointSet.add(PrimevalPointSet.size() +Indicator,ModifiedPoint);
System.out.println("ModifiedPoint : " + ModifiedPoint);
Indicator ++;
}
}
System.out.println("PointSet : " + PointSet);
System.out.println("PointSet Size: " + PointSet.size());
}else{
Point o = PointSet.get(PointSet.size() - 1);
PointSet.add(new Point(o.x,o.y - UnitLength));
System.out.println("PointSet : " + PointSet);
System.out.println("new Point : " + new Point(o.x,o.y - UnitLength));
}
time --;
ResetPointSet(time);
}
}
public void setRecursionTime(int RecursionTime) {
this.RecursionTime = RecursionTime;
}
public void setUnitLength(int UnitLength) {
this.UnitLength = UnitLength;
}
public void start() {
PointSet.removeAllElements();
PointSet.add(new Point(FractalFrame.FF.getWidth() / 2,FractalFrame.FF.getHeight() / 2));
DO = true;
repaint();
}
}
运行结果: