首先要做的是定义参考系统(如何将“点相对于每个图像的位置”转换为数字)。我猜你想依赖一个基本的 2D 参考系统,由一个点(几个 X/Y 值)给出。例如:左/下角(最小 X 和最小 Y)。
算法非常简单:
获取与
旋转形状(最小 X 和最小 Y),即确定 RefX_new 和
RefY_new。
在参考系统之间应用基本转换:
X_old = X_new + (RefX_new - RefX_old)
Y_old = Y_new + (RefY_new -
RefY_old)
------------------ 将公式与新车图片相关联的更新
RefX_old = 旋转前 CarFrame 的最小 X 值。
RefY_old = CarFrame 在旋转之前的最大 Y 值。
RefX_new = CarFrame 旋转后的最小 X 值。
RefY_new = CarFrame 旋转后的最大 Y 值。
X_new = 旋转后点相对于 CarFrame 的 X。例如:如果相对于绝对坐标系 (0,0) 的 RefX_new = 5,并且相对于这个绝对坐标系的点的 X 为 8,则 X_new 将为 3。
Y_new = 旋转后相对于 CarFrame 的点的 Y(相当于上面的点)
X_old_C = X_new_C(相对于 CarFrame) + (RefX_new(CarFrame_C) - RefX_old(CarFrame_A))
Y_old_C = Y_new_C(相对于 CarFrame) + (RefY_new(CarFrame_C) - RefY_old(CarFrame_A))
这些坐标是相对于 CarFrame 的,因此您可能必须相对于绝对框架(我猜是 0,0)更新它们,如上所述,即:
X_old_D_absolute_frame = X_old_C + (RefX_new(CarFrame_C) + RefX_global(即 0))
Y_old_D_absolute_frame = Y_old_C + (RefY_new(CarFrame_C) + RefY_global(即 0))
(尽管您应该在 CarFrame 相对于全局框架处于其“确定位置”时执行此操作,即在图片 D 上(该点相对于图片 C 和 D 中的 CarFrame 具有相同的坐标) ,但与全局框架不同)。)
这样说可能有点复杂;但这真的很简单。您只需仔细考虑一种情况并创建执行所有操作的算法。这个想法非常简单:如果我在从 5 开始的东西里面的 8 ;关于容器,我在 3 上。
------------ 方法更新
正如评论中所说,这些最后的图片证明了最初提出的参考计算(最大 Y/最小 X)是不正确的:它不应该是最大/最小。 carFrame 的值,但到较近边的最小距离(= 从左侧/底部到该点的垂直线)。
------------ 具体示例的三角计算
建议的算法是您应该在任何情况下应用的算法。尽管在这种特定情况下,最困难的部分不是从一个参考系统移动到另一个参考系统,而是在旋转系统中定义参考点。完成此操作后,将立即应用于非旋转案例。
这里你有一些计算来执行这个动作(我做得很快,所以最好把它作为一个方向,自己做);我也只考虑了图片中的情况,即左/下点的旋转:
X_rotated = dx * Cos(alpha)
其中 dx = X_orig - (max_Y_CarFrame - Y_Orig) * Tan(alpha)
Y_rotated = dy * Cos(alpha)
其中 dy = Y_orig - X_orig * Tan(alpha)
注意:dx 中的 (max_Y_CarFrame - Y_Orig) 和 dy 中的 X_orig 期望基本参考系为 0,0(最小 X 和最小 Y)。如果不是这种情况,则必须更改此变量。
X_rotated 和 Y_rotated 给出了从该点到 carFrame 最近一侧(分别为左侧和底部)的垂直距离。通过应用这些公式(我坚持:仔细分析它们),您得到 X_old_D_absolute_frame/Y_old_D_absolute_frame,也就是说,您只需添加来自 carFrame 的左/下值(如果它位于 0,0,这些将是最终的值)。