代码之家  ›  专栏  ›  技术社区  ›  Elazar Leibovich

比较两个角度

  •  4
  • Elazar Leibovich  · 技术社区  · 16 年前

    A,B,X,Y ,我想确定以下两个角度中哪一个较小 ∢ABX ∢ABY

    角度 ABX公司 定义为 BX AB 被翻译成躺在开放段上 (-∞,0] . 直觉地说 我是说你在访问顶点后左转时得到的角度 B .

    我宁愿不用 cos sqrt ,以保持准确性并最小化性能(代码将在嵌入式系统上运行)。

    在这种情况下 A=(-1,0),B=(0,0) ,我可以比较这两个角度 ABX公司 阿比 X,Y ,并注意它的标志。

    在这种情况下我能做的是:

    1. ABX 右转或左转
    2. 如果 ABX公司 Y A 在线段的同一侧 . 如果他们是- ABX公司 ABY .
    3. ABX公司 然后右转 是的 一个 在同一边 意思是 大于 .

    但这对我来说太复杂了。

    6 回复  |  直到 16 年前
        1
  •  2
  •   user168715    16 年前

    这是一些伪代码。当两个角度相同时无法检测到情况。也不处理角度方向,例如假设所有角度都是<=180度。

    v0 = A-B
    v1 = X-B
    v2 = Y-B
    
    dot1 = dot(v0, v1)
    dot2 = dot(v0, v2)
    
    if(dot1 > 0)
      if(dot2 < 0)
        // ABX is smaller
      if(dot1 * dot1 / dot(v1,v1) > dot2 * dot2 / dot(v2, v2) )
        // ABX is smaller
      // ABY is smaller
    
    if(dot2 > 0)
      // ABY is smaller
    if(dot1 * dot1 / dot(v1,v1) > dot2 * dot2 / dot(v2,v2) )
      // ABY is smaller
    // ABX is smaller
    

    请注意,如果你允许取两个平方根,那么这种痛苦的大部分就会消失。

        2
  •  1
  •   nico    16 年前

    使原点在B上居中

    X = X - B
    Y = Y - B
    A = A - B
    

    编辑 :您还需要将3个向量正规化

    A = A / |A|
    X = X / |X|
    Y = Y / |Y|
    

    acos(A dot X)
    acos(A dot Y)
    

    ===

    我不明白失去精确性的原因。你只是在比较,而不是以任何方式修改点的坐标。。。

        3
  •  1
  •   brainjam    16 年前

    你可能想退房 Rational Trigonometry . 距离和角度的概念被“四分法”和“扩散”所取代,而“四分法”和“扩散”并不涉及 sqrt cos . 请参阅该网页的底部,了解如何计算两行之间的间距。主题有自己的网站,甚至 youtube channel .

        4
  •  0
  •   duffymo    16 年前

    为了保持准确性,我宁愿不使用cos或sqrt。

    这毫无意义。

    但这对我来说太复杂了。

    这对我来说似乎完全错了。

    你要小心的是“小”的意思。这个想法不是很准确。例如,如果一个点A位于象限4(x-component>0和y-component<0)中,而另一个点B位于象限1(x-component>0和y-component>0)中,“较小”是什么意思?向量从原点到A的角度在0到π/2之间;向量从原点到B的角度在3π/4到2π之间。哪个比较小?

        5
  •  0
  •   Yogi    16 年前

    我不确定你能不能不用sqrt逃走。 简单:

    AB = A-B/|A-B|
    XB = X-B/|X-B|
    YB = Y-B/|Y-B|
    
    if(dot(XB,AB) > dot (YB,AB)){
     //<ABY is grater
    }
    else
    {
    ...
    }
    
        6
  •  0
  •   sizzzzlerz    16 年前

    使用余弦定律: a**2 + b**2 - 2*a*b*cos(phi) = c**2