簡體   English   中英

3點之間的角度簽名,不好的結果

[英]Angle between 3 points signed, bad results

我想在Java/Android中開發一種命運之輪。 當用戶觸摸屏幕時,我會檢測到運動,並且對於每次變化,我都會計算舊壓力與最新壓力之間的角度(函數 onScroll)。 我有一個問題,因為我不記得如何計算 3 點之間的角度...

我開發了 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);
}

}

我在網上找到了這個 function 但我不知道哪個是最好的。

你能幫助我嗎?

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));
}

這首先計算 center->current 和 center->previous 相對於 x 軸的角度,並取 2 之間的差

這類似於函數2

看看這里:http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

就您的function2而言:

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 function(如本頁所述)。 使用:

2 相對於 1 的角度 = atan2(v2.y,v2.x) - atan2(v1.y,v1.x)

因此替換double rad = Math.acos( v1x * v2x + v1y * v2y ); double rad = Math.atan2( v2y,v2x) - Math.atan2(v1y,v1x); 你應該沒事。

從點中創建兩個向量並使用點積

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM