【问题标题】:Looking for a way to reverse pan/tilt orientation back to x, y寻找一种将平移/倾斜方向反转回 x、y 的方法
【发布时间】:2021-05-10 09:02:48
【问题描述】:

我有如下内容: 输入 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 ));

是否可以仅将 h 指定为起点并达到初始 xy 值来反转 Math 的效果?

【问题讨论】:

  • 除了你的问题:用Math.hypot(x, y)代替Math.sqrt(x * x + y * y),用Math.atan2(x, y)代替Math.atan(x / y)(其他atan也一样)。
  • 谢谢,我改变了那些。仍然对反向 x/y 感兴趣:-)
  • 只是重新排列方程。在纸上做,会容易得多。

标签: java math trigonometry


【解决方案1】:
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,那么我帖子顶部的公式将始终为您提供初始坐标(具有数值误差的限制)。

【讨论】:

  • 是的,现在可以了,谢谢。必须为 x 更改 cos,为 y 更改 sin,但现在它可以作为附魔。如果你知道怎么做就很容易;-)
【解决方案2】:

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

        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)

【讨论】:

  • 不太容易理解,因为我不是数学家,但我想我有办法。
【解决方案3】:

在安迪·特纳(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 或

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

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

【讨论】:

  • 如果 rotTilt = 90 表示 h/dz 的反正切为 90 度,但表示 h/dz 为正无穷大。所以这意味着 dz = 0 也就不足为奇了,所以 dx 和 dy 都是零。换句话说,对于任何非零 dx 和 dy,您都无法获得 rotTilt = 90(好吧,除非 h 是正无穷大......)
  • 我的错误:我的意思是 rotPan 不是 rotTilt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多