algorithm - 4点的凸包

标签 algorithm graphics computational-geometry convex-hull

我想要一个算法来计算 4 个 2D 点的凸包。看了泛化问题的算法,不知道有没有4分的简单解法。

最佳答案

取三个点,判断它们的三角形是顺时针还是逆时针::

triangle_ABC= (A.y-B.y)*C.x + (B.x-A.x)*C.y + (A.x*B.y-B.x*A.y)

对于右手坐标系,如果 ABC 为逆时针,则此值为正,顺时针为负,如果它们共线,则为零。但是,以下内容对于左手坐标系同样适用,因为方向是相对的。

计算包含第四个点的三个三角形的可比值:

triangle_ABD= (A.y-B.y)*D.x + (B.x-A.x)*D.y + (A.x*B.y-B.x*A.y)
triangle_BCD= (B.y-C.y)*D.x + (C.x-B.x)*D.y + (B.x*C.y-C.x*B.y)
triangle_CAD= (C.y-A.y)*D.x + (A.x-C.x)*D.y + (C.x*A.y-A.x*C.y)

如果{ABD,BCD,CAD}中的三个符号都与ABC相同,则D在ABC内部,则包体为三角形ABC。

如果{ABD,BCD,CAD}中有两个与ABC同号,一个与ABC异号,则四个点均为极值,则四边形ABCD为四边形。

如果{ABD,BCD,CAD}中有一个与ABC符号相同,两个符号相反,则凸包为符号相同的三角形;剩下的点在里面。

如果三角形中任何一个值为零,则三点共线且中点不是极值。如果所有四个点都共线,则所有四个值都应为零,并且外壳将是一条线或一个点。当心这些情况下的数值鲁棒性问题!

对于 ABC 为正的情况:

ABC  ABD  BCD  CAD  hull
------------------------
 +    +    +    +   ABC
 +    +    +    -   ABCD
 +    +    -    +   ABDC
 +    +    -    -   ABD
 +    -    +    +   ADBC
 +    -    +    -   BCD
 +    -    -    +   CAD
 +    -    -    -   [should not happen]

关于algorithm - 4点的凸包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122305/

相关文章:

java - LibGDX 2D ||在屏幕外对象上调用draw()是否效率低下或者它们会被自动剔除?

Android填写路径的一部分?

algorithm - 如何更高效地找到离特定点最近的线段?

computational-geometry - 如何确定半球的点x-y-z坐标?

javascript - 在 JavaScript 中评估逆波兰表示法算法

c++ - 为什么我的二进制堆插入在实践中会以这种方式运行?

c++ - 在非常小的数组中找到最小值

algorithm - 如何计算 BFT 中的消息数?

Java 制作一个调用drawOval 的drawCircle 方法

algorithm - 覆盖 n 个点的最小半径为 r 的圆圈数