PointWithIn解题报告总结.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PointWithIn 解题报告 该题曾经在讲座中讲过,这里再此将其总结。 题是告诉一简单多边形(非相邻边不自交),判断一个给定的点是否在该多边形之内。 因为该多边形可能是凹多边形,所以不能以判断点同侧的方法来作判断。这里的方法是,从该点出发,引一条射线,计算该射线和多边形边的相交次数,如果次数为奇数,则点在内部;否则,点在外部。 相关的代码如下: struct Point { double x, y; }; struct Line { Point pt1, pt2; }; Point polygon[100]; //function double max(double a,double b) { if(a>b)return a; else return b; } double min(double a,double b) { if(a<b)return a; else return b; } double Multiply(Point p1, Point p2, Point p0) { return ( (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y) ); } bool IsOnline(Point point, Line line) { return( ( fabs(Multiply(line.pt1, line.pt2, point)) < ESP ) && ( ( point.x - line.pt1.x ) * ( point.x - line.pt2.x ) <= 0 ) && ( ( point.y - line.pt1.y ) * ( point.y - line.pt2.y ) <= 0 ) ); } bool Intersect(Line L1, Line L2) { return( (max(L1.pt1.x, L1.pt2.x) >= min(L2.pt1.x, L2.pt2.x)) && (max(L2.pt1.x, L2.pt2.x) >= min(L1.pt1.x, L1.pt2.x)) && (max(L1.pt1.y, L1.pt2.y) >= min(L2.pt1.y, L2.pt2.y)) && (max(L2.pt1.y, L2.pt2.y) >= min(L1.pt1.y, L1.pt2.y)) && (Multiply(L2.pt1, L1.pt2, L1.pt1) * Multiply(L1.pt2, L2.pt2, L1.pt1) >= 0) && (Multiply(L1.pt1, L2.pt2, L2.pt1) * Multiply(L2.pt2, L1.pt2, L2.pt1) >= 0) ); } bool InPolygon(Point* polygon,Point point,int size) { int n = size; if (n == 1) { return ( (fabs(polygon[0].x - point.x) < ESP) && (fabs(polygon[0].y - point.y) < ESP) ); } else if (n == 2) { Line side; side.pt1 = polygon[0]; side.pt2 = polygon[1]; return IsOnline(point, side); } int count = 0; Line line; line.pt1 = point; line.pt2.y = point.y; line.pt2.x = - INFINITY; for( int i = 0; i < n; i++ ) { // 得到多边形的一条边 Line side; side.pt1 = polygon[i]; side.pt2 = polygon[(i + 1) % n]; if( IsOnline(point, side) ) { return true; }

文档评论(0)

爱是你我 + 关注
实名认证
内容提供者

这一世渡尽红尘,若有来生,不再为人。

1亿VIP精品文档

相关文档