2011-08-25 131 views
0

我想计算三维空间中脸部两条边之间的角度。如何计算3D空间中多边形中两个边之间的角度?

我想我可以用在这个问题的解决方案:Signed angle between two 3D vectors with same origin within the same plane

然而,当我尝试一下在矩形的所有90个角,我得到一个角度是90度,另外三个是270

我对与几何有关的数学知之甚少,这就是为什么我要为此而努力并明确地做出错误的假设。

那么你如何计算脸部两个边缘之间的角度?

我的尝试:

def self.full_angle_between(vector1, vector2, normal) 
    angle = vector1.angle_between(vector2) 
    direction = normal % (vector1 * vector2) 
    angle = 360.degrees - angle if direction < 0.0 
    angle 
end 

normal是面部正常 vector1vector2从相同的顶点都起源和每个点朝任一方向的下一个顶点

vector1.angle_between(vector2)指方法在SketchUp Rubu API:http://code.google.com/apis/sketchup/docs/ourdoc/vector3d.html#angle_between 它以弧度返回0-180之间的角度。

360.degrees以弧度表示度数。另外一个SketchUp API方法。

当我遍历矩形中的所有顶点时,我会得到三个报告为270度的角度。为什么?

+0

我发现了我的问题的来源。我没有检查我收到矢量的顺序。当我确保他们在相同的顺序和边缘循环中给出了正确的角度。 – thomthom

回答

1

我会说你的问题就出在这行:

direction = normal % (vector1 * vector2) 

这不是错在自己,但你可能会通过错误的价值观。

如果你不完全加快速度矢量数学,你可能会丢失的东西是由cross productvector1 * vector2给出的矢量的方向取决于操作数的量级。如果你将它们交换在一起,你会得到相同的矢量指向相反的方向。因此,当你迭代矩形顶点时,如果你把“下一个”和“前一个”顶点混合起来,你会得到你所描述的假结果270度的结果。

+0

是的,我会在你面前得出同样的结论。当我确保我使用的矢量与边缘循环的顺序相同时,我得到了正确的结果。 – thomthom

0

您只需执行两个向量的dot product

这会给你的角度。对于3d矢量,它是:

product = (x1 * x2) + (y1 * y2) + (z1 * z2); 

这假定向量被归一化(它们的长度为1)。所以首先你必须确保这是事实。

你必须确保你选择一双合适的边缘每次:

边沿1 * EDGE2
边缘2 * EDGE3
EDGE3 * edge4
edge4 *边沿1

+0

我添加了一些进一步的描述 - 使用点积是我所做的。但是我得到一些不正确的结果。 – thomthom

0

由于我不能添加评论到以前的答案,我开始一个新的答案只是指出点积只是两个向量的余弦值。为了获得实际的角度,你需要在那之后调用acos()。