给定一个多边形和一个点 ' p ',判断 ' p ' 是否位于多边形内部。位于边界上的点被视为内部。
例子:
方法:解决这个问题的思路是基于如何检查两个给定的线段是否相交,使用方法如下:
文章:
Javascript 如何检查两个给定的线段是否相交:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141714442
Java 如何检查两个给定的线段是否相交:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141713762
Python 如何检查两个给定的线段是否相交:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141714389
C# 如何检查两个给定的线段是否相交:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141714420
C++ 如何检查两个给定的线段是否相交:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141713655
方法:
1、在每个点的右侧画一条水平线,并延伸至无穷大
2、计算线与多边形边相交的次数。
3、如果交点数为奇数或点位于多边形的边缘,则该点位于多边形内部。如果任何条件都不成立,则该点位于多边形外部。
如何处理上图中的点‘g’?
请注意,如果点位于给定多边形的线或与给定多边形的顶点之一相同,则应返回 true。为了处理这个问题,在检查从“p”到极端的线是否相交后,我们检查“p”是否与多边形当前线的顶点共线。如果共线,则检查点“p”是否位于多边形的当前侧,如果位于,则返回 true,否则返回 false。
以下是上述方法的实现:
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
struct Point {
double x, y;
};
// Checking if a point is inside a polygon
bool point_in_polygon(Point point, vector<Point> polygon)
{
int num_vertices = polygon.size();
double x = point.x, y = point.y;
bool inside = false;
// Store the first point in the polygon and initialize
// the second point
Point p1 = polygon[0], p2;
// Loop through each edge in the polygon
for (int i = 1; i <= num_vertices; i++) {
// Get the next point in the polygon
p2 = polygon[i % num_vertices];
// Check if the point is above the minimum y
// coordinate of the edge
if (y > min(p1.y, p2.y)) {
// Check if the point is below the maximum y
// coordinate of the edge
if (y <= max(p1.y, p2.y)) {
// Check if the point is to the left of the
// maximum x coordinate of the edge
if (x <= max(p1.x, p2.x)) {
// Calculate the x-intersection of the
// line connecting the point to the edge
double x_intersection
= (y - p1.y) * (p2.x - p1.x)
/ (p2.y - p1.y)
+ p1.x;
// Check if the point is on the same
// line as the edge or to the left of
// the x-intersection
if (p1.x == p2.x
|| x <= x_intersection) {
// Flip the inside flag
inside = !inside;
}
}
}
}
// Store the current point as the first point for
// the next iteration
p1 = p2;
}
// Return the value of the inside flag
return inside;
}
// Driver code
int main()
{
// Define a point to test
Point point = { 150, 85 };
// Define a polygon
vector<Point> polygon = {
{ 186, 14 }, { 186, 44 }, { 175, 115 }, { 175, 85 }
};
// Check if the point is inside the polygon
if (point_in_polygon(point, polygon)) {
cout << "Point is inside the polygon" << endl;
}
else {
cout << "Point is outside the polygon" << endl;
}
return 0;
}
输出:
Point is outside the polygon
时间复杂度: O(n),其中 n 是给定多边形的顶点数。
辅助空间: O(1),因为没有占用额外空间。