Java求三角形的三个内角_用于计算大量三角形的3D射线/三角形边缘交点的快速算法...

重心坐标可以帮助吗?

有可能 . 这取决于你的非重心代码有多高度优化,但我会说使用重心坐标至少更容易编写既可维护又高性能的代码 .

据我所知,你的整个设置基本上是2d,点 E 和方向 d 包含在由 A,B,C 跨越的平面内 . 所以你有了

E = aE*A + bE*B + cE*C with aE+bE+cE=1

d = ad*A + bd*B + cd*C with ad+bd+cd=0

现在你有两个子问题:

如何有效地获得重心坐标

如何找到交叉点

让我们从后者开始吧 . 您只需将 E 添加到 d 的多个倍数,直到 c 坐标变为零 .

P = E - (cE/cd)*d

根据您的设置,您可能也可以使用齐次坐标,在这种情况下,您可以将其写为 P = cd*E - cE*d .

你怎么把 d 和 E 的坐标变成重心 a,b,c ?那么,这只是一个线性方程组 . 您可以使用由矢量 A,B,C 形成的矩阵的逆矩阵 . 同样,如果您正在处理齐次坐标,则可以使用辅助而不是逆 .

这是拼写出来的同质方法:

aE = (By*Cz-Bz*Cy)*Ex + (Bz*Cx-Bx*Cz)*Ey + (Bx*Cy-By*Cx)*Ez

bE = (Cy*Az-Cz*Ay)*Ex + (Cz*Ax-Cx*Az)*Ey + (Cx*Ay-Cy*Ax)*Ez

cE = (Ay*Bz-Az*By)*Ex + (Az*Bx-Ax*Bz)*Ey + (Ax*By-Ay*Bx)*Ez

ad = (By*Cz-Bz*Cy)*dx + (Bz*Cx-Bx*Cz)*dy + (Bx*Cy-By*Cx)*dz

bd = (Cy*Az-Cz*Ay)*dx + (Cz*Ax-Cx*Az)*dy + (Cx*Ay-Cy*Ax)*dz

cd = (Ay*Bz-Az*By)*dx + (Az*Bx-Ax*Bz)*dy + (Ax*By-Ay*Bx)*dz

aP = cd*aE - cE*ad

bP = cd*bE - cE*bd

Px = aP/(aP+bP)*Ax + bP/(aP+bP)*Bx

Py = aP/(aP+bP)*Ay + bP/(aP+bP)*By

Pz = aP/(aP+bP)*Az + bP/(aP+bP)*Bz

前三行将 E 转换为重心坐标,接下来的三行 d . 然后我们计算 P 的重心坐标,并将它们转回笛卡尔坐标 . 在该步骤中,我们也将它们去均匀化,即除以重心坐标的总和 .

总的来说,这里有相当多的代码 . 您可以通过将公共表达式移动到专用变量来减少操作数,特别是如果您的编译器不需要除最终的非均匀化之外的任何除法,即除以 (a+b) . 如果你计算一次 1/(a+b) ,你可以用一个分区来做,这对性能有好处 .

然而,上述代码的真正好处可能是你可以使用重心坐标做很多好事,而这些坐标是你用其他坐标系统无法轻易做到的 . 例如,如果要检查光线是否到达线段上的线 AB 或三角形外的某个位置,只需检查是否 aP*bP > 0 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值