我想要一个算法来计算 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/