如何计算形成闭合/开放形状的两个方向向量之间的角度?

5
我正在尝试找出正确的三角函数/方程来确定以下内容:已确定的代表两条线段的两个方向向量之间的角度变化(以度为单位)。这在形状识别(用户在屏幕上手绘)的上下文中使用。
基本上,如果用户绘制了一个(粗略的)形状,例如圆形、椭圆形或矩形等,则构成该形状的线被分解为20个点(x-y对)。
我有每个这些线段的DirectionVector。
因此,线段的起始点(x0,y0)将是前一条线段的结束点(以形成闭合形状,比如说矩形)。
因此,我的问题是,在给定的上下文中(即确定多边形的类型),如何找到两个方向向量之间的角度变化(作为x和y的两个浮点值可用)? 我看过很多不同的三角函数公式,现在正在寻求明确的答案。
非常感谢您提前的帮助!
4个回答

8
如果 (x1,y1) 是第一个方向向量,(x2,y2) 是第二个方向向量,则有:
cos( alpha ) = (x1 * x2 + y1 * y2) / ( sqrt(x1*x1 + y1*y1) * sqrt(x2*x2 + y2*y2) )
其中,sqrt 表示平方根。
请查看 http://en.wikipedia.org/wiki/Dot_product,特别是“几何表示”一节。

太棒了!非常感谢!我会尝试你们两个的建议,如果结果符合最终用户的需求,那么谢谢你。如果不行,我可能会回来! :) 这个论坛非常有帮助- 感激不尽! - ImmortalBuddha
还有一件小事:由于您是新来的:您可以为答案投票,也可以选择一个“被接受”的答案。这会提高回答者的“声誉”,所以这是一件好事 :) - cadolphs
是的,我刚刚意识到了这一点...本来想说“对我温柔点”,因为我通常不怎么上网,所以不像你们大多数人那样经常上论坛。现在我会给你的答案点赞。一旦我实施解决方案,我也会选择“正确”的答案。 :)非常感谢! :) - ImmortalBuddha
1
@Immortal:对方程两边取反余弦函数--然后alpha = acos((x1x2 + y1y2)/bla bla bla)。Alpha将是您要寻找的角度(并且可能以弧度为单位)。 - Jim Lewis
太棒了!非常感谢Jim和大家!这个空间有一些聪明的灵魂。太好了!:) 谢谢。 - ImmortalBuddha
显示剩余3条评论

3
我猜你手上有这三个点的向量 (x_1, y_1), (x_2, y_2) 和 (x_3, y_3)。
然后,你可以通过移动这些点使得 (x_1, y_1) == (0, 0),方法如下:
(x_1, y_1) = (x_2, y_2) - (x_1, y_1) (x_2, y_2) = (x_3, y_3) - (x_1, y_1)
现在你有了下面这个三角形:
请将这个三角形看作是两个直角三角形:第一个直角三角形为 alpha 角和 beta 的一部分,第二个直角三角形为 beta 的另一部分。
接着,你可以应用下面这个公式:
你可以按照以下步骤计算出 alpha:
其中
最终结果为:

3
你可以尝试使用atan2函数:
```atan2```
float angle = atan2(previousY-currentY, previousX-currentY);

正如之前的回答所提到的,两个向量之间的夹角可以用以下公式计算:

夹角 = acos(第一个向量·第二个向量)

这里保留了HTML标签,请注意格式要求。


谢谢,这似乎更简单,之前的并没有得到我(大约)通过视觉确定的角度。感谢大家。非常感激这个论坛,我会向许多人推荐它。 - ImmortalBuddha
更新给所有人:使用上述任何方法,我都无法获得任何数据组合(绘制的线)的正确角度。我认为可能是我的DirectionVector计算函数有问题,但是考虑到我绘制的线和提供的值,它们似乎是正确的...所以我需要进一步研究这个问题。在问题解决之前,我会继续更新这个博客。感谢迄今为止做出贡献的所有人。IB - ImmortalBuddha

0

如果我理解正确,您只需计算两个向量之间的点积,并取适当的反余弦即可检索这些向量之间的角度。


这也是我的感觉。我试图理解顺时针和逆时针问题,这取决于线条的绘制方向,因此可能需要考虑是否要考虑两条线之间的内角或外角(如果你知道我的意思)。但是对于大多数情况来说,内角应该足够了-我想。 - ImmortalBuddha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接