科赫雪花java_科赫雪花的Java递归实现

9e5facbbf74bdab5d9d198d825520ff6.png

今天要编写k阶Koch雪花的递归实现(K值需要您手动输入)至于什么是Koch雪花,请自己百度.

首先,考虑如何编写此程序. 当count = 0时java制作雪花,它应该是一个三角形. 这三点由您在开始时确定,以后的更改将基于这三点. 如果不为0,则需要计算相对于三角形的9个点,每边两个点,并计算与该三角形相对应的三角形的第三个顶点.

首先在JFrame中添加一个面板,我们需要在该面板上绘制.

f8b0455b79b2fe1ce4d4afc7a72b4979.png

让我们再次看这张照片. 这张图片描述了从两个点计算另外三个点的过程.

4b67bf2f7825f21c8ba1058b01b2aef5.png

立即开始在面板中绘图:

440293edbdf7c6c74b8d86d294aefac5.png

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);

}

}

c8350d55ff13e6fec531ca8a6cdc7e2b.png

然后将JTextField jta添加到主面板,它输入的数据将传递给number. 因此java制作雪花,为其添加一个侦听器. 如果已经有数据输入,则调用setNumber()函数来设置数字变量.

jta.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

spl.setNumber(Integer.parseInt(jta.getText()));

}

});

整个过程就完成了,剩下的就是简短格式设置.

7998d2c7ae62a1bb6e8f775ad903a89e.png

下面是完整的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);

}

}

效果图:

d777a44034093f90d0a7329e55310675.png

以上是本文的全部内容. 希望对大家的学习有所帮助. 我也希望每个人都支持该脚本主页.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/shouji/article-154221-1.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值