Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 三角坐标几何_Java_Android_Geometry - Fatal编程技术网

Java 三角坐标几何

Java 三角坐标几何,java,android,geometry,Java,Android,Geometry,我有一个三角形ABC内接在一个圆上。点B位于圆的中心,A和C是圆上的两个点 给定的 给定AB(长度) 给定A和B的坐标 给定角度B(角度ABC) 需要 查找C的坐标 我所知道的 AB=BC,两者都是半径 我用这个做什么 我正在为android制作一个基本的3D java游戏。这将用于向左和向右查看,因此,如果您单击屏幕的右侧部分,对象将通过向角度B添加一个角度而在您周围移动 我试图查找C坐标的代码 rect.get(index)[5] = (int) ((di * Math.cos(Math.

我有一个三角形ABC内接在一个圆上。点B位于圆的中心,A和C是圆上的两个点

给定的

给定AB(长度)

给定A和B的坐标

给定角度B(角度ABC)

需要

查找C的坐标

我所知道的

AB=BC,两者都是半径

我用这个做什么

我正在为android制作一个基本的3D java游戏。这将用于向左和向右查看,因此,如果您单击屏幕的右侧部分,对象将通过向角度B添加一个角度而在您周围移动

我试图查找C坐标的代码

rect.get(index)[5] = (int) ((di * Math.cos(Math.toRadians(angle-90)))+.5);
rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5);
rect.get(index)[5] = shapes x coord 
rect.get(index)[6] = shapes y coord 

di = radius length 
angle = angle B
我添加了
.5
,这样当坐标被截断时,它就被四舍五入了

我的完整代码

    double di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]);
    double side1 = di;
    System.out.println("Side1: "+ side1);
    double side2 = side1;
    System.out.println("Side2: "+ side2);
    double side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di);
    System.out.println("Side3: "+ side3);

    double angle = ((side1*side1)+(side2*side2)-(side3*side3));
    angle = angle/(2*side1*side2);
    angle = Math.acos(angle)*(180/Math.PI);
    System.out.println("Angle: "+angle);
    if(playerx > rect.get(index)[5]){
        if(lookdirection.equals("left")){
            angle += 5;
        }
        if(lookdirection.equals("right")){
            angle -= 5;
        }
    }
    else{
        if(lookdirection.equals("left")){
            angle -= 5;
        }
        if(lookdirection.equals("right")){
            angle += 5;
        }
    }
    System.out.println("Angle: "+angle);

    rect.get(index)[5] = -(di * Math.cos(Math.toRadians(angle-90)));
    rect.get(index)[6] = -(di * Math.sin(Math.toRadians(angle-90)));

    di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]);
    side1 = di;
    System.out.println("Side1: "+ side1);
    side2 = side1;
    System.out.println("Side2: "+ side2);
    side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di);
    System.out.println("Side3: "+ side3);
    angle = ((side1*side1)+(side2*side2)-(side3*side3));
    angle = angle/(2*side1*side2);
    angle = Math.acos(angle)*(180/Math.PI);
    System.out.println("Angle: "+angle);

    repaint();
}
角度现在正在工作,但X和Y坐标 但是


正在获取非常大/很小的值。他们应该与B点保持“di”距离。

更新

这似乎是一个几何问题! 我还没有测试你的代码,但我想你想要的是而不是

rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5);
但是

试着想象你在做什么,并检查对称、移位和周期下的身份。图像正在沿x轴旋转和反射,与您现在所做的一致。您还必须处理舍入问题。如果坐标接近0,则图像可能不会移动


我的建议是将坐标保持为双倍,并且仅在将它们渲染为像素而不覆盖其值时才对其进行取整

我获取的C坐标线不正确。我根据您的描述添加了一张图片-希望它是正确的。谢谢,由于某些原因,我的角度略微偏离(.02-.1)尽管我不再绕圈子了。然后它被卡住了,重复着:
Side1:101 Side2:101 Side3:170 Angle:114.61556569086147 Angle:115.61556569086147 Side1:101 Side2:101 Side3:170 Angle:114.615565656908617
,这是因为你一直在舍入其他所有东西。你为什么不用双打?也可以尝试打印每个点的坐标。如果你有一个像(100,3)这样的点,在旋转变成(99.6,3.1)之后,在你的舍入之后,它保持不变,你会得到相同的结果。当你必须画一个像素时,你只需要得到一个整数值。我现在使用的是double,我有一个新的数组列表,它将double取整为int,然后我画这个数组列表。你的代码对角度有效,但当我测试它时,转换的x和y都是非常大/小的数字。我不建议使用减号(-)在这两个方程中。我还提供了一个链接,这样你可以简化三角方程,例如sin(angle-90)=-sin(90 angle)=-cos(angle)。如果这更让人困惑,就让它保持原样吧。试着理解每一个方程式的作用。如果你还不知道的话,试着学习三角学。我知道这很难。让我知道当你让它工作
rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5);
rect.get(index)[6] = (int) (-(di * Math.sin(Math.toRadians(angle-90)))+.5);