java - 度数计算不正确,哪里出错了?

标签 java math coordinates

我正在编写一个程序,它采用 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;
}

Globe

青色:开始(格林威治) 洋红色:结束(伊斯坦 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/

相关文章:

java - 监控 AWS EMR 作业运行进度的最佳实践是什么?

java - Hashmap 或 linkedhashmap 或其他任何一个对链接项进行排序哪个更好?

math - 确定两个 IP 地址是否在同一子网上 - 是否从 IP 地址中删除前导或尾随 0?

javascript - 传单 map 并不总是加载居中的相同 WMS 平铺层

java - 将点从坐标系(0,800)转换为坐标系(50,-50)jFrame<->opengl

python - 根据相邻坐标操作 pandas 数据框

java - 监听击键或按下按钮

java - 如何对具有动态属性的对象进行建模?

c++ - 具有单位 vector 约束的非线性优化

matlab - 如何创建一个根据变化的分布进行选择的函数,而不需要一遍又一遍地传递?