基于狄洛尼三角网生成算法的源代码
更新时间:2024-06-24 21:01:02 阅读量: 综合文库 文档下载
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
{
MyPoint goodPoint=null;
for(int i=1;i<=pointSet.size();i++) { MyPoint activePoint=pointSet.get(i);
if(this.isOnLeft(activePoint, pointSet))//判断当前活动点是不是在直线的左边 { //在直线左边 double minCos=this.getCos(activePoint, pointSet); int good=i; for(int j=i+1;j<=pointSet.size();j++)
{//对当前活动边的左边点进行空圆准则检验
if(this.isOnLeft(pointSet.get(j), pointSet))//判断当前活动点是不是 { double cos=this.getCos(pointSet.get(j), pointSet); if(cos 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); newEdge2=new //生成的第二边 MyEdge 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; } /* * 此方法是将某一点与当前边的顶点角的余弦值返回 */ private double getCos(MyPoint p,Map } } import java.util.*; import java.io.*; public class MyPoint { public static int count=0; public int id; public int x; public int y; private String info; public MyPoint(int x,int y) { this.id=++count; this.x=x; this.y=y; } public void setInfo(String info) { this.info=info; } public String getInfo() { return this.info; } public double distance(int x,int y) { int tempx=(this.x-x)*(this.x-x); int tempy=(this.y-y)*(this.y-y); return Math.sqrt((tempx+tempy)); } public double distance(MyPoint p) { int tempx=(this.x-p.x)*(this.x-p.x); int tempy=(this.y-p.y)*(this.y-p.y); return Math.sqrt((tempx+tempy)); } /* * 下面这个方法是找寻主叫点在点集中与之最近的点 * 返回的是与之最近点的引用 */ public MyPoint getMinDistancePoint(Map *下面的方法是将点集中的点全部输出到文件中 */ public static boolean savePoints(Map * 下面的方法是将文件中的点加载到内存中 */ public static boolean readPoints(Map { boolean flag=false; File file=new File(filename); try { FileInputStream in=new FileInputStream(file); Scanner fromfile=new Scanner(in); while(fromfile.hasNextInt()) { fromfile.nextInt(); MyPoint point=new MyPoint(fromfile.nextInt(),fromfile.nextInt()); pointSet.put(point.id, point); } flag=true; in.close(); }catch(IOException e) { return flag; } return flag; } } import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class MyTin extends JFrame { public static void main(String[] agrs) { MyTin tin=new MyTin(\三角网的生成\ } private MyPanel show; private JButton begin; public MyTin(String title) { super(title); this.setSize(500, 580); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().setLayout(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.show=new MyPanel(); this.show.setBounds(0,0,this.getWidth(),this.getHeight()-80); this.begin=new JButton(\开始绘制\ this.begin.addActionListener(new MyButtonMonitor()); this.begin.setBounds(this.getWidth()/2-70, this.getHeight()-75,100,30); this.getContentPane().add(show); this.getContentPane().add(begin); //this.pack(); this.setVisible(true); } public class MyPanel extends JPanel { public HashMap g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 0, 500, 500); g.setColor(Color.red); for(int i=1;i<=this.pointSet.size();i++) { g.fillOval(this.pointSet.get(i).x-2,this.pointSet.get(i).y-2,5,5); } if(!edgeSet.isEmpty()) { for(int i=1;i<=this.edgeSet.size();i++) { this.edgeSet.get(i).draw(g, pointSet); } } } class MyMouseMonitor implements MouseListener { public void mouseClicked(MouseEvent e) { Point temp=e.getPoint(); MyPoint p=new MyPoint(temp.x,temp.y); pointSet.put(p.id,p); repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } } class MyButtonMonitor implements ActionListener { HashMap * 点击“开始绘制”按钮后就会开始绘制 * 这里假定以点集中的第一个点为初始点进行绘制 */ MyPoint firstPoint=pointSet.get(1); MyPoint secondPoint=firstPoint.getMinDistancePoint(pointSet);//找距初始点最近的点 MyEdge firstEdge=new MyEdge(firstPoint,secondPoint);//生成的第一个边 edgeSet.put(firstEdge.id, firstEdge);//将第一个边加入到边集中 MyTin.this.show.repaint(); int i=1; while(!edgeSet.isEmpty()) { MyEdge activeEdge=null; for( ;i<=edgeSet.size();i++) { activeEdge=edgeSet.get(i); if(activeEdge.getUseCount()<2) break; } if(i>edgeSet.size())break; //这是采用外接圆的方法找最优点 // MyPoint goodPoint=activeEdge.findGoodPointByCircle(pointSet, edgeSet, triangleSet); //这是采用余弦值的方法找最优点 MyPoint goodPoint=activeEdge.findGoodPointByAngle(pointSet, edgeSet, triangleSet); if(goodPoint==null) activeEdge.addUseCount(); } MyTin.this.show.repaint(); } } }import java.util.*; import java.awt.*; public class MyTriangle { public static int count=0; public int id; private int[] pID;//记录三角形中的点,按顺时针顺序排列 private int[] eID;//记录三角形中的边,按顺时针顺序排列 /* * 下面这个构造方法是简单三角形构造法,其中没有边的信息 * 可以用它来做判断 * 建议最后生成的三角形不要用此构造方法 */ public MyTriangle(int p1ID,int p2ID,int p3ID) { this.pID=new int[3]; this.pID[0]=p1ID; this.pID[1]=p2ID; this.pID[2]=p3ID; } /* * 注意此构造方法中的三点要满足顺时针的顺序 */ public MyTriangle(MyPoint p1,MyPoint p2,MyPoint p3,Map *此构造方法也是根据点来确定三角形 *但是传入的点是按照顺时针的顺序传入点的ID号 */ public MyTriangle(int p1ID,int p2ID,int p3ID,Map * 下面这个构造方法是按照边对象来构造三角形的 * 注意,边的顺序也要是按照顺时针的顺序进入 */ public MyTriangle(MyEdge e1,MyEdge e2,MyEdge e3,Map this.eID[1]=e2ID; this.eID[2]=e3ID; } /* * 下面这个方法是私有方法 * 它的作用是找到三角形的外界圆圆心坐标 */ private Point findCenter(Map * 下面这个函数是判断一个自定义点是否在三角形的外接圆内 * 若在圆内,则返回true * 否则返回false */ public boolean isInCircle(MyPoint p,Map } } /* * 下面这个方法是按顺时针顺序得到构成三角形的三个顶点 * 三个顶点将存储在一个数组中返回 */ public MyPoint[] getPoints(Map * 下面这个方法是按照顺时针的顺序得到构成这个三角形的三边 * 三条边存在一个一维数组中返回 */ public MyEdge[] getPoints(Map
正在阅读:
基于狄洛尼三角网生成算法的源代码06-24
某某的自述作文300字6篇01-04
当前世界经济发展形势下我国面临的机遇和挑战(形势与政策课论文03-04
超级经典老歌歌词大全非常给力04-25
重庆市第一中学2017-2018学年高二下学期期末考试文科综合历史试题 Word版含解析03-16
高中力学的解题思路及技巧分析03-01
河南省2012-2016近五年中考英语试题(word版有答案)05-01
动力配套题10-09
绿化合同书(范本)09-01
- 人教新课标必修4 Unit2 Working the land名师导航
- 毕业生“校漂族”大行其道 - 0
- 江苏各市中考作文题出炉 - 0
- 暑期精品班 - 三角形 - 图文
- 情人节送什么礼物好??超强礼物已抵达
- 工程项目管理制度1
- 第四次业务学习 2016
- 会计要素与会计科目
- 欠发达地区小企业会计准则运用问题研究
- 一级锅炉水G4题库
- BBD双进双出筒式磨煤机安装使用说明书 SM-1
- 初一数学有理数教案
- 渝北区房地产评估市场调研报告
- iWebMall 数据字典
- 2018年小学入学教育工作计划
- 计量专业实务与案例分析 - 模拟题三 - 2013年版
- 启示录讲义
- 路基灰土改良(方案)
- 人行反洗钱岗位准入培训测试题集
- 2015电大《学前儿童发展心理学》期末试题及答案
- 洛尼
- 三角网
- 源代码
- 算法
- 生成
- 基于
- 会展项目管理考试复习资料
- 东北红豆杉项目可行性研究报告 - 图文
- 全国国土资源标准化技术委员会章程
- 上海交通大学管理学院《金融工程学》习题
- 学习全国劳模王顺友有感
- 房地产案名分析
- TMS320C6678快速使用说明 - 图文
- 中国传媒大学高级研究生课程进修班产业经济学专业全国班(辽宁省
- 高考化学 元素周期表元素周期律必备专题复习
- 风机选型导则
- 江西省吉安县二中2013届高三4月第四次周考试卷 理科数学 Word版
- 贵州主体分部工程质量评估报告
- 基于PLC的煤矿空压机控制系统设计
- 白酒操作规程
- 电气设备预防性试验规程596
- java入门学习1
- 《地球与地图》专题练习
- 江苏银行调查报告借款人提供内容
- CDMA室内覆盖建设协议书(机房+室分建设)
- (初稿)近期网格化平台建设工作方案2