将所有计算过中点的边存入hashmap中后续的每条边计算中点先到hashmap当中查询是否存-在存在就不用计算了 直接获取之前算过的中点边类:两个端点 中点重写equals方法用两个端点做比较不论方向- hashcode方法也要重写 计算hash值根据端点计算K-V边 对象-K 中点-Vpackagelbx628;importjavax.swing.*;importjava.awt.*;importjava.util.HashMap;importjava.util.Objects;importjava.util.Random;publicclassDrawmidextendsJFrame{// 边类两个端点用于HashMap的KeypublicclassEdge{Pointp1,p2;//构造publicEdge(Pointp1,Pointp2){this.p1p1;this.p2p2;}publicbooleanequals(Objecto){//判断地址是否相同如果地址相同的话那就相同//this表示调动equals方法的对象if(thiso){returntrue;}// getClass()获取一个类的字节码对象注同一个类的字节码对象是相等的// ||有true则true具备短路作用左边为true右边不执行// o null对象为null提高代码的健壮性if(onull||/*省略了this.*/getClass()!o.getClass()){returnfalse;}// 强制类型转换o 强制转换成 e,目的是为了调用子类特有的成员//eoEdgee(Edge)o;return(p1.equals(e.p1)p2.equals(e.p2))||(p1.equals(e.p2)p2.equals(e.p1));}publicinthashCode(){Pointa,b;if(p1.xp2.x||(p1.xp2.xp1.yp2.y)){ap1;bp2;}else{ap2;bp1;}returnObjects.hash(a,b);}}RandomrandomnewRandom();HashMapEdge,PointhmnewHashMap();// 边→中点 缓存publicDrawmid(){setTitle(谢尔宾斯基三角形递归);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(800,800);setLocationRelativeTo(null);setVisible(true);}Overridepublicvoidpaint(Graphicsg){super.paint(g);drawmidRect(g,400,50,150,650,700,650,100,150);}publicPointgetMid(intx1,inty1,intx2,inty2){EdgeenewEdge(newPoint(x1,y1),newPoint(x2,y2));Pointphm.get(e);if(p!null){returnp;}pnewPoint((x1x2)/2,(y1y2)/2);hm.put(e,p);returnp;}publicvoiddrawmidRect(Graphicsg,intx1,inty1,intx2,inty2,intx3,inty3,intrx,intry){if(Math.abs(x3-x2)80||Math.abs(y3-y1)80){g.drawLine(x1,y1,x2,y2);g.drawLine(x1,y1,x3,y3);g.drawLine(x2,y2,x3,y3);return;}Pointpm1getMid(x1,y1,x2,y2);Pointpm2getMid(x2,y2,x3,y3);Pointpm3getMid(x1,y1,x3,y3);if(rx0ry0){pm1.xrandom.nextInt(rx*2)-rx;pm1.yrandom.nextInt(ry*2)-ry;pm2.xrandom.nextInt(rx*2)-rx;pm2.yrandom.nextInt(ry*2)-ry;pm3.xrandom.nextInt(rx*2)-rx;pm3.yrandom.nextInt(ry*2)-ry;}intnrMath.max(1,rx/2);intnyMath.max(1,ry/2);drawmidRect(g,x1,y1,pm1.x,pm1.y,pm3.x,pm3.y,nr,ny);drawmidRect(g,pm1.x,pm1.y,x2,y2,pm2.x,pm2.y,nr,ny);drawmidRect(g,pm3.x,pm3.y,pm2.x,pm2.y,x3,y3,nr,ny);drawmidRect(g,pm1.x,pm1.y,pm2.x,pm2.y,pm3.x,pm3.y,nr,ny);}publicstaticvoidmain(String[]args){newDrawmid();}}
Java程序-谢尔宾斯基三角形递归改进
将所有计算过中点的边存入hashmap中后续的每条边计算中点先到hashmap当中查询是否存-在存在就不用计算了 直接获取之前算过的中点边类:两个端点 中点重写equals方法用两个端点做比较不论方向- hashcode方法也要重写 计算hash值根据端点计算K-V边 对象-K 中点-Vpackagelbx628;importjavax.swing.*;importjava.awt.*;importjava.util.HashMap;importjava.util.Objects;importjava.util.Random;publicclassDrawmidextendsJFrame{// 边类两个端点用于HashMap的KeypublicclassEdge{Pointp1,p2;//构造publicEdge(Pointp1,Pointp2){this.p1p1;this.p2p2;}publicbooleanequals(Objecto){//判断地址是否相同如果地址相同的话那就相同//this表示调动equals方法的对象if(thiso){returntrue;}// getClass()获取一个类的字节码对象注同一个类的字节码对象是相等的// ||有true则true具备短路作用左边为true右边不执行// o null对象为null提高代码的健壮性if(onull||/*省略了this.*/getClass()!o.getClass()){returnfalse;}// 强制类型转换o 强制转换成 e,目的是为了调用子类特有的成员//eoEdgee(Edge)o;return(p1.equals(e.p1)p2.equals(e.p2))||(p1.equals(e.p2)p2.equals(e.p1));}publicinthashCode(){Pointa,b;if(p1.xp2.x||(p1.xp2.xp1.yp2.y)){ap1;bp2;}else{ap2;bp1;}returnObjects.hash(a,b);}}RandomrandomnewRandom();HashMapEdge,PointhmnewHashMap();// 边→中点 缓存publicDrawmid(){setTitle(谢尔宾斯基三角形递归);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(800,800);setLocationRelativeTo(null);setVisible(true);}Overridepublicvoidpaint(Graphicsg){super.paint(g);drawmidRect(g,400,50,150,650,700,650,100,150);}publicPointgetMid(intx1,inty1,intx2,inty2){EdgeenewEdge(newPoint(x1,y1),newPoint(x2,y2));Pointphm.get(e);if(p!null){returnp;}pnewPoint((x1x2)/2,(y1y2)/2);hm.put(e,p);returnp;}publicvoiddrawmidRect(Graphicsg,intx1,inty1,intx2,inty2,intx3,inty3,intrx,intry){if(Math.abs(x3-x2)80||Math.abs(y3-y1)80){g.drawLine(x1,y1,x2,y2);g.drawLine(x1,y1,x3,y3);g.drawLine(x2,y2,x3,y3);return;}Pointpm1getMid(x1,y1,x2,y2);Pointpm2getMid(x2,y2,x3,y3);Pointpm3getMid(x1,y1,x3,y3);if(rx0ry0){pm1.xrandom.nextInt(rx*2)-rx;pm1.yrandom.nextInt(ry*2)-ry;pm2.xrandom.nextInt(rx*2)-rx;pm2.yrandom.nextInt(ry*2)-ry;pm3.xrandom.nextInt(rx*2)-rx;pm3.yrandom.nextInt(ry*2)-ry;}intnrMath.max(1,rx/2);intnyMath.max(1,ry/2);drawmidRect(g,x1,y1,pm1.x,pm1.y,pm3.x,pm3.y,nr,ny);drawmidRect(g,pm1.x,pm1.y,x2,y2,pm2.x,pm2.y,nr,ny);drawmidRect(g,pm3.x,pm3.y,pm2.x,pm2.y,x3,y3,nr,ny);drawmidRect(g,pm1.x,pm1.y,pm2.x,pm2.y,pm3.x,pm3.y,nr,ny);}publicstaticvoidmain(String[]args){newDrawmid();}}