我试图找到解决以下问题的方法,但目前尚不清楚如何解决它。想象一下,我在空间中有以下几点,如下图所示:
如果我认为我唯一已知的信息是点位置和它们的法线我想确定两个点(考虑作为参考,第一点的位置)是否彼此面对。例如,从以上图像的点a
,b
,c
,d
和e
我有:
点a
面对点c
和e
但不点b
和d
。
点b
面对点d
和e
但不点a
和c
。
点c
面对点a
但不点b
,d
和e
。
点d
面对点b
和e
但不点a
和c
。
最后
点e
面对点a
,b
和d
但不点c
。
我的第一个是通过使用here提出的解决方案来使用每对的两个法向量之间的有符号角度,但这适用于一些对而不适用于其他对。关于两个点彼此面对的想法是,如果我们将一个点视为原点,那么如果另一个点位于原点的180度视场内并且其法向量向内(其类型为“朝向“)原点。
什么想法可以帮助。
谢谢。
更新:
试着更清楚一些并回答下面的一些评论。原则上,它在空间中的点对应于面部的质心。但是,我事先没有这个信息(即每个点对应于一个面的中心,或者面部及其顶点的列表)。所以在更高的层次上,如果我们处理面孔,问题将是如何确定两个面是否彼此可见,但正如我所说,我现在唯一的信息是空间中的实际点和它们的法线。
样品点:
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];
你可以用几个简单的dot products来解决你的问题......
根据您的描述,如果b
(即a
)的法线与从a
到na
的矢量之间的角度小于或等于90度,则点a
位于另一个点b
的视场(FOV)内。如here所述,角度可以通过dot product和b-a
的na
除以length的b-a
(假设na
的长度已经为1),并取结果的inverse cosine来找到。将它放入anonymous function,你有:
isInFOV = @(b, a, na) (acosd(dot(b-a, na)./norm(b-a)) <= 90);
然后你可以将一个点b
定义为“指向”另一个点a
,如果沿着从nb
到b
的向量运行的b
(a
的法线)的分量是正的。如here所述,可以通过dot product和a-b
的nb
并除以length的a-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