|

(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。
(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。
(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。
特殊情况:要检测的点在多变形的一条边上,射线法判断的结果是不确定的,需要特殊处理
射线法的关键是正确计算射线与每条边是否相交。并且规定线段与射线重叠或者射线经过线段下端点属于不相交。首先排除掉不相交的情况,下图的情况都是需要排除掉的:
|
Point_in_ConvexHull | 逻辑型 | | |
p | 点坐标 | | | | hull | 点坐标 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | i | 整数型 | | | n | 整数型 | | | p0 | 点坐标 | | |
p0.x = 0 p0.y = p.y 计次循环首 (取数组成员数 (hull ) - 1, i ) 如果真 (射线与线段是否有交点 (p0, p, hull [i ], hull [i + 1 ]))    n = n + 1   计次循环尾 () 如果真 (射线与线段是否有交点 (p0, p, hull [取数组成员数 (hull )], hull [1 ]))  n = n + 1 调试输出 (n, n % 2 = 1 )返回 (n % 2 = 1 )|
射线与线段是否有交点 | 逻辑型 | | |
a | 点坐标 | | | | b | 点坐标 | | | | c | 点坐标 | | | | d | 点坐标 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | s1 | 双精度小数型 | | | s2 | 双精度小数型 | | | s3 | 双精度小数型 | | | s4 | 双精度小数型 | | | d1 | 整数型 | | | d2 | 整数型 | | | d3 | 整数型 | | | d4 | 整数型 | | |
s1 = ab_cross_ac (a, b, c )s2 = ab_cross_ac (a, b, d )s3 = ab_cross_ac (c, d, a )s4 = ab_cross_ac (c, d, b )d1 = dblcmp (s1, 0 )d2 = dblcmp (s2, 0 )d3 = dblcmp (s3, 0 )d4 = dblcmp (s4, 0 ) 如果真 (位异或 (d1, d2 ) = -2 且 位异或 (d3, d4 ) = -2 ) 返回 (真) 如果真 (d1 = 0 且 point_on_line (c, a, b ) ≤ 0 ) 返回 (假) 如果真 (d2 = 0 且 point_on_line (d, a, b ) ≤ 0 ) 返回 (假) 如果真 (d3 = 0 且 point_on_line (a, c, d ) ≤ 0 ) 返回 (假) 如果真 (d4 = 0 且 point_on_line (b, c, d ) ≤ 0 ) 返回 (假)返回 (假)|
ab_cross_ac | 双精度小数型 | | |
a | 点坐标 | | | | b | 点坐标 | | | | c | 点坐标 | | | | 返回 (cross (b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y )) |
cross | 双精度小数型 | | |
x1 | 双精度小数型 | | | | y1 | 双精度小数型 | | | | x2 | 双精度小数型 | | | | y2 | 双精度小数型 | | | | 返回 (x1 × y2 - x2 × y1 )|
dot | 双精度小数型 | | |
x1 | 双精度小数型 | | | | y1 | 双精度小数型 | | | | x2 | 双精度小数型 | | | | y2 | 双精度小数型 | | | | 返回 (x1 × x2 + y1 × y2 )|
point_on_line | 整数型 | | |
a | 点坐标 | | | | b | 点坐标 | | | | c | 点坐标 | | | | 返回 (dblcmp (dot (b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y ), 0 )) 如果真 (取绝对值 (x - y ) ≤ 1e-005 ) 返回 (0 ) 如果真 (x < y ) 返回 (-1 )返回 (1)返回 (选择 (a < b, a, b )) 返回 (选择 (a > b, a, b ))
|
|