平面内四个点,怎样保证能构建四角面?

2021-09-22 22:21:10 +08:00
 zeronofreya

比如

verts = [(x0,y0),(x1,y1),(x2,y2),(x3,y3)]

怎样保证能创建这样的面

而不是这样

要求这四个点坐标不变,最小限度修改前 3 个点的下标(顺序),逆时针,否则面法线就会朝内,最后一个点不能动? 有什么好办法吗?

1453 次点击
所在节点    数学
6 条回复
vance123
2021-09-22 23:07:56 +08:00
以最左下方的点为原点,算出三个向量和 y 轴正向的夹角,然后排序
vance123
2021-09-22 23:23:21 +08:00
不过只有既然四个点,枚举然后像你说的那样算法线方向也可以
IgniteWhite
2021-09-22 23:29:40 +08:00
MoYi123
2021-09-23 09:32:36 +08:00
https://oi-wiki.org/geometry/convex-hull/
不是太明白你最后一句话是什么意思
看看这个算法能用吗?
XiXiLocked
2021-09-23 13:12:25 +08:00
比叉乘,(p1-p4)x(p2-p4) ,(p3-p4)x(p2-p4) ,轮换 123 。3 次里会出现一次一正一负,用那次的下标绕 1234 就不会重叠。
necomancer
2021-10-23 16:02:53 +08:00
from scipy.spatial import ConvexHull
hull = ConvexHull(verts) # 你的例子里 points = (4,2) array ,一般来说数组形状是(点数,维度)
剩下的看看 hull 的 vertices 就行,这个是寻找平面最大凸多边形算法,详情查书。

当然,如果你的 4 个点里有一个藏在内部了,这个算法返回的是三角形。比如你的 4 个点这么排列,那么返回的是外面的三角形。
*
----*----*
*

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/803490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX