我正在编写一个程序,它采用 3D 坐标并将它们放置在 3D 地球仪上,投影到 2D 屏幕上。为了绕轴转动坐标,我想使用两个点(飞行的起点和终点)的法线,将其转动到 x3 轴上,然后以相同的方式转动其余点,最终计算出我需要为从 A 点到 B 点的点设置动画的点。我用来将点放在地球上的矩阵是:
public double[] genXYZ(double phi, double theta) {
double[] coords3D = new double[3];
phi = Math.toRadians(phi);
theta = Math.toRadians(theta);
coords3D[0] = Math.cos(theta) * Math.cos(phi);
coords3D[1] = Math.cos(theta) * Math.sin(phi);
coords3D[2] = Math.sin(theta);
return coords3D;
}
一切都很好。直到我尝试计算法线的 phi 和 theta 角(在我正确计算法线之后)。
public double[] getNAngles(double[] ncoords) {
double[] NAngles = new double[2];
NAngles[1] = Math.asin(Math.toRadians(ncoords[2]));
NAngles[0] = Math.acos(ncoords[0] / Math.cos(NAngles[1]));
NAngles[0] = Math.toDegrees(NAngles[0]);
NAngles[1] = Math.toDegrees(NAngles[1]);
System.out.println("N phi: " + NAngles[0]);
System.out.println("N theta: " + NAngles[1]);
return NAngles;
}
青色:开始(格林威治) 洋红色:结束(伊斯坦 boolean ) 黑色:正常 粉色:代码计算的内容,黑色有哪些角度。
提前致谢!
最佳答案
删除 Math.toRadians
调用,因为 coords
不是角度,它们是 -1..1
范围内的无量纲值
NAngles[1] = Math.asin(ncoords[2]);
还可以考虑使用 atan2
函数进行 NAgles[0]
计算,以排除符号影响和反余弦角度限制 (0..Pi
)。
NAngles[0] = Math.atan2(ncoords[1], ncoords[0]);
关于java - 度数计算不正确,哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59812252/