gpt4 book ai didi

geometry - 射线-正方形相交 3D

转载 作者:行者123 更新时间:2023-12-02 04:15:58 24 4
gpt4 key购买 nike

我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否在距正方形中心一定距离内,但我不确定这是否正确。

最佳答案

这是一种适用于任何凸多边形的方法:(请参阅答案末尾的方 block 的简化版本)

令 p1、p2、p3、p4 表示正方形的四个顶点,令 q 表示射线与支撑平面之间的交点。设 n 表示垂直于支撑平面的向量(例如叉积 (p2-p1) x (p3-p1))。

要确定 q 是否在平方中,请计算以下四个量:

o1=orient(q,p1,p2,n)
o2=orient(q,p2,p3,n)
o3=orient(q,p3,p4,n)
o4=orient(q,p4,p1,n)

哪里

orient(a,b,c,n) =  [(b-a) x (c-a)] . n
x: cross product; .: dot product

如果 o1,o2,o3 和 o4 的符号相同,则 q 在平方 (p1,p2,p3,p4) 中

它也适用于任何凸多边形(p1,p2,p3,p4,...,pn)

它是如何工作的:

如果你处于二维状态,你会计算:

o1 = det(p1-q, p2-q)
o2 = det(p2-q, p3-q)
o3 = det(p3-q, p4-q)
o4 = det(p4-q, p1-q)

哪里det(v1,v2) = (x1*y2)-(x2*y1)表示两个向量之间的行列式。

在英语中,如果 o1,o2,o3,o4 具有相同的符号,例如正数,则意味着角度 (p1,q,p2) 进行“左转”。如果所有角度 (p1,q,p2)、(p2,q,p3)、(p3,q,p4) 和 (p4,q,p1) 都是左转,则 q 在多边形内部。每当它在外面时,就有一条边 (pi,pj) 使得 (pi,q,pj) “右转”。

现在如果我们在 3D 的任意平面上,不再有“左转”和“右转”之类的东西,但是我们可以引入法向量 n,并测试是否 (q-p1, q -p2, n) 是正向或负向 3D 基础(这就是 orient() 计算的内容)。

正方形的特殊情况

计算

X = (q-p1).(p2-p1) / ||(p2-p1)||
Y = (q-p1).(p3-p1) / ||(p3-p1)||

如果X >= 0 && X <= 1 && Y >= 0 && Y <= 1那么 q 在正方形中(参见 Mbo 的答案)。

关于geometry - 射线-正方形相交 3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com