今天要编写k阶Koch雪花的递归实现(K值需要您手动输入)至于什么是Koch雪花,请自己百度.
首先,考虑如何编写此程序. 当count = 0时java制作雪花,它应该是一个三角形. 这三点由您在开始时确定,以后的更改将基于这三点. 如果不为0,则需要计算相对于三角形的9个点,每边两个点,并计算与该三角形相对应的三角形的第三个顶点.
首先在JFrame中添加一个面板,我们需要在该面板上绘制.
让我们再次看这张照片. 这张图片描述了从两个点计算另外三个点的过程.
立即开始在面板中绘图:
static class showpanel extends JPanel{
int number = 0;
public void setNumber(int number) {
this.number = number;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);//画一个简单的panel
int side =(int)(Math.min((int)getWidth(),(int)getHeight())*0.8);
int high =(int)(side*Math.cos(Math.toRadians(30)));
Point p1 = new Point(getWidth() / 2, 10);
Point p2 = new Point(getWidth() / 2 - side / 2, 10 + high);
Point p3 = new Point(getWidth() / 2 + side / 2, 10 + high);
playKochSnowFlake(g, number, p1, p2);
playKochSnowFlake(g, number, p2, p3);
playKochSnowFlake(g, number, p3, p1);
}
现在开始编写递归函数.
public static void playKochSnowFlake(Graphics g,int number,Point p1,Point p2) {
if(number == 0){
g.drawLine(p1.x, p1.y,p2.x, p2.y);
}
else{
int deltaX = p2.x - p1.x;
int deltaY = p2.y - p1.y;
Point x = new Point(p1.x + deltaX / 3, p1.y + deltaY / 3);
Point y = new Point(p1.x + deltaX * 2 / 3, p1.y + deltaY * 2 / 3);
Point z = new Point(
(int)((p1.x + p2.x) / 2 + Math.sin(Math.toRadians(60)) * (p1.y - p2.y) / 3),
(int)((p1.y + p2.y) / 2 + Math.sin(Math.toRadians(60)) * (p2.x - p1.x) / 3));
playKochSnowFlake(g, number - 1, p1, x);
playKochSnowFlake(g, number - 1, x, z);
playKochSnowFlake(g, number - 1, z, y);
playKochSnowFlake(g, number - 1, y, p2);
}
}
然后将JTextField jta添加到主面板,它输入的数据将传递给number. 因此java制作雪花,为其添加一个侦听器. 如果已经有数据输入,则调用setNumber()函数来设置数字变量.
jta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
spl.setNumber(Integer.parseInt(jta.getText()));
}
});
整个过程就完成了,剩下的就是简短格式设置.
下面是完整的Java代码:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class SnowFlake extends JFrame {
private JTextField jta = new JTextField(5);
private showpanel spl = new showpanel();
static class showpanel extends JPanel{
int number = 0;
public void setNumber(int number) {
this.number = number;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);//画一个简单的panel
int side =(int)(Math.min((int)getWidth(),(int)getHeight())*0.8);
int high =(int)(side*Math.cos(Math.toRadians(30)));
Point p1 = new Point(getWidth() / 2, 10);
Point p2 = new Point(getWidth() / 2 - side / 2, 10 + high);
Point p3 = new Point(getWidth() / 2 + side / 2, 10 + high);
playKochSnowFlake(g, number, p1, p2);
playKochSnowFlake(g, number, p2, p3);
playKochSnowFlake(g, number, p3, p1);
}
public static void playKochSnowFlake(Graphics g,int number,Point p1,Point p2) {
if(number == 0){
g.drawLine(p1.x, p1.y,p2.x, p2.y);
}
else{
int deltaX = p2.x - p1.x;
int deltaY = p2.y - p1.y;
Point x = new Point(p1.x + deltaX / 3, p1.y + deltaY / 3);
Point y = new Point(p1.x + deltaX * 2 / 3, p1.y + deltaY * 2 / 3);
Point z = new Point(
(int)((p1.x + p2.x) / 2 + Math.sin(Math.toRadians(60)) * (p1.y - p2.y) / 3),
(int)((p1.y + p2.y) / 2 + Math.sin(Math.toRadians(60)) * (p2.x - p1.x) / 3));
playKochSnowFlake(g, number - 1, p1, x);
playKochSnowFlake(g, number - 1, x, z);
playKochSnowFlake(g, number - 1, z, y);
playKochSnowFlake(g, number - 1, y, p2);
}
}
}
public SnowFlake() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(new JLabel("Please input the number"));
panel.add(jta);
add(spl,BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
jta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
spl.setNumber(Integer.parseInt(jta.getText()));
}
});
}
public static void main(String args[]) {
SnowFlake snowFlake = new SnowFlake();
snowFlake.setSize(300, 300);
snowFlake.setTitle("SnowFlake");
snowFlake.setLocationRelativeTo(null);
snowFlake.setVisible(true);
}
}
效果图:
以上是本文的全部内容. 希望对大家的学习有所帮助. 我也希望每个人都支持该脚本主页.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-154221-1.html