当前位置: 首页 > news >正文

Java程序-谢尔宾斯基三角形递归改进

  • 将所有计算过中点的边存入hashmap中
  • 后续的每条边计算中点先到hashmap当中查询是否存-在存在就不用计算了 直接获取之前算过的中点
  • 边类:两个端点 中点
  • 重写equals方法用两个端点做比较不论方向- hashcode方法也要重写 计算hash值根据端点计算
  • K-V边 对象-K 中点-V
packagelbx628;importjavax.swing.*;importjava.awt.*;importjava.util.HashMap;importjava.util.Objects;importjava.util.Random;publicclassDrawmidextendsJFrame{// 边类:两个端点,用于HashMap的KeypublicclassEdge{Pointp1,p2;//构造publicEdge(Pointp1,Pointp2){this.p1=p1;this.p2=p2;}publicbooleanequals(Objecto){//判断地址是否相同,如果地址相同的话,那就相同//this表示调动equals方法的对象if(this==o){returntrue;}// getClass()获取一个类的字节码对象,注:同一个类的字节码对象是相等的// ||有true则true,具备短路作用,左边为true右边不执行// o == null,对象为null,提高代码的健壮性if(o==null||/*省略了this.*/getClass()!=o.getClass()){returnfalse;}// 强制类型转换,o 强制转换成 e,目的是为了调用子类特有的成员//e:oEdgee=(Edge)o;return(p1.equals(e.p1)&&p2.equals(e.p2))||(p1.equals(e.p2)&&p2.equals(e.p1));}publicinthashCode(){Pointa,b;if(p1.x<p2.x||(p1.x==p2.x&&p1.y<p2.y)){a=p1;b=p2;}else{a=p2;b=p1;}returnObjects.hash(a,b);}}Randomrandom=newRandom();HashMap<Edge,Point>hm=newHashMap<>();// 边→中点 缓存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){Edgee=newEdge(newPoint(x1,y1),newPoint(x2,y2));Pointp=hm.get(e);if(p!=null){returnp;}p=newPoint((x1+x2)/2,(y1+y2)/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;}Pointpm1=getMid(x1,y1,x2,y2);Pointpm2=getMid(x2,y2,x3,y3);Pointpm3=getMid(x1,y1,x3,y3);if(rx>0&&ry>0){pm1.x+=random.nextInt(rx*2)-rx;pm1.y+=random.nextInt(ry*2)-ry;pm2.x+=random.nextInt(rx*2)-rx;pm2.y+=random.nextInt(ry*2)-ry;pm3.x+=random.nextInt(rx*2)-rx;pm3.y+=random.nextInt(ry*2)-ry;}intnr=Math.max(1,rx/2);intny=Math.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();}}
http://www.jsqmd.com/news/1101049/

相关文章:

  • 如何在Windows上轻松管理多显示器亮度:Monitorian完全指南
  • 别再死记公式了!用Python模拟带你直观理解SAR的距离向与方位向分辨率
  • 济宁居家养老服务平台技术架构深度拆解:从应急响应到全周期闭环
  • 小升初家长信息管理系统:从碎片到结构化的知识管理方案
  • 计算机毕业设计之基于Web的水产养殖经营管理系统
  • 深入Sparse4D的CUDA核心:图解deformable_aggregation算子的双线性插值与梯度回传
  • 别再死记硬背了!用Cadence Sigrity搞懂S/Y/Z参数到底有啥用(附实战案例)
  • Cursor Free VIP破解工具:三步实现AI编程助手Pro功能永久免费使用终极指南
  • 记录渗透测试工程师面试一面打靶场记录
  • 表情识别数据集 微表情数据 表情检测
  • NCM格式音乐解锁全攻略:用NcmppGui轻松获得真正的音乐自由
  • 基于微喇智能WKV553-A WiFi6双模无线模组的智能厨电AI解决方案百度AI-DEMO板简易说明
  • 别再被‘理想变压器’骗了!聊聊开关电源里漏感那些事儿(附实测波形分析)
  • MOS管栅极反并二极管,为什么只加速关断?聊聊开关电源里那些‘快’与‘慢’的权衡
  • NTN卫星通信实战:手把手教你理解SSB波束配置与R17协议限制
  • 从ICPC交互题到算法面试:手把手教你用二分+单调性优化解决矩阵第K大问题
  • 智能车主控板原理图保姆级拆解:从电源隔离到电机驱动,手把手教你读懂每个模块
  • 系统分析师考试备考总结
  • 仅限内部技术团队流通:VMware NAT端口转发黄金配置模板(含Windows/Linux双宿主环境、IPv6兼容性补丁及SELinux绕过方案)
  • 别再傻傻分不清了!5分钟搞懂NPN和PNP三极管在传感器接线中的实战区别
  • 6 款 PDF 翻译工具横评:排版 / 公式 / 扫描件全维度实测
  • 别再只盯着IPD流程了!聊聊华为IPD里那些容易被忽略的“使能”与“支撑”流程
  • NI DAQmx对NET Framework兼容层变通方案
  • Strix Halo 性能揭秘,端侧 AI 推理的新势力
  • 观成科技:冰蝎内存马加密流量分析
  • 别再死磕LangChain了!用Dify零代码搞定RAG应用,5分钟搭建你的第一个AI客服
  • OpenCV实战:用matchGMS()函数5分钟搞定SIFT/ORB特征匹配的误匹配剔除
  • 别再傻傻分不清了!5分钟搞懂NPN和PNP三极管在Arduino/STM32开关电路中的实战用法
  • 别再让电路‘唱歌’了:手把手教你用RC滞后补偿搞定负反馈放大电路的自激振荡
  • Linux 3.0 HDMI驱动机制详解