2011-08-15 9 views
1

私はJava/Androidで幸運の車輪を開発したいと思います。ユーザーが画面に触れると、私はmouvementを検出し、それぞれの変更について、私は古い圧力と最新の(関数onScroll)の間の角度を計算します。3点間の角度が署名されている、悪い結果

public class Test { 

public static void main(String[] args) { 
    Test test = new Test(); 

    Point center = new Point(2.26f, 2.26f); 
    Point current = new Point(2.54f, 3.64f); 
    Point previous = new Point(2.25f, 3.73f); 

    System.out.println("1) Angle is " 
      + test.function1(center, current, previous)); 
    System.out.println("2) Angle is " 
      + test.function2(center, current, previous)); 
    System.out.println("3) Angle is " 
      + test.function3(center, current, previous)); 
    System.out.println("################################"); 

    center = new Point(2.26f, 2.26f); 
    previous = new Point(3.29f, 1.04f); 
    current = new Point(0.98f, 2.25f); 
    System.out.println("1) Angle is " 
      + test.function1(center, current, previous)); 
    System.out.println("2) Angle is " 
      + test.function2(center, current, previous)); 
    System.out.println("3) Angle is " 
      + test.function3(center, current, previous)); 
    System.out.println("################################"); 

    center = new Point(226.0f, 226.0f); 
    previous = new Point(225.21994f, 373.3158f); 
    current = new Point(254.31085f, 364.05264f); 
    System.out.println("1) Angle is " 
      + test.function1(center, current, previous)); 
    System.out.println("2) Angle is " 
      + test.function2(center, current, previous)); 
    System.out.println("3) Angle is " 
      + test.function3(center, current, previous)); 
    System.out.println("################################"); 
} 

public double function1(Point center, Point current, Point previous) { 

    double ang1 = Math.atan((previous.getdY() - center.getdY()) 
      /(previous.getdX() - center.getdX())); 
    double ang2 = Math.atan((current.getdY() - center.getdY()) 
      /(current.getdX() - center.getdX())); 
    double rslt = ang1 - ang2; 

    return Math.toDegrees(rslt) * -1; 
} 

private double function2(Point center, Point current, Point previous) { 
    float dx = current.getdX() - center.getdX(); 
    float dy = current.getdY() - center.getdY(); 
    double a = Math.atan2(dy, dx); 

    float dpx = previous.getdX() - center.getdX(); 
    float dpy = previous.getdY() - center.getdY(); 
    double b = Math.atan2(dpy, dpx); 

    double diff = a - b; 
    double degres = Math.toDegrees(diff); 
    return degres; 
} 

public double function3(Point center, Point current, Point previous) { 
    Point p1 = new Point(current.getdX() - center.getdX(), current.getdY() 
      - center.getdY()); 
    Point p2 = new Point(previous.getdX() - center.getdX(), 
      previous.getdY() - previous.getdY()); 
    double angle = Math.atan2(p1.getdY() - p2.getdY(), 
      p1.getdX() - p2.getdX()); 

    return Math.toDegrees(angle); 
} 

}

:私は3点間の角度を計算することができますどのように覚えていないので、私は、私は3つの機能を開発するが、それぞれが私に様々な結果を与える

...問題をしました

ネット上でこの機能が見つかりましたが、どちらが最適かわかりません。

あなたは私を助けることができますか?

+0

に最高の答えを機能2に類似しているだろう実際の例を取っ​​て単体テストを構築することです。賢明で、よく試し、正しいものを選んでください。 – Snicolas

+0

これを見てください:http://stackoverflow.com/questions/1211212/how-to-calculate-an-angle-from-three-points – AlexR

+0

どのような結果が得られますか? –

答えて

0

ポイントから2つのベクトルを作成し、dot productを使用します。

+0

Indead、ベクトルの縫い目は、角度を見つけるための完璧な方法に署名する!ありがとう。 – FinalSpirit

1

はこちらをご覧:あなたのfunction2の面ではhttp://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

private double function2(Point center, Point current, Point previous) { 
    float v1x = current.getdX() - center.getdX(); 
    float v1y = current.getdY() - center.getdY(); 

    //need to normalize: 
    float l1 = Math.sqrt(v1x * v1x + v1y * v1y); 
    v1x /= l1; 
    v1y /= l1; 

    float v2x = previous.getdX() - center.getdX(); 
    float v2y = previous.getdY() - center.getdY(); 

    //need to normalize: 
    float l2 = Math.sqrt(v2x * v2x + v2y * v2y); 
    v2x /= l2; 
    v2y /= l2;  

    double rad = Math.acos(v1x * v2x + v1y * v2y); 

    double degres = Math.toDegrees(rad); 
    return degres; 
} 

編集:符号付きの値のためMath.atan2(...)を使用しています。リンク先のページから 引用:私たちが望む場合

+または - その後、我々は、おそらく(このページで説明したように)atan2関数を使用する必要があり、先にあるベクトルを示す値。使用した:1 = ATAN2(v2.y、バージョン2.x)への2の相対

角度 - ATAN2(v1.y、V1.X)

はこのようにdouble rad = Math.atan2(v2y,v2x) - Math.atan2(v1y,v1x);double rad = Math.acos(v1x * v2x + v1y * v2y);を交換し、あなたは問題ないはずです。

+0

ありがとう、たくさんの角度が署名されていません... – FinalSpirit

+0

@FinalSpirit私がリンクしているページはあなたにヒントですが、簡単にするために編集を追加しました。 – Thomas

+0

は感謝が、私はこれらの結果を理解していない:最初に
を、私は、この点をしました: '前=ポイント(94.78006; 219.21054) 電流=ポイント(93.37244; 225.10526) センター=ポイント(226.0; 226.0 ) 計算degres = -2.575375011820518(良いdegres) ' そして次、私はしました。このために: '前=ポイント(93.37244; 225.10526) 電流=ポイント(92.43402; 227.63159) センター=ポイント(226.0; 226.0) degres = 358.9136026239169を計算します(これは非常に大きいです!) ' – FinalSpirit

8
private double angleBetween(Point center, Point current, Point previous) { 

    return Math.toDegrees(Math.atan2(current.x - center.x,current.y - center.y)- 
         Math.atan2(previous.x- center.x,previous.y- center.y)); 
} 

この第一電流とセンター - >センター - の角度を算出> x軸に対して前及び2

との差をとり、これは

+0

私はチェックして、ありがとう! – FinalSpirit

+1

注意 'atan2'は、通常、最初のパラメータとして' y'を、第2パラメータとして 'x'を使います。 – NateS

+0

@ratchet freak NateSには有効なポイントがあります。あなたの答えを編集してください。それは方向に適切な角度を与える –

関連する問題