java判断点与线与面的关系_VC++开发GIS系统(280)判断点与面的拓扑关系
本文介紹GIS系統中,點與面之間拓撲關系的判斷方法。
關于點面之間的拓撲
通常情況下可以將點與面的關系做如下劃分:
點在面內
點在面的邊界上
點在面外
本文做了一個簡化處理,將1和2兩種情況當做一種。所以本文中判斷的點面之間的拓撲關系劃分如下:
點在面內
點在面外
點面之間的拓撲算法思路
算法如圖:
算法實現
在 _malaBase.h 中聲明如下的函數:
bool isPointInPolygon(malaPoint point, vector& Poly);//點是否在多邊形內部
@ point 點要素
@ Poly 面(區)要素
并在 _malaBase.cpp中實現上述函數,代碼如下:
/*
* 判斷點是否在區上
*/
bool malaLogic::isPointInPolygon(malaPoint point, vector& Poly)
{
int LineNum = Poly.size();
malaPoint leftP = point;
malaPoint rightP;
rightP.x = getMaxX(Poly) + 1;
rightP.y = point.y;
int count = 0, yPrev = Poly[LineNum - 2].y;
malaPoint v1, v2;
v1 = Poly[LineNum - 1];
for (int i = 0; i < LineNum; i++)
{
v2 = Poly[i];
if (isPointInLine(leftP, v1, v2))
return true;
if (v1.y != v2.y)
{
if (isLineIntersect(v1, v2, leftP, rightP))
{
if (isPointInLine(v1, leftP, rightP))
{
if (v1.yyPrev)count++; }
else { if (v1.y < yPrev) count++; }
}
else if (!isPointInLine(v2, leftP, rightP))
{
count++;
}
}
}
yPrev = v1.y;
v1 = v2;
}
return (count % 2 == 1);
}
其中函數 isLineIntersect 用于判斷兩條直線是否相交,可以參考文章《VC++開發GIS系統(167)選擇線之判斷直線是否與折線相交算法》
詳細代碼可以參考:GitHub
總結
以上是生活随笔為你收集整理的java判断点与线与面的关系_VC++开发GIS系统(280)判断点与面的拓扑关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA随机存储_java-如何将随机整
- 下一篇: java神雕侠侣1古墓情缘游戏攻略_《神