寻找一种方法将 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
,你可以计算h
与dz
的比率:
double hOverDz = Math.tan(Math.toRadians(rotTilt));
所以如果你知道h
,你可以计算dz
:
dz = h / Math.tan(Math.toRadians(rotTilt));
给定rotPan
,你可以计算x
与y
的比率:
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上面的公式总是给你初始坐标(有数值误差的限制)。
我有如下内容: 输入 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
,你可以计算h
与dz
的比率:
double hOverDz = Math.tan(Math.toRadians(rotTilt));
所以如果你知道h
,你可以计算dz
:
dz = h / Math.tan(Math.toRadians(rotTilt));
给定rotPan
,你可以计算x
与y
的比率:
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上面的公式总是给你初始坐标(有数值误差的限制)。