77范文网 - 专业文章范例文档资料分享平台

基于狄洛尼三角网生成算法的源代码

来源:网络收集 时间:2019-03-22 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

import java.util.*; import java.awt.*; public class MyEdge { public static int count=0; public int id; private int begin; private int end; private int useCount; public MyEdge(int begin,int end) { this.id=++count; this.begin=begin; this.end=end; this.useCount=0; } public MyEdge(MyPoint begin,MyPoint end) { this.id=++count; this.begin=begin.id; this.end=end.id; this.useCount=0; } public int getUseCount() { return this.useCount; } public void addUseCount() { this.useCount++; } /* * 下面这两个方法是得到边的来个顶点 * 若集合中没有指定的对象则返回空值 */ public MyPoint getBeginPoint(Map pointSet) { MyPoint temp=pointSet.get(this.begin); return temp; } public MyPoint getEndPoint(Map pointSet) { MyPoint temp=pointSet.get(this.end);

return temp; } /* * 下面是根据两个点的ID,在边集中找寻两点组成的边 * 返回的是边对象 * 若没找到,则返回空 */ public static MyEdge getEdge(int begin,int end,Map edgeSet) { MyEdge temp=null; for(int i=1;i<=edgeSet.size();i++) { temp=edgeSet.get(i); if(temp.begin==begin&&temp.end==end) break; } return temp; } /* * 下面是根据两个点对象,在边集中找寻两点组成的边 * 返回的是边对象 * 若没找到,则返回空 */ public static MyEdge getEdge(MyPoint begin,MyPoint end,Map edgeSet) { MyEdge temp=null; for(int i=1;i<=edgeSet.size();i++) { temp=edgeSet.get(i); if(temp.begin==begin.id&&temp.end==end.id) break; } return temp; } public void draw(Graphics g,Map pointSet) { MyPoint begin=pointSet.get(this.begin); MyPoint end=pointSet.get(this.end); Color c=g.getColor(); g.setColor(Color.blue); g.drawLine(begin.x, begin.y, end.x,end.y ); g.setColor(c); } /*

* 下面这个方法是用来判断点在当前直线的左边还是右边 * 当然当前直线是有方向的

* 若点在直线的右边,则返回false * 否则返回true */ public boolean isOnLeft(MyPoint p,Map pointSet) { boolean flag=false; MyPoint begin=pointSet.get(this.begin); MyPoint end=pointSet.get(this.end); int Line=(begin.y-end.y)*p.x+(end.x-begin.x)*p.y-end.x*begin.y+end.y*begin.x; if(Line<0) flag=true; return flag; } /* * 比较两个边是否相等 * 这个方法排除了边的方向性 * 只要空间上是一条边 * 就是同一条边即相等 */ public boolean equals(Object edge) { boolean flag=false; if(this.end==((MyEdge)edge).begin&&this.begin==((MyEdge)edge).end||this.begin==((MyEdge)edge).begin&&this.end==((MyEdge)edge).end) flag=true; return flag; } /*

* 下面这个方法是将边的方向翻转 */

public void turnBeginAndEnd() { int temp=this.begin; this.begin=this.end; this.end=temp; } /*

* 下面这个方法是找到当前边的左边最优点 * 采用外接圆的方法

* 如果该边有左边最优点则返回之 * 否则返回空 */

public MyPoint findGoodPointByCircle(Map pointSet,Map edgeSet,Map triangleSet) { MyPoint goodPoint=null; for(int i=1;i<=pointSet.size();i++) { MyPoint activePoint=pointSet.get(i);

if(this.isOnLeft(activePoint, pointSet))//判断当前活动点是不是在直线的左边 { //在直线左边 MyTriangle activeTriangle=new MyTriangle(this.begin,i,this.end); int good=i; for(int j=i+1;j<=pointSet.size();j++)

{//对当前活动边的左边点进行空圆准则检验

if(this.isOnLeft(pointSet.get(j), pointSet))//判断当前活动点是不是 { if(activeTriangle.isInCircle(pointSet.get(j), pointSet)) { activeTriangle=new MyTriangle(this.begin,j,this.end); good=j; } } }

goodPoint=pointSet.get(good); /*

* 下面是生成边后的后期处理 */

newEdge1=new

在直线的左边

//生成的第一边 MyEdge

MyEdge(this.getBeginPoint(pointSet),goodPoint); newEdge1.addUseCount(); if(edgeSet.containsValue(newEdge1)) { MyEdge.count--; for(int k=1;k<=edgeSet.size();k++) { if(edgeSet.get(k).equals(newEdge1)) { edgeSet.get(k).addUseCount(); break; }

} }else

edgeSet.put(newEdge1.id, newEdge1);

//生成的第二边 MyEdge newEdge2=new MyEdge(goodPoint,this.getEndPoint(pointSet)); newEdge2.addUseCount(); if(edgeSet.containsValue(newEdge2)) { MyEdge.count--; for(int k=1;k<=edgeSet.size();k++) { if(edgeSet.get(k).equals(newEdge2)) { edgeSet.get(k).addUseCount(); break; } } }else edgeSet.put(newEdge2.id, newEdge2); //对第三边进行处理 this.addUseCount(); this.turnBeginAndEnd(); //生成三角形,并加入到三角形集合中 MyTriangle newTriangle=new MyTriangle(this.getBeginPoint(pointSet),goodPoint,this.getEndPoint(pointSet),edgeSet); triangleSet.put(newTriangle.id, newTriangle); break; } } return goodPoint; } /* * 下面是另一种找最优点的方法 * 基于角度的方法 * 用余弦值最小的那个点 */ public MyPoint findGoodPointByAngle(Map pointSet,Map edgeSet,Map triangleSet)

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于狄洛尼三角网生成算法的源代码在线全文阅读。

基于狄洛尼三角网生成算法的源代码.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/536611.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: