- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)