寻找一种方法将 pan/tilt 方向反转回 x, y

Looking for a way to reverse pan/tilt orientation back to x, y

我有如下内容: 输入 x, y 和 h 以获得平移和倾斜方向

        double dz = Math.sqrt( x*x + y*y );
        double rotPan = Math.toDegrees(Math.atan(x / y));
        double rotTilt = Math.toDegrees(Math.atan( h / dz ));

是否可以将Math only with h给到起点,达到初始的x和[=16? =]y 值?

您所要做的就是重新排列方程式。

        double dz = Math.sqrt( x*x + y*y );
        double rotPan = Math.toDegrees(Math.atan(x / y));
        double rotTilt = Math.toDegrees(Math.atan( h / dz ));

给定rotTilt,你可以计算hdz的比率:

double hOverDz = Math.tan(Math.toRadians(rotTilt));

所以如果你知道h,你可以计算dz:

dz = h / Math.tan(Math.toRadians(rotTilt));

给定rotPan,你可以计算xy的比率:

double xOverY = Math.tan(Math.toRadians(rotPan));

所以:

x = y * xOverY;

代入和重新排列:

dz = sqrt(y^2 * xOverY^2 + y*y)
   = sqrt((xOverY^2 + 1) * y*y)
dz = y * sqrt(1 + xOverY^2) 

y  = dz / sqrt(1 + xOverY^2)
   = h / (tan(rotTilt) * sqrt(1 + xOverY^2))

y  = h / tan(rotTile) * sqrt(1 + tan(rotPan)^2))

因此

x  = y * xOverY
   = (h / tan(rotTile) * sqrt(1 + tan(rotPan)^2))) * tan(rotPan)

从 Andy Turner 那里输入信息并弄清楚它的确切含义后,我得到:

    double dz = h / Math.tan(Math.toRadians(rotTilt));
    double xOverY = Math.tan(Math.toRadians(rotPan));
    double x = Math.round(dz / Math.sqrt(1 + xOverY*xOverY));
    double y = Math.round(x * xOverY);

    if (pan > 90 || pan < 0) { x *=-1; y *=-1; }    // sign correction if angel > 90 or < 0

我不知道,如果 angel > 90 或 < 0(如果在我的示例中为负值(x 或 y),它会发生),是否有其他方法因为错误的结果。

编辑: 好的,它不起作用。如果我把 rotPan = 90 和 rotTilt = any, dx 和 dy 总是 0

我不明白你的解决方法或者有问题。

double x = dz * Math.sin(Math.toRadians(rotPan)); 
double y = dz * Math.cos(Math.toRadians(rotPan));

很遗憾,无法完全恢复初始值。

例如,x = 2 和 y = 5 将为您提供与 x = -2 和 y = -5 完全相同的 dz、rotPan(和 rotTilt,这不是必需的)。所以你能做的最好的事情就是恢复 (x, y) 两个坐标可能的符号变化。顺便说一句,你可以避免这个问题,如果你使用 atan2 函数而不是 atan:

double dz = Math.hypot(x, y);
double rotPan = Math.toDegrees(Math.atan2(x, y));
double rotTilt = Math.toDegrees(Math.atan2(h, dz));

如果你用上面的公式计算rotPan和rotTilt,那么我post上面的公式总是给你初始坐标(有数值误差的限制)。