【发布时间】:2021-11-06 19:38:12
【问题描述】:
分形称为 Vicsek 分形。当我将中点的 x 和 y 值设置为 = firstDot 的 x 和 y 值 / 3 时,我得到了分形,但我的分形非常小,而且偏向一边。但是,当我将它设置为等于 firstDot 的值 * 3/2 时,假设是,只有正方形打印,而不是分形。
package fractals;
import java.awt.Color;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
/**
*
* @author Joshua
*/
public class SquarePanel extends JPanel {
static final int[] xPoints = new int[]{270, 270, 810, 810};//Square x coordiantes
static final int[] yPoints = new int[]{92, 632, 632, 92};//Square y coordinates
int firstDotx = 270 + (int) (Math.random() * ((810 - 270) + 1));
int firstDoty = 92 + (int) (Math.random() * ((632 - 92) + 1));
public final static int iterations = 100000;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
g2.drawPolygon(xPoints, yPoints, 4);
g2.drawRect(firstDotx, firstDoty, 0, 0);
for (int i = 0; i <= iterations; i++) {
int midpointX;
int midpointY;
int Vertex = (int) (Math.random() * 5 + 1);
switch (Vertex) {
case 1: //top left corner
g2.setColor(Color.blue);
midpointX = (firstDotx + 270) / 3;
midpointY = (firstDoty + 92) / 3;
g2.drawRect(midpointX, midpointY, 0, 0);
firstDotx = midpointX;
firstDoty = midpointY;
break;
case 2://bottom left
g2.setColor(Color.blue);
midpointX = (firstDotx + 270) / 3;
midpointY = (firstDoty + 632) / 3;
g2.drawRect(midpointX, midpointY, 0, 0);
firstDotx = midpointX;
firstDoty = midpointY;
break;
case 3://bottom right
g2.setColor(Color.blue);
midpointX = (firstDotx + 810) / 3;
midpointY = (firstDoty + 632) / 3;
g2.drawRect(midpointX, midpointY, 0, 0);
firstDotx = midpointX;
firstDoty = midpointY;
break;
case 4://bottom left
g2.setColor(Color.blue);
midpointX = (firstDotx + 810) / 3;
midpointY = (firstDoty + 92) / 3;
g2.drawRect(midpointX, midpointY, 0, 0);
firstDotx = midpointX;
firstDoty = midpointY;
break;
case 5:
g2.setColor(Color.red);
midpointX = (firstDotx + 540) / 3;
midpointY = (firstDoty + 384) / 3;
g2.drawRect(midpointX, midpointY, 0, 0);
firstDotx = midpointX;
firstDoty = midpointY;
break;
default:
break;
}
}
}
}
这是 Frame 的类文件,我打算添加一个带有按钮的 GUI,但我还没有到那里。
package fractals;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
/**
*
* @author Joshua
*/
public class SqaureFrame {
public static void main(String[] args) {
JFrame Sframe = new JFrame("Vicsek Fractal");
Sframe.setSize(1080, 768);
Sframe.setLocation(300, 200);
Sframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
SquarePanel Vicsek = new SquarePanel();
JButton Square = new JButton("Click for the Vicsek Fractal");
Sframe.add(Vicsek);
Sframe.setVisible(true);
}
}
【问题讨论】: