2017-08-01 92 views
-1

我正在尋找算法來計算特定數組是順時針還是逆時針,還是都不是。如果有關係,我使用C#。查找射線是順時針逆時針還是非逆時針算法

輸入變量是X位置,Y位置和任意方向上的歸一化(1單位長)Ray(X和Y分量列表,從-1到1),其源位於給定點。

輸出變量是某種類型,最多可以有3種狀態,例如返回可能性爲0,1或2的字節,以表示順時針,逆時針或不是。

此圖應該有所幫助:

Ray Output Example

光芒在綠色區域應逆時針返回,在紅色區域的光線應該返回順時針和藍色區域應該返回既不。此形狀根據位置旋轉,因此其中一個藍色角將始終指向中心。這些光線可能不完美,因此誤差幅度應該很大,對於每個「象限」應該是90度。

我真的沒有數學技能來實現這個我自己,所以這就是爲什麼我在這裏問。

回答

0

玉以及我設法只是比較兩個角度來解決我的問題。我認爲將問題向前推進兩次並比較答案比試圖解決問題要容易得多。

private sbyte GetCircumferenceDirection (Vector2 pos, Vector2 dir) { 
    float angleHit = Mathf.Atan2 (pos.y, pos.x); 
    float angleNormal = Mathf.Atan2 (pos.y + dir.y, pos.x + dir.x); 
    float angleDiff = angleNormal - angleHit; 
    if (angleDiff > 0.001) { 
     return 1; 
    } 
    if (angleDiff < -0.001) { 
     return -1; 
    } 
    return 0; 
} 

...其中Vector2是包含X和Y變量的對象。

非常感謝您的回答JaeWoo所以,即使我不理解它。

+0

注意:此答案使用** Unity C#**與Vector2和Mathf專門。 –

0

我解決了這個問題,如下所示。

  1. 首先,計算x的區域,Y點
  2. 其次,這種區域

這裏分類是代碼。

namespace ClockWise_Stackoverflow 
{ 
    public enum State { ClockWise, CounterClockWise, Neither } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Random rd = new Random(); 
      var xyInput = Enumerable.Range(0, 10) 
             .Select(f => new double[2] 
                 {   
                 rd.NextDouble(), 
                 rd.NextDouble() 
                 } 
             .ToState()) 
             .ToList();   
     } 

    } 

    public static class Extension 
    { 
     public static State ToState(
      this double[] xy) 
     { 
      var x = xy[0]; 
      var y = xy[1]; 
      if (x * y <= 0) return State.Neither; 
      else if (x > 0) return State.CounterClockWise; 
      else if (x < 0) return State.ClockWise; 
      else return State.Neither; 
     } 
    } 
} 

這主要方法是下同

static void Main(string[] args) 
    { 
     Random rd = new Random(); 
     List<State> xyOutput = new List<State>(); 

     for (int i = 0 ; i < 10 ; i++) 
     { 
      double[] input = new double[] 
            { 
             rd.NextDouble(), 
             rd.NextDouble() 
            }; 
      State currentState = input.ToState(); 
      xyOutput.Add(currentState); 
     } 
    } 
+0

爲什麼必須使用Enumerable.Range? '=>'是什麼意思? –

相關問題