java判断点与线与面的关系_VC++开发GIS系统(280)判断点与面的拓扑关系

本文介绍GIS系统中,点与面之间拓扑关系的判断方法。

关于点面之间的拓扑

通常情况下可以将点与面的关系做如下划分:

点在面内

点在面的边界上

点在面外

本文做了一个简化处理,将1和2两种情况当做一种。所以本文中判断的点面之间的拓扑关系划分如下:

点在面内

点在面外

点面之间的拓扑算法思路

算法如图:

20878e188a76e49c05b56f27d74deaab.png

算法实现

在 _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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值