确定已知法线的两个点是否相互面对(matlab)

问题描述 投票:1回答:1

我试图找到解决以下问题的方法,但目前尚不清楚如何解决它。想象一下,我在空间中有以下几点,如下图所示:

enter image description here

如果我认为我唯一已知的信息是点位置和它们的法线我想确定两个点(考虑作为参考,第一点的位置)是否彼此面对。例如,从以上图像的点abcde我有:

a面对点ce但不点bd

b面对点de但不点ac

c面对点a但不点bde

d面对点be但不点ac

最后

e面对点abd但不点c

我的第一个是通过使用here提出的解决方案来使用每对的两个法向量之间的有符号角度,但这适用于一些对而不适用于其他对。关于两个点彼此面对的想法是,如果我们将一个点视为原点,那么如果另一个点位于原点的180度视场内并且其法向量向内(其类型为“朝向“)原点。

什么想法可以帮助。

谢谢。


更新:

试着更清楚一些并回答下面的一些评论。原则上,它在空间中的点对应于面部的质心。但是,我事先没有这个信息(即每个点对应于一个面的中心,或者面部及其顶点的列表)。所以在更高的层次上,如果我们处理面孔,问题将是如何确定两个面是否彼此可见,但正如我所说,我现在唯一的信息是空间中的实际点和它们的法线。

enter image description here

样品点:

a = [26415.3720833199 11986.0504166605 739];
na = [0 0 1];

b = [27263.8100000023 11103.1983333336 1512.50000000021];
nb = [0.102791963903622 -0.994702876318771 0];

c = [28059.5700000001 11185.4316666667 962.499999999998];
nc = [-0.102791963903623 0.994702876318771 -9.06557542353252e-16];

d = [26606.7112499615 10390.7487916521 739];
nd = [0 0 1];

e = [27792.4499999996 9225.36499999984 2782];
ne = [0 0 -1];
matlab space points normals
1个回答
2
投票

你可以用几个简单的dot products来解决你的问题......

根据您的描述,如果b(即a)的法线与从ana的矢量之间的角度小于或等于90度,则点a位于另一个点b的视场(FOV)内。如here所述,角度可以通过dot productb-ana除以lengthb-a(假设na的长度已经为1),并取结果的inverse cosine来找到。将它放入anonymous function,你有:

isInFOV = @(b, a, na) (acosd(dot(b-a, na)./norm(b-a)) <= 90);

然后你可以将一个点b定义为“指向”另一个点a,如果沿着从nbb的向量运行的ba的法线)的分量是正的。如here所述,可以通过dot producta-bnb并除以lengtha-b(并假设nb的长度已经为1)来找到该成分。将它放入anonymous function,你有:

isPointingToward = @(b, nb, a) (dot(a-b, nb)./norm(a-b) > 0);

然后我们可以定义一个点a是否“面对”另一个点b

isFacing = @(a, na, b, nb) (isInFOV(b, a, na) && isPointingToward(b, nb, a));

请注意,我使用了qazxsw poi qazxsw poi,因为如果logical short circuit AND operator已经评估为&&,则不需要评估qazxsw poi。

矢量化

您可以使用isPointingToward等函数或使用标准矩阵运算替换对isInFOV的调用来重新形成上述方程以对操作进行矢量化。这将允许您检查给定点面对的集合中的哪些点。函数false的矢量化版本如下:

bsxfun

使用问题中的示例数据:

dot
© www.soinside.com 2019 - 2024. All rights reserved.