判断点与多边形的关系(2):面积法

判断点和多边形关系的另一个思路是:多边形内的点与多边形各个顶点的连线,组成的三角形的面积和等于多边形的面积。
图例说明,如下图所示:




O点在多边形之内时,其与多边形所有顶点的连线,组成6个三角形,显而易见,这6个三角形的面积之和与多边形的面积相等。这一特性对多边形边上的点也适用。



P点在多边形之外,其与多边形所有顶点的连线,组成6个三角形,显而易见,这6个三角形的面积之和与多边形的面积不相等。确切的说,是三角形面积之和大于多边形面积,至于大多少,就与本文讨论问题无关了,大家可以自行计算。
经过以上原理分析,得到了判断点与多边形关系的“面积法”。这里的关键就是求取三角形与多边形的面积了。好巧的是,求面积也要用到向量积。在我的博客 http://blog.csdn.net/ezhchai/article/details/78841336中可以看到向量积的模式以其为临边的平行四边形的面积,三角形面积只需要乘个0.5就能得到。至于多边形的面积,大家也可以自行计算一下,也用这个原理,其实本文前面我已经说了怎么计算,仔细找能找到~
当然,此方法也有局限性,也是只能适用于凸多边形。其次,由于计算面积的数值会造成一定的舍入误差,这个误差也会影响后期计算的精度。
参考代码:

int InPolygon_Area(const CZPolygon& polygon, CZPoint_t pt){
    double duPloyArea = CalPolygonArea(polygon);
    int itNumPt = polygon.size();
    CZPoint_t pt_1, pt_2;
    double duArea = 0.0;
    for (int i=0; i<(itNumPt-1); i++){
        pt_1 = polygon[i];
        pt_2 = polygon[i + 1];
        double duTriArea = ABS(CrossProduct(&pt_1, &pt, &pt_2));
        if(0.0 == duTriArea) 
            return ONSIDE;
        duArea += 0.5 * duTriArea;
    }
    return ABS(duPloyArea-duArea)<EPS? INSIDE: OUTSIDE;
}

至于效果,和博客http://blog.csdn.net/ezhchai/article/details/78864336一样,这里就不再重复贴了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
射线是一种常用的判断点与多边形关系的算。下面是使用 SQL Server 实现射线判断点与多边形关系的一种可能方: 首先,假设我们有一个名为 Points 的表,其中包含多边形的顶点坐标,以及一个名为 TestPoint 的表,其中包含要测试的点的坐标。 我们可以使用以下 SQL 查询来判断点与多边形关系: ```sql -- 创建示例表 CREATE TABLE Points ( ID INT, X FLOAT, Y FLOAT ); CREATE TABLE TestPoint ( X FLOAT, Y FLOAT ); -- 插入多边形顶点数据 INSERT INTO Points (ID, X, Y) VALUES (1, 0, 0), (2, 0, 4), (3, 4, 4), (4, 4, 0); -- 插入要测试的点数据 INSERT INTO TestPoint (X, Y) VALUES (2, 2); -- 计算射线与多边形的交点数量 WITH CTE AS ( SELECT p1.X AS x1, p1.Y AS y1, p2.X AS x2, p2.Y AS y2, tp.X AS tx, tp.Y AS ty FROM Points p1 JOIN Points p2 ON p1.ID = p2.ID + 1 OR (p1.ID = (SELECT MAX(ID) FROM Points) AND p2.ID = 1) CROSS JOIN TestPoint tp ) SELECT COUNT(*) % 2 AS IsInside FROM CTE WHERE CASE WHEN y1 = y2 THEN ty = y1 AND tx > x1 AND tx < x2 ELSE (ty - y1) / (y2 - y1) * (x2 - x1) > (tx - x1) END; ``` 上述查询首先创建了名为 Points 的表,并插入了多边形的顶点数据。然后创建了名为 TestPoint 的表,并插入要测试的点的数据。 接下来,使用 CTE(通用表达式)来计算射线与多边形的交点数量。最后,查询返回一个布尔值 IsInside,表示测试点是否在多边形内部。如果 IsInside 的值为 1,则表示点在多边形内部;如果值为 0,则表示点在多边形外部。 请注意,这只是一种实现方式,具体的实现可能因数据库结构和需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值