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