C++实现一个经纬度坐标是否在20个经纬度坐标围成的多边形里
时间: 2024-06-09 19:06:13 浏览: 112
可以使用射线法来判断一个点是否在多边形内部。以下是具体的实现步骤:
1. 定义一个`struct`来表示经纬度坐标:
```c++
struct Point {
double lng; // 经度
double lat; // 纬度
};
```
2. 定义一个函数来判断两个点是否在同一条经线上:
```c++
bool onSameLng(const Point& p1, const Point& p2) {
return fabs(p1.lng - p2.lng) < 1e-6;
}
```
3. 定义一个函数来判断两个点是否在同一条纬线上:
```c++
bool onSameLat(const Point& p1, const Point& p2) {
return fabs(p1.lat - p2.lat) < 1e-6;
}
```
4. 定义一个函数来判断一个点是否在多边形内部:
```c++
bool isInsidePolygon(const Point& p, const vector<Point>& polygon) {
int n = polygon.size();
int cnt = 0;
for (int i = 0; i < n; i++) {
int j = (i + 1) % n;
// 如果点在多边形的顶点上,直接返回true
if (fabs(p.lng - polygon[i].lng) < 1e-6 && fabs(p.lat - polygon[i].lat) < 1e-6) {
return true;
}
// 判断点是否在多边形的水平射线的上方
if (onSameLat(polygon[i], polygon[j])) {
continue;
}
// 判断点是否在多边形的射线路径中
if (p.lat < min(polygon[i].lat, polygon[j].lat) || p.lat > max(polygon[i].lat, polygon[j].lat)) {
continue;
}
// 计算射线与边的交点
double x = polygon[i].lng + (p.lat - polygon[i].lat) * (polygon[j].lng - polygon[i].lng) / (polygon[j].lat - polygon[i].lat);
// 如果交点在点的右侧,那么交点和边的右侧构成一个交叉点
if (x > p.lng) {
cnt++;
}
}
// 如果交叉点为奇数,那么点在多边形内部
return cnt % 2 == 1;
}
```
5. 调用上述函数判断一个点是否在多边形内部,例如:
```c++
int main() {
vector<Point> polygon = {{116.397128, 39.916527}, {116.411358, 39.916527}, {116.411358, 39.929526}, {116.397128, 39.929526}};
Point p = {116.403475, 39.925757};
bool isInside = isInsidePolygon(p, polygon);
cout << (isInside ? "在多边形内部" : "不在多边形内部") << endl;
return 0;
}
```
其中`polygon`表示多边形的顶点坐标,`p`表示要判断的点的坐标。
阅读全文