本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下
三角形分形山脉原理
原型图
如图,这是三角形分形山脉的一个原型图。首先我们让x1、x2、x3三个点组成的三角形的各条边的中点mid1、mid2、mid3可以在大三角形内部画一个三角形,这时就会有四个小三角形,那么我们对这四个小三角形做同样的操作,如此就可以画出雏形了。接下来我们只需要对内部每个需要连线三角形的y坐标做相关操作就可以了。
效果图
山脉分形之前的问题
重写equals与hasCode方法
重写的原因
就像下面这张图所展示的效果一样,其中出现了一个三角形分形两边的情况,导致下面这张图没有上面的图看上去更有山脉的感觉。
出现这种情况是因为其中一条边的中点向两边波动时,它的两个顶点不同方向连线后留下的大片空白区域导致的(见上图)。所以我们要想办法记录这条边的中点,使它们只记录它的一个中点,这样我们就能解决大片空白区域的问题了。
equals与hasCode
这里我们用到了hashMap,那么就牵涉到hashMap存储的问题。如图,hashMap在存储对象数据时会通过它的hasCode与哈希函数计算该对象的存储位置,如果这个位置没有存储数据,则直接存储这个对象;如果存在有对象,我们则需要比较他们的hasCode来比较他们是否是同一个对象,如果是true已经存在这个对象的情况下,那么我们就不操作,如果是false还没有存入这个对象,我们则在这个存储位置的后面将这个对象链接进来就好了。综上,我们要自己建立一个数据类型来记录这条边的两个点的x、y坐标及波动后中点的y坐标,所以我们要重写equals与hasCode方法。
三角形山脉代码
import java.awt.Color; import java.awt.Graphics; import java.util.HashMap; import java.util.Map; import java.util.Objects; import javax.swing.JFrame; public class Recursive extends JFrame{ private int[] xLabel; private int[] yLabel; Map
三角形山脉监听器
import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class TriangleListener implements MouseListener { int x1, x2, x3, y1, y2, y3; int count = 0; Graphics g; @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub g.drawOval(e.getX() - 4, e.getY() - 4, 8, 8); if (count == 0) { x1 = e.getX(); y1 = e.getY(); count++; } else if (count == 1) { x2 = e.getX(); y2 = e.getY(); count++; g.drawLine(x1, y1, x2, y2); } else { x3 = e.getX(); y3 = e.getY(); g.drawLine(x1, y1, x3, y3); g.drawLine(x2, y2, x3, y3); count = 0; Triangle triangle = new Triangle(); triangle.recursion(x1, y1, x2, y2, x3, y3, g, 9, 800); } } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持0133技术站。