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
return temp; } /* * 下面是根据两个点的ID,在边集中找寻两点组成的边 * 返回的是边对象 * 若没找到,则返回空 */ public static MyEdge getEdge(int begin,int end,Map
* 下面这个方法是用来判断点在当前直线的左边还是右边 * 当然当前直线是有方向的
* 若点在直线的右边,则返回false * 否则返回true */ public boolean isOnLeft(MyPoint p,Map
* 下面这个方法是将边的方向翻转 */
public void turnBeginAndEnd() { int temp=this.begin; this.begin=this.end; this.end=temp; } /*
* 下面这个方法是找到当前边的左边最优点 * 采用外接圆的方法
* 如果该边有左边最优点则返回之 * 否则返回空 */
public MyPoint findGoodPointByCircle(Map
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
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于狄洛尼三角网生成算法的源代码在线全文阅读。
相关推荐: