


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
再经典不过的算法了://功能:判断点是否在多边形内//方法:求解通过该点的水平线与多边形各边的交点//结论:单边交点为奇数,成立!//参数://POINTp指定的某个点//LPPOINTptPolygon多边形的各个顶点坐标(首末点可以不一致)//intnCount多边形定点的个数BOOLPtInPolygon(POINTp,LPPOINTptPolygon,intnCount){intnCross=0;for(inti=0;i<nCount;i++){POINTp1=ptPolygon[i];POINTp2=ptPolygon[(i+1)%nCount];//求解y=p.y与p1p2的交点if(p1.y==p2.y)//p1p2与y=p0.y平行continue;if(p.y<min(p1.y,p2.y))//交点在p1p2延长线上continue;if(p.y>=max(p1.y,p2.y))//交点在p1p2延长线上continue;//求交点的X坐标--------------------------------------------------------------doublex=(double)(p.y-p1.y)*(double)(p2.x-p1.x)/(double)(p2.y-p1.y)+p1.x;if(x>p.x)nCross++;//只统计单边交点}//单边交点为偶数,点在多边形之外---return(nCross%2==1);}1.叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断结果3维矢量中Z分量的符号是否发生变化,进而推导出点是否处于凸多边形内外。这里要注意的是,多边形顶点究竟是左手序还是右手序,这对具体判断方式有影响。2.面积判别法(只适用于凸多边形)第四点分别与三角形的两个点组成的面积分别设为S1,S2,S3,只要S1+S2+S3>原来的三角形面积就不在三角形范围中.可以使用海伦公式。推广一下是否可以得到面向凸多边形的算法?(不确定)3.角度和判别法(适用于任意多边形)doubleangle=0;realPointList::iteratoriter1=points.begin();for(realPointList::iteratoriter2=(iter1+1);iter2<points.end();++iter1,++iter2){doublex1=(*iter1).x-p.x;doubley1=(*iter1).y-p.y;doublex2=(*iter2).x-p.x;doubley2=(*iter2).y-p.y;angle+=angle2D(x1,y1,x2,y2);}if(fabs(angle-span::PI2)<0.01)returntrue;elsereturnfalse;另外,可以使用boundingbox来加速。if(p.x<(*iter)->boundingBox.left||p.x>(*iter)->boundingBox.right||p.y<(*iter)->boundingBox.bottom||p.y>(*iter)->boundingBox.top)。。。。。。对于多边形来说,计算boundingbox非常的简单。只需要把水平和垂直方向上的最大最小值找出来就可以了。对于三角形:第四点分别与三角形的两个点的交线组成的角度分别设为j1,j2,j3,只要j1+j2+j3>360就不在三角形范围中。4.水平/垂直交叉点数判别法(适用于任意多边形)注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,如果P在多边形外部,则交点个数必为偶数(0也在内)。所以,我们可以顺序考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况2)如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略。3)如果射线竖直,而P0的横坐标小于P1,P2的横坐标,则必然相交。4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。射线算法1.已知点point(x,y)和多边形Polygon(x1,y1;x2,y2;….xn,yn;);2.以point为起点,以无穷远为终点作平行于X轴的直线line(x,y;-∞,y);3.循环取得(for(i=0;i<n;i++))多边形的每一条边side(xi,yi;xi+1,yi+1),且判断是否平行于X轴,如果平行continue,否则,i++;4.同时判断point(x,y)是否在side上,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025餐厅转让标准版合同
- 备课批改交流课件
- 2025浙江省舟山市室内装修施工合同(合同示范文本)
- 2025中外合作开发合同(合同示范文本)
- 2025铝合金门窗制作安装合同
- 2025医疗机构卫生耗材采购协议合同
- 金融产品营销策略作业指导书
- 环保行业污染治理与监测系统建设方案
- 项目实施过程中的风险应对策略报告
- 中国当代经典歌曲歌词赏析知到课后答案智慧树章节测试答案2025年春湖州师范学院
- 信息系统监理师(中级)考试题库(含答案)
- 《高性能混凝土应用技术标准》(征求意见稿)
- 研究生考试考研化学(农315)试题及解答参考(2024年)
- 《鲁迅研究性学习》课件
- 连锁经营管理专业学生专业技能考核标准
- 电影《白日梦想家》课件
- 软件架构师论文(必读10篇)
- 乡镇垃圾处理项目可行性研究报告
- 电力项目劳务施工安全方案
- 跨学科主题学习的设计
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
评论
0/150
提交评论