今晚做了这样的一个任务:用随机数在画图板里面生成四个点,然后选出其中的三个点组成一个三角形,把三角形的三个顶点标为1、2、3,另一个点标为4,把4点随机与1、2、3三个点中一个点进行连接,取连线的中点,把中点作为4,再重复随机与1、2、3点中的一个点连接……一直重复
并且把点用画图板展现出来。
以下是代码部分:
1、生成画图板,并往里面加按钮和监听器
package draw;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import java.awt.Graphics;
import javax.swing.JButton;
public class DrawUI {
public void showUI(){
JFrame drawFrame=new JFrame();
drawFrame.setTitle("画图板");
drawFrame.setSize(1500, 800);
drawFrame.setLocationRelativeTo(null);
drawFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
drawFrame.setLayout(new FlowLayout());
DrawListener drawL = new DrawListener();
drawFrame.addMouseListener(drawL);
JButton lineBtn = new JButton("直线");
drawFrame.add(lineBtn);
lineBtn.addActionListener(drawL);
JButton cyBtn = new JButton("圆");
drawFrame.add(cyBtn);
cyBtn.addActionListener(drawL);
JButton nameBtn = new JButton("名字");
drawFrame.add(nameBtn);
nameBtn.addActionListener(drawL);
JButton recBtn = new JButton ("矩形");
drawFrame.add(recBtn);
recBtn.addActionListener(drawL);
JButton picBtn = new JButton("图形");
drawFrame.add(picBtn);
picBtn.addActionListener(drawL);
JButton ranBtn = new JButton("随机数");
drawFrame.add(ranBtn);
ranBtn.addActionListener(drawL);
JButton siBtn = new JButton("四个点");
drawFrame.add(siBtn);
siBtn.addActionListener(drawL);
drawFrame.setVisible(true);
Graphics g=drawFrame.getGraphics();
drawL.setGraphics(g);
}
public static void main(String[]args){
DrawUI ui = new DrawUI();
ui.showUI();
}
}
2、定义数组存放点的坐标,并生成随机数放在数组里面
int X1[] = {0,0,0,0},Y1[] = {0,0,0,0};
/
/
/
/
else if("四个点".equals(type)){
int i=0;
int a;
int b;
for(;i<4;i+=1)
{
a=(int)(1+Math.random()*(800-1+1));
b=(int)(1+Math.random()*(800-1+1));
X1[i]=a;
Y1[i]=b;
System.out.println(a+" "+b);
Color color=new Color(233,23,242);
g.setColor(color);
g.drawLine(X1[i], Y1[i], X1[i], Y1[i]);
}
g.drawLine(X1[2], Y1[2], X1[1], Y1[1]);
g.drawLine(X1[2], Y1[2], X1[3], Y1[3]);
g.drawLine(X1[1], Y1[1], X1[3], Y1[3]);
}
else if("随机数".equals(type)){
for(int n=1;n<100000;n+=1){
int c;
c=(int)(1+Math.random()*(3-1+1));
//System.out.println(c);
if(c==1){
X1[0]=(X1[0]+X1[1])/2;
Y1[0]=(Y1[0]+Y1[1])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//中点连线
//g.drawLine(X1[0], Y1[0],X1[1], Y1[1]);
}
if(c==2){
X1[0]=(X1[0]+X1[2])/2;
Y1[0]=(Y1[0]+Y1[2])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//g.drawLine(X1[0], Y1[0],X1[2], Y1[2]);
}
if(c==3){
X1[0]=(X1[0]+X1[3])/2;
Y1[0]=(Y1[0]+Y1[3])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//g.drawLine(X1[0], Y1[0],X1[3], Y1[3]);
}
}
}
我很懒也很忙,下面送上上面代码区的完整代码。。。。
package draw;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Graphics;
import java.awt.Color;
public class DrawListener implements MouseListener,ActionListener{
public Graphics g;
String type = "";
int x1,x2,y1,y2;
int X1[] = {0,0,0,0},Y1[] = {0,0,0,0};
public void actionPerformed(ActionEvent e){
String action=e.getActionCommand();
type=action;
}
public void setGraphics(Graphics arg){
g=arg;
}
public void mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
}
public void mouseReleased(MouseEvent e){
x2=e.getX();
y2=e.getY();
//画直线
if("直线".equals(type)){
g.drawLine(x1, y1, x2, y2);}
//画圆
else if ("圆".equals(type)){
g.drawOval(x1, y1, 200, 200);
}
else if ("名字".equals(type)){
Color c=new Color(100,20,240);
g.setColor(c);
g.drawLine(x1, y1, x1+100, y1);
g.drawLine(x1+50, y1, x1+50, y1-50);
g.drawLine(x1+50, y1, x1+50, y1+150);
g.drawLine(x1+50, y1, x1-20, y1+120);
g.drawLine(x1+50, y1, x1+120, y1+120);
g.drawLine(x1+140, y1-50, x1+210, y1-50);
g.drawLine(x1+210, y1-50,x1+165,y1);
g.drawLine(x1+165,y1,x1+270,y1);
g.drawLine(x1+270,y1,x1+190,y1+150);
g.drawLine(x1+190,y1+150,x1+180,y1+140);
g.drawLine(x1+190,y1,x1+155,y1+95);
g.drawLine(x1+220,y1,x1+175,y1+95);
}
else if ("矩形".equals(type)){
g.drawLine(x1, y1, x2, y2);
}
else if("四个点".equals(type)){
int i=0;
int a;
int b;
for(;i<4;i+=1)
{
a=(int)(1+Math.random()*(800-1+1));
b=(int)(1+Math.random()*(800-1+1));
X1[i]=a;
Y1[i]=b;
System.out.println(a+" "+b);
Color color=new Color(233,23,242);
g.setColor(color);
g.drawLine(X1[i], Y1[i], X1[i], Y1[i]);
}
g.drawLine(X1[2], Y1[2], X1[1], Y1[1]);
g.drawLine(X1[2], Y1[2], X1[3], Y1[3]);
g.drawLine(X1[1], Y1[1], X1[3], Y1[3]);
}
else if("随机数".equals(type)){
for(int n=1;n<100000;n+=1){
int c;
c=(int)(1+Math.random()*(3-1+1));
//System.out.println(c);
if(c==1){
X1[0]=(X1[0]+X1[1])/2;
Y1[0]=(Y1[0]+Y1[1])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//中点连线
//g.drawLine(X1[0], Y1[0],X1[1], Y1[1]);
}
if(c==2){
X1[0]=(X1[0]+X1[2])/2;
Y1[0]=(Y1[0]+Y1[2])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//g.drawLine(X1[0], Y1[0],X1[2], Y1[2]);
}
if(c==3){
X1[0]=(X1[0]+X1[3])/2;
Y1[0]=(Y1[0]+Y1[3])/2;
g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
//System.out.println(X1[0]+" "+Y1[0]);
//g.drawLine(X1[0], Y1[0],X1[3], Y1[3]);
}
}
}
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
展示一下最后效果
最初我们做的时候是把中点和其他点连成了线。。。很low,点了n次才出现这样子的图:
然后直接加了 循环,让它自己搞了几千次,成了这鬼样子,有点奇葩,它变得很有规则
然后我们不再输出线,直接输出几万个点,就变得更加神奇了:
它其实展现出一种规律:当只有一个线、一个点时候,我们看不出什么东西,他们都是很普通的很无聊的,等到几千几万个弄出来后,变化就很大了。
收获
今晚最大的收获其实是胡哥最后点出来的东西:
这正是一种混沌:
举几个例子:
假如在一场大型演唱会的时候,发生了火灾,我们人类,会有很大的可能发生踩踏事件。
而大海里的鱼群,在有大鱼捕食时,那么多的鱼,他们能够完美的躲避,鱼群内部不会发生碰撞摩擦,它们是怎样做到的。
我们看蚂蚁的时候,感觉它们只是一些低级生物,没有智慧,没有想法。但是,当无数个蚂蚁聚集在一起的时候,它们就展现出来了超乎我们想象的智慧:它们能够有序的搬运食物,对抗敌人。
草原上的兔子,数量在上升到一定阶段后会下降,这些数量的关系能不能用一些方法表达出来?
面对这些问题,我现在还说不出原因和解决方案。。。。
这个世界上其实有很多东西和计算机很相似,计算机的神奇有时候在于它能模拟到现实世界。就比如这个代码,它慢慢的就展现出让人很舒适的美。
要多拓展这些领域,继续学习