您现在的位置: 论文资源库 >> 论文资源 >> 理科论文 >> 地理地质 >> 正文

多边形裁剪报告-5151doc

多边形裁剪报告
作者:张占阳 文章来源:文书文秘网 点击数: 更新时间:2010-4-5

多边形裁剪报告

(长安大学地测学院地理信息系统,陕西西安 710054)

实验目的:  

实现简单多边形的裁剪;在简单图形的基础上建立复杂的多边形并实现对其的裁剪功能;最后实现有孔多边形的裁剪。  

实验要求:  

以一个多边形为主视图区,求出其他多边形与主视图区的交叠区域并显示落在主视图区的部分;若主视图区含有内孔,则显示内孔以外主视图区以内的部分。  

实验思想:  

思想一;点位于多边形内部的思想:  

作出多边形的最大内接矩形和最小外接矩形(设最大内接矩形角点坐标为(xl,yd),(xr,yd),(xl,yu),(xr,yu),最小外接矩形四个角点坐标为(xl’,yd’),(xr’,yd’),(xl’,yu’),(xr’,yu’)),如果坐标为(x,y)的点满足xl<=x<=xr并且yd<=y<=yu,则该点一定位于内矩形内,位于内矩形内的点一定位于多边形内部;如果坐标(x,y)的点满足(x<xl’或x>xr)’或者是(y<yd’或y>yu’),则该点一定位于外矩形外,位于外矩形外的点一定位于多边形外部;对于位于内外矩形之间的点,只需做平行于X轴或Y轴的直线,求出直线与多边形某边的交点,若该点位于两交点之间则证明改点位于多边形内部,否则位于多边形外部。  

思想二;直线与多边形的交点:  

若多边形的某个点位于主视图多边形内部,则作出当前点到下一点的线段(x0+(x1-x0)*t1,y0+(y1-y0)*t1),然后循环扫描主视图多边形的各个边(xx0+(xx1-xx0)*t2,yy0+(yy1-yy0)*t2),求出当前线段与主视图多边形的各个边的交点,若求得的(t1>=0且t1<=1)并且(t2>=0且t2<=1),则求得的交点位于多边形内部,否则位于外部。若多边形的某个顶点位于主视图多边形外部,也按上述步骤进行循环扫描。最后将求得的位于主视图多边形内部的点以及与主视图多边形的交点存储在实现设置的点类数组中并予以输出保存。  

思想三;多边形内部含有孔:  

求出位于主视图多边形内部的点后,再循环扫描这些点,求得哪些点位于孔内,哪些点位于孔外,若某个点位于孔外,则作出当前点到下一点的线段(x0+(x1-x0)*t1,y0+(y1-y0)*t1),然后循环扫描孔多边形的各个边(xx0+(xx1-xx0)*t2,yy0+(yy1-yy0)*t2),求出当前线段与孔多边形的各个边的交点,若求得的(t1>=0且t1<=1)并且(t2>=0且t2<=1),则求得当前线段与孔的交点。若位于主视图多边形内部的点位于多边形外部,也按上述步骤进行循环扫描。最后将求得的位于孔外的点以及与孔的交点存储在事先设置的点类数组中并予以输出保存。  

数据结构设置:  

点类:点X坐标,点Y坐标。  

多边形类:多边形编号areacode,主次多边形编号zhucicode,构成多边形的点X,点Y。

Int  areacode  

Int  zhucicode  

Double   X  

Double   Y  

说明:areacode为每个多边形编号。  

      zhucicode=1时代表主视图区,即主多边形。  

      zhucicode=2时代表各个多边形,即次多边形。  

      zhucicode=3时代表主视图区内的小孔,即孔的形状。  

如在读取的文档中设置的数据形式为:  

1,1,166.66,158.88  

1,1,236.53,110.08  

1,1,366.66,88.88  

1,1,144.166,388.36  

1,1,112.45,322.46  

1,1,148.84,96.88  

1,1,166.66,158.88  

2,2,36.45,146.64  

2,2,176.67,116.89  

2,2,211.11,168.32  

2,2,188.68,298.42  

2,2,144.27,366.89  

2,2,135.12,221.46  

2,2,36.45,146.64  

3,3,180.88,176.66  

3,3,210.36,180.54  

3,3,240.66,230.36  

3,3,199.84,283.66  

3,3,146.76,296.66  

3,3,180.88,176.66  

-9999,0,0,0  

实验步骤:  

1;多边形数据读入。  

用FILE类型指针打开“多边形数据.txt”,然后逐行读入数据,每行的数据格式都为(INT型的多边形号,INT型的主次多边形号,构成该多边形的第一个Double型顶点X,Double型顶点Y),然后将每行读入的数据存储在多边形类Carea的一个对象中,同时再将该对象存入事先在Doc中定义的一个多边形类数组array_area中,如此循环,直到读入的多边形号为-9999为止。  

如图:  

                                        

2;多边形数据显示。  

数据读入完毕后,即可将存储在多边形类数组array_area的对象逐一取出,其基本过程为:依次读取每个对象,若当前多边形编号=下一个多边形编号(array_area[i].areacode==array_area[i+1]areacode),即为同一个多边形时,并且主次多边形编号array_area[i].zhucicode==1时(代表主视图多边形),则连接顶点i与i+1,最后画出作为主视图区的多边形。对于次多边形编号array_area[i].zhucicode==2或3(分别代表其余多边形和主多边形内的孔状多边形),也按上述步骤进行循环处理。  

如图:  

      

3;无空多边形裁剪。  

依次顺时针扫描次多边形(即副多边形)的各个顶点,求出哪些点位于主视图区多边形的内部,若当前点i位于其内部,则将当前点i存入事先设置的点类数组overlay_dian中,而后求出当前点i与下一点i+1的线段与主视图区多边形某一边的交点,再将求出的交点存入overlay_dian中;若当前点i与下一点i+1构成的线段没有与主视图区多边形的某边相交,则判断下一点i+1是否位于主多边形内部,这样依次循环判断,即可求出其余多边形哪些点位于主多边形内部以及与主多边形的交点。所有求出的这些点都被实时的存入到了事先设置的点类数组overlay_dian中。  

如图:  

      

4;有空多边形裁剪。  

求出位于主视图区多边形内部的所有点后,再依次顺时针扫描overlay_dian数组,判断哪些点位于主多边形孔内(即满足array_area[i].areacode==array_area[i+1].areacode并且array_dian[i].zhucicode==3的点构成的多边形),将位于孔外的点实时存入到事先定义的点类要素数组overlay_kongdian中,并求出当前点与下一点构成的线段与孔多边形某边的交点,并将求得的交点也存入到overlay_kdian中;若果当前点与下一点构成的线段与孔多边形无交点,则判断当前点的下一点是否位于孔内,这样依次循环判断,即可求得所有位于主多边形内部并且处于主多边形内小孔外的所有点。所有这些点都将实时的被存储到事先设置的点类数组overlay_kdian中。  

如图:  

      

5;无空多边形数据输出。  

依次扫描overlay_dian数组,运用FILE类型指针将存储在其中的(即位于无空多边形内部的点)所有点按顺序逐一存放到“无空多边形数据输出.txt”中并予以保存。  

6;有空多边形数据输出。  

依次扫描overlay_kdian数组,运用FILE类型指针将存储在其中的(即位于有空多边形内部的点)所有点按顺序逐一存放到“有空多边形数据输出.txt”中并予以保存 。

...本文来自[论文资源库]lunwen.5151doc.com收集与整理,感谢原作者。
本文版权归原作者所有,如需转载或摘录请注明出处:论文资源库 http://lunwen.5151doc.com

论文录入:5151doc    责任编辑:5151doc 
  • 上一篇论文:

  • 下一篇论文:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    | 设为首页 | 加入收藏 | 联系站长 | 在线投稿 | 版权申明 | 网站登陆 |