Java 如何计算直角三角形的一个角,知道两边?

Java 如何计算直角三角形的一个角,知道两边?,java,algorithm,math,geometry,Java,Algorithm,Math,Geometry,我需要计算二维空间中两点之间的角度。用直角三角形计算它是个好主意吗?请给我用Java代码编写的公式。谢谢大家! 这是我的密码: public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { double angle = Math.atan2(

我需要计算二维空间中两点之间的角度。用直角三角形计算它是个好主意吗?请给我用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
在屏幕坐标中(原点位于左上角,Y向下增加),如果图像的中心是(x0,y0),且“手指”位于(xa,ya),则所需的角度为

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

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

我同意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
即可返回旋转时使用的弧度角度。

可能重复的两点不足以确定角度,您需要第三个点(或直线)。原点,轴心之一?这个问题毫无意义。只能计算3个点或2条线之间的角度。你想要轴承吗?请更好地解释并举例说明您试图实际找到的内容。@Egor您的意思是,给定点A和B,线OA和OB之间的角度来自坐标系原点(“零点”)O?@Mark Fisher,对不起,理解我的错误。我有一张图片,我需要在旋转手指的同时旋转它。图的顶部必须始终朝向手指,尽管有两条线:一条从图的中心向上,第二条从图的中心到手指。你能更具体一点吗?我使用的是一个坐标系,其中X指向右侧,Y指向上方。如果使用屏幕像素坐标,则可能需要更改Y的符号。结果以弧度为单位。我想不出还有什么东西“不起作用”。我在一个标准坐标系中工作,其中(0,0)位于屏幕的左上角。我有一个数字,最初是向上看的。当我在屏幕上轻触我的手指时,我希望图形转到我的手指轻触。意思是我想在正Y轴和我的手指触摸之间的角度旋转它。好的,我已经为您更改了Y的符号。谢谢您的测试!您还可以使用Math.toDegrees()和Math.toRadians()来进行转换。它似乎工作不正常,可能我遗漏了什么。请检查我的帖子,我已经用我得到的代码和值编辑了它。非常感谢。