我正在尝试创建一个快速的2D点在多边形内部算法,用于命中测试(例如Polygon.contains(p:Point)
)。欢迎提供有效技巧建议。
我正在尝试创建一个快速的2D点在多边形内部算法,用于命中测试(例如Polygon.contains(p:Point)
)。欢迎提供有效技巧建议。
function isInside = isPointInsideQuadrilateral(x, y, x1, y1, x2, y2, x3, y3, x4, y4)
% Calculate barycentric coordinates
denominator1 = (y2 - y1)*(x4 - x1) + (x1 - x2)*(y4 - y1);
alpha1 = ((y2 - y1)*(x - x1) + (x1 - x2)*(y - y1)) / denominator1;
beta1 = ((y1 - y4)*(x - x1) + (x4 - x1)*(y - y1)) / denominator1;
gamma1 = 1 - alpha1 - beta1;
denominator2 = (y3 - y2)*(x4 - x2) + (x2 - x3)*(y4 - y2);
alpha2 = ((y3 - y2)*(x - x2) + (x2 - x3)*(y - y2)) / denominator2;
beta2 = ((y2 - y4)*(x - x2) + (x4 - x2)*(y - y2)) / denominator2;
gamma2 = 1 - alpha2 - beta2;
isInside = (alpha1 >= 0 && beta1 >= 0 && gamma1 >= 0) || (alpha2 >= 0 && beta2 >= 0 && gamma2 >= 0);
end
这仅适用于凸形状,但Minkowski Portal Refinement和GJK也是测试点是否在多边形中的绝佳选择。您可以使用Minkowski减法将点从多边形中减去,然后运行这些算法以查看多边形是否包含原点。
此外,有趣的是,您可以使用支持函数来更加隐式地描述您的形状,该函数以方向向量作为输入并输出沿该向量最远的点。这使您可以描述任何凸形状..弯曲的,由多边形组成的或混合的。您还可以执行操作以组合简单支持函数的结果以制作更复杂的形状。
更多信息: http://xenocollide.snethen.com/mpr2d.html
此外,游戏编程宝典7讨论了如何在3D中实现此目标(:
point.within(polygon)
,它会返回一个布尔值,表示点是否在多边形内部。 - J Agustin Barrachina