我的程序运行并成功绘制了谢尔宾斯基三角形。然而,它只出现片刻,然后就消失了。为什么是这样?
这是我的程序(2 节课)。这是完全可编译和可运行的。
三角面板.java
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TrianglePanel extends JPanel {
int level = 2;
int width;
int height;
Graphics g;
public static void main(String[] agrs) {
TrianglePanel panel = new TrianglePanel();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(400, 400));
frame.setLocationRelativeTo(null);
frame.add(panel);
frame.setVisible(true);
}
public TrianglePanel() {
}
public void paintComponent(Graphics g) {
this.g = g;
width = this.getSize().width;
height = this.getSize().height;
ArrayList<Line> queue = new ArrayList<Line>();
queue.add(new Line(new Point(width / 2, 0), new Point(0, height)));
queue.add(new Line(new Point(0, height), new Point(width, height)));
queue.add(new Line(new Point(width, height), new Point(width / 2, 0)));
drawLine(queue.get(0));
drawLine(queue.get(1));
drawLine(queue.get(2));
int counter = 0;
while (true) {
if (level > 6) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
Line[] toDraw = queue.get(0).getTriangleToDraw(level, width, height);
Point[] toDrawPoints = toDraw[0].getPoints();
if (Math.sqrt(((Math.pow(toDrawPoints[1].x - toDrawPoints[0].x, 2)) + (Math.pow(toDrawPoints[1].y - toDrawPoints[0].y, 2)))) <= 4) {
System.out.println("breakyo");
break;
}
drawLine(toDraw[0]);
drawLine(toDraw[1]);
drawLine(toDraw[2]);
queue.remove(0);
queue.add(toDraw[0]);
queue.add(toDraw[1]);
queue.add(toDraw[2]);
counter++;
System.out.println(counter + " and " + level);
if (counter - Math.pow(3, level - 1) == 0) {
counter = 0;
level++;
}
}
}
private void drawLine(Line line) {
g.drawLine(line.getPoints()[0].x, line.getPoints()[0].y, line.getPoints()[1].x, line.getPoints()[1].y);
}
}
线.java
import java.awt.Point;
public class Line {
private Point endpoint1;
private Point endpoint2;
private Point midpoint;
private double slope;
public Line(Point endpoint1, Point endpoint2) {
this.endpoint1 = endpoint1;
this.endpoint2 = endpoint2;
midpoint = new Point((endpoint1.x + endpoint2.x) / 2, (endpoint1.y + endpoint2.y) / 2);
slope = (double) (endpoint2.y - endpoint1.y) / (double) (endpoint2.x - endpoint1.x);
}
public Point[] getPoints() {
return new Point[] { endpoint1, endpoint2 };
}
public Line[] getTriangleToDraw(int level, int width, int height) {
Line[] lines = new Line[3];
if (slope > 0) { //negative slope
Point left = new Point(midpoint.x - (width / (int)(Math.pow(2, level - 1))), midpoint.y);
Point middle = new Point(midpoint.x - (width / (int)(Math.pow(2, level))), midpoint.y + (height / (int)(Math.pow(2, level - 1))));
lines[0] = new Line(midpoint, left);
lines[1] = new Line(midpoint, middle);
lines[2] = new Line(middle, left);
}
else if (slope < 0) { // positive slope
Point right = new Point(midpoint.x + (width / (int)(Math.pow(2, level - 1))), midpoint.y);
Point middle = new Point(midpoint.x + (width / (int)(Math.pow(2, level))), midpoint.y + (height / (int)(Math.pow(2, level - 1))));
lines[0] = new Line(midpoint, right);
lines[1] = new Line(midpoint, middle);
lines[2] = new Line(middle, right);
}
else { //zero slope
Point left = new Point(midpoint.x - (width / (int)(Math.pow(2, level))), midpoint.y - (height / (int)(Math.pow(2, level - 1))));
Point right = new Point(midpoint.x + (width / (int)(Math.pow(2, level))), midpoint.y - (height / (int)(Math.pow(2, level - 1))));
lines[0] = new Line(midpoint, left);
lines[1] = new Line(midpoint, right);
lines[2] = new Line(left, right);
}
return lines;
}
}