【问题标题】:How to calculate an angle of a right triangle knowing two sides? [closed]如何计算知道两个边的直角三角形的角度? [关闭]
【发布时间】:2011-07-21 11:19:07
【问题描述】:

我需要计算二维空间中两点之间的角度。使用直角三角形计算它是一个好主意吗?请给我用Java代码编写的公式。谢谢!

这是我的代码:

public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                    float pTouchAreaLocalX, float pTouchAreaLocalY) {
                double angle = Math.atan2(
                        pTouchAreaLocalX - boundSpriteCenterX,
                        boundSpriteCenterY - pTouchAreaLocalY);
                angle = Math.toDegrees(angle);
                Log.i("egor", "angle " + angle);
                return true;
            };

当我在精灵周围旋转手指时,我得到了以下结果:

    07-21 16:07:00.736: INFO/egor(12600): angle -11.401802094139539
07-21 16:07:00.786: INFO/egor(12600): angle -11.349729213136412
07-21 16:07:00.826: INFO/egor(12600): angle -11.422536712363058
07-21 16:07:00.956: INFO/egor(12600): angle -11.234933754467884
07-21 16:07:00.986: INFO/egor(12600): angle -10.762776313908919
07-21 16:07:01.026: INFO/egor(12600): angle -10.18502866163197
07-21 16:07:01.086: INFO/egor(12600): angle -8.791364033967513
07-21 16:07:01.126: INFO/egor(12600): angle -7.51789397098733
07-21 16:07:01.266: INFO/egor(12600): angle -5.964822509364536
07-21 16:07:01.266: INFO/egor(12600): angle -3.8833834235199327
07-21 16:07:01.316: INFO/egor(12600): angle -3.518004982991794
07-21 16:07:01.316: INFO/egor(12600): angle -3.2335041547308747
07-21 16:07:01.356: INFO/egor(12600): angle -2.8893793853454013
07-21 16:07:01.366: INFO/egor(12600): angle -2.591166578194567
07-21 16:07:01.396: INFO/egor(12600): angle -2.4890755982704613
07-21 16:07:01.426: INFO/egor(12600): angle -2.4041628132172432
07-21 16:07:01.466: INFO/egor(12600): angle -2.606754218788734
07-21 16:07:01.486: INFO/egor(12600): angle -2.9585030905373477
07-21 16:07:01.516: INFO/egor(12600): angle -3.203094764102693
07-21 16:07:01.546: INFO/egor(12600): angle -4.143849229994
07-21 16:07:01.576: INFO/egor(12600): angle -4.833402961115934
07-21 16:07:01.596: INFO/egor(12600): angle -5.201363076921709
07-21 16:07:01.626: INFO/egor(12600): angle -7.182189581196999
07-21 16:07:01.666: INFO/egor(12600): angle -8.30009901770206
07-21 16:07:01.706: INFO/egor(12600): angle -10.305907456087617
07-21 16:07:01.746: INFO/egor(12600): angle -11.845396664651743
07-21 16:07:01.776: INFO/egor(12600): angle -13.486956315730428
07-21 16:07:01.796: INFO/egor(12600): angle -14.928485252180119
07-21 16:07:01.826: INFO/egor(12600): angle -15.930527466185383
07-21 16:07:01.856: INFO/egor(12600): angle -17.523214080867536
07-21 16:07:01.876: INFO/egor(12600): angle -18.670097079838413
07-21 16:07:01.906: INFO/egor(12600): angle -19.784066963586145
07-21 16:07:01.946: INFO/egor(12600): angle -20.967697211428263
07-21 16:07:01.966: INFO/egor(12600): angle -22.839177072269344
07-21 16:07:01.986: INFO/egor(12600): angle -23.995902815112903
07-21 16:07:02.026: INFO/egor(12600): angle -24.94729858380699
07-21 16:07:02.046: INFO/egor(12600): angle -25.824795978977953
07-21 16:07:02.066: INFO/egor(12600): angle -26.163619752371858
07-21 16:07:02.106: INFO/egor(12600): angle -27.036651116353283
07-21 16:07:02.126: INFO/egor(12600): angle -27.392238974828167
07-21 16:07:02.266: INFO/egor(12600): angle -28.076676644069305
07-21 16:07:02.276: INFO/egor(12600): angle -28.49774854622218
07-21 16:07:02.316: INFO/egor(12600): angle -28.408406568602896
07-21 16:07:02.316: INFO/egor(12600): angle -28.323322872571392
07-21 16:07:02.356: INFO/egor(12600): angle -28.24684157963425
07-21 16:07:02.366: INFO/egor(12600): angle -28.115274003009183
07-21 16:07:02.406: INFO/egor(12600): angle -27.97540955255425
07-21 16:07:02.426: INFO/egor(12600): angle -27.947947494965728
07-21 16:07:02.446: INFO/egor(12600): angle -27.908408445343735
07-21 16:07:02.486: INFO/egor(12600): angle -27.621472392453533
07-21 16:07:02.506: INFO/egor(12600): angle -27.31775291690124
07-21 16:07:02.526: INFO/egor(12600): angle -26.84707894871403
07-21 16:07:02.556: INFO/egor(12600): angle -26.573497423338885
07-21 16:07:02.586: INFO/egor(12600): angle -25.553344674326492
07-21 16:07:02.606: INFO/egor(12600): angle -24.681035396816615
07-21 16:07:02.646: INFO/egor(12600): angle -23.164315738891876
07-21 16:07:02.686: INFO/egor(12600): angle -22.001937944957152
07-21 16:07:02.696: INFO/egor(12600): angle -21.108728821882377
07-21 16:07:02.726: INFO/egor(12600): angle -20.777362892583056
07-21 16:07:02.756: INFO/egor(12600): angle -20.331914563591184
07-21 16:07:02.776: INFO/egor(12600): angle -19.842422968714942
07-21 16:07:02.796: INFO/egor(12600): angle -18.943202330016586
07-21 16:07:02.836: INFO/egor(12600): angle -17.900217339627066
07-21 16:07:02.886: INFO/egor(12600): angle -16.38438849186955
07-21 16:07:02.896: INFO/egor(12600): angle -15.49309440885704
07-21 16:07:02.916: INFO/egor(12600): angle -14.663361857753415
07-21 16:07:02.956: INFO/egor(12600): angle -14.06291160310325
07-21 16:07:02.976: INFO/egor(12600): angle -13.743513115207124
07-21 16:07:02.996: INFO/egor(12600): angle -13.436847871994882
07-21 16:07:03.076: INFO/egor(12600): angle -13.436847871994882

【问题讨论】:

  • 两点不足以确定角度,还需要第三点(或直线)。原点,轴之一?
  • 这个问题毫无意义。您只能计算 3 个点或 2 条线之间的角度。你是追求轴承吗?请更好地解释并举例说明您要实际找到的内容。
  • @Egor 你的意思是,给定点 A 和 B,OA 和 OB 线之间的角度来自坐标系原点(“零点”)O 吗?
  • @Mark Fisher,对不起,理解我的错误。我有一张照片,我需要在围绕它旋转手指的同时旋转它。图形的顶部必须始终注视手指,尽管有两条线:一条从图形中心向上,第二条从图形中心到手指。

标签: java algorithm math geometry


【解决方案1】:

在屏幕坐标中(原点在左上角并且 Y 向下增加)如果图像的中心是 (x0,y0) 并且“手指”在 (xa,ya) 那么你需要的角度是

Math.atan2(xa-x0,y0-ya)

这将为您提供以弧度为单位的角度,您必须将图像从其起始位置顺时针旋转。

【讨论】:

  • 你能说得更具体点吗?我正在使用一个坐标系,其中 X 指向右侧,Y 指向上方。如果您使用的是屏幕像素坐标,您可能需要更改 Y 的符号。结果以弧度为单位。我想不出还有什么“行不通”的。
  • 我在标准坐标系中工作,其中 (0,0) 位于屏幕的左上角。我有一个数字,最初是向上看的。当我用手指在屏幕上点击时,我希望图形转向我手指的点击。表示我想在正 Y 轴和手指触摸之间的角度上旋转它。
  • 好的,我已经为你更改了 y 的符号。
【解决方案2】:

我同意上面 Ben 的解决方案,这里有一些代码给出了所有 4 个象限和边缘的示例

public class CalculateAngle {
    public static void main(String[] args) {
        System.out.println(angleInDegrees(100, 100, 100, 0)); // directly above centre = 0.0
        System.out.println(angleInDegrees(100, 100, 200, 100)); // directly to the right = 90.0 
        System.out.println(angleInDegrees(100, 100, 0, 100)); // directly to the left = -90.0 
        System.out.println(angleInDegrees(100, 100, 100, 200)); // directly below centre = 180.0
        System.out.println(angleInDegrees(100, 100, 200, 0)); // 45 degrees to right and above = 45.0
        System.out.println(angleInDegrees(100, 100, 0, 0)); // 45 degrees to left and above = -45.0
        System.out.println(angleInDegrees(100, 100, 0, 200)); // 45 degrees to left and below = -135.0
        System.out.println(angleInDegrees(100, 100, 200, 200)); // 45 degrees to the right and below = 135.0
    }

    public static double angleInDegrees(double centreX, double centreY, double pointX, double pointY) {
        return Math.atan2(pointX - centreX, centreY - pointY) * 180.0F / Math.PI;
    }
}

只需删除 * 180.0F / Math.PI 即可返回以弧度为单位的角度以用于旋转。

【讨论】:

  • 感谢您的测试!您还可以使用 Math.toDegrees() 和 Math.toRadians() 进行转换。
  • 它似乎无法正常工作,可能我错过了一些东西。请检查我的帖子,我已经用我的代码和我得到的值对其进行了编辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多