【问题标题】:How to calculate angle between two direction vectors that form a closed/open shape?如何计算形成闭合/开放形状的两个方向向量之间的角度?
【发布时间】:2011-05-16 17:31:02
【问题描述】:

我正在尝试找出正确的触发器。 eq./function 来确定以下内容: 两个方向向量之间的角度变化(以度为单位)(已确定),表示两个线段。 这用于形状识别(用户在屏幕上手绘)的上下文中。

基本上,

a) 如果用户绘制了一个(粗略的)形状,例如圆形、椭圆形或矩形等 - 构成该形状的线条被分解为 20 个点(x-y 对)。

b) 我有每个线段的 DirectionVector。

c) 所以 LINE SEGMENT(x0,y0) 的 BEGINNING 将是前一行的 END 点(从而形成一个像矩形一样的封闭形状,比方说)。

所以,我的问题是,给定上下文(即确定多边形的类型),如何找到两个方向向量之间的角度变化(可作为 x 和 y 的两个浮点值)? ??

我见过很多不同的三角。方程式,我正在寻求澄清。

非常感谢各位!

【问题讨论】:

    标签: geometry shape pattern-recognition


    【解决方案1】:

    我猜你的向量是三个点 (x_1, y_1), (x_2, y_2) 和 (x_3, y_3)。

    然后你可以移动点,使 (x_1, y_1) == (0, 0) by

    (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:

    【讨论】:

      【解决方案2】:

      你可以试试 atan2:

      float angle = atan2(previousY-currentY, previousX-currentY);
      

      而且,正如前面的答案所提到的,

      两个顶点之间的角度 = acos(first.dotProduct(second))

      【讨论】:

      • 谢谢,这看起来更简单,而之前的那些并没有产生角度(这是由我在视觉上确定的,大约)。谢谢各位。非常感谢这个论坛,并将向许多人推荐它。
      • 所有人的更新:使用上述任何方法,我都没有得到任何数据组合(绘制的线)的正确角度。我想..可能是我的 DirectionVector 计算函数有问题,但考虑到我画的线和提供的值,它们似乎是正确的......所以我需要看看这个。将保持此博客发布,直到问题解决。感谢所有迄今为止做出贡献的人。 ~IB~
      【解决方案3】:

      如果我理解正确,您可以只计算两个向量之间的点积,然后取适当的 arccos 来检索这些向量之间的角度。

      【讨论】:

      • 这也是我的感受。我很想弄清楚可能出现的顺时针逆时针问题,这取决于画线的方向,因此..我是否需要考虑..是否考虑内角在两条线或外角之间(如果你知道我的意思)。但对于大多数情况,内角应该就足够了——我认为。
      【解决方案4】:

      如果 (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

      尤其是“几何表示”部分。

      【讨论】:

      • 太棒了!非常感谢!我将尝试您的两个建议,如果结果产生最终用户所寻求的结果,那么谢谢。如果没有,我可能会回来! :) 非常有帮助的论坛 - 非常感谢!
      • 还有一点:由于您是新来的:您可以对答案投票,也可以选择一个作为“已接受”的答案。这提高了回答者的“声誉”,所以这是一件好事:)
      • 是的..我刚刚意识到......并且会说“对我温柔”,因为我并不是一个经常在网上花费大量时间的人,所以不要'做论坛经常像你们大多数人一样。我现在会给你的投票。一旦我实施了解决方案,我也会选择“正确”的答案。 :) 非常感谢! :)
      • 嗨,还有一个问题 Largebaer.. :0 您已将计算结果分配给 cos() 函数。 “阿尔法”是什么意思?如果我要编写 C++ 代码,你知道 lhs(左侧将如何表示)吗?
      • @Immortal:取等式两边的反余弦值——然后 alpha = acos( (x1*x2 + y1*y2)/bla bla bla)。 Alpha 将是您正在寻找的角度(并且可能以弧度为单位)。
      猜你喜欢
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2011-07-17
      相关资源
      最近更新 更多