网站大量收购闲置独家精品文档,联系QQ:2885784924

判断点是否在多边形内5种方法.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
判断点是否在多边形内5种方法

判断点是否在多边形内(凸包和任意多边形分类讨论) /* POJ 1548:判断是否为凸包,判断点(圆是否在凸包内),其中判定点是否在多边形内是主要部分 Sample Input 5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.0 1.0 3.0 0.0 2.0 5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.5 1.0 3.0 0.0 2.0 1 Sample Output HOLE IS ILL-FORMED PEG WILL NOT FIT */ //法1、2:叉积判定、面积法判定(适用于凸包)。 #includeiostream #includecstdio #includecstring #includestring #includecmath #includecstdlib #includequeue #includestack #includemap #includevector #includealgorithm using namespace std; #define maxn 10005 #define eps 1e-8 #define max(x,y) (xy?x:y) #define min(x,y) (xy?x:y) int Fabs(double d) //重点:精度控制,如果d精度很高,如-0.00000000001即使是小于0,但也当做是0,关系到后面数据处理 { if(fabs(d)eps) return 0; else return d0?1:-1; } struct point { double x,y; bool operator == (const point p) { return Fabs(x-p.x)==0Fabs(y-p.y)==0; } }p[maxn]; int n; double pegx,pegy,pegr,max_x,max_y; double x_multi(point p1,point p2,point p3) { return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y); } bool point_is_inside() //叉积判断点在凸包内部! 只针对于凸多边形。圆心连接每一条边的端点得到的叉积必须同向。 以此可以延伸出面积法判定点是否在凸包内部。这两种方法都局限于在凸多边形 { point p1; p1.x=pegx,p1.y=pegy; int i,flag=1; double tmp1=0.0,tmp2; for(i=0;in;i++) { tmp2=Fabs(x_multi(p1,p[i],p[(i+1)%n])); if(tmp1*tmp2-eps) { flag=0; break; } tmp1=tmp2; } return flag; } double Len_ab(point p1,point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } bool circle_is_inside() //判断圆是否在凸包内 { if(pegr==0.0) return true; int i; double ans; point peg,t; peg.x=pegx,peg.y=pegy; for(i=0;in;i++) //判断圆心到多边形的每一条边的最短距离是否不小于半径 { t=peg; t.x+=p[i].y-p[(i+1)%n].y; t.y+=p[(i+1)%n].x-p[i].x; if(Fabs(x_multi(peg,t,p[i])*x_multi(peg,t,p[(i+1)%n]))==1) //如果垂足不在线段上则选择到线段两个端点距离较小的 ans=Fabs(Len_ab(peg,p[i])-Len_ab(peg,p[(i+1)%n]))==-1?Len_ab(peg,p[i]):Len_ab(peg,p[(i+1)%n]); else ans=fabs(x_multi(peg,p[(i+1)%n],p[i]))/Len_ab(p[i],p[(i+1)%n]); // 否则利用面积/底边得到最小距离 if(ans-pegr-eps) return false; } return true; } int main() { int i,j; w

文档评论(0)

ktj823 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档