![Simplified description](https://istack.dev59.com/YVapb.webp)
![enter image description here](https://istack.dev59.com/SWfOB.webp)
首先要做的是定义参考系统(如何将“点相对于每个图像的位置”转换为数字)。我猜你想依靠一个基本的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值。例如:如果RefX_new相对于绝对坐标系(0,0)为5,而该点相对于此绝对坐标系的X值为8,则X_new将为3。
Y_new是相对于CarFrame旋转后的点的Y值(与上面的点等效)
X_old_C = X_new_C(相对于车架)+(RefX_new(车架_C)- RefX_old(车架_A))
Y_old_C = Y_new_C(相对于车架)+(RefY_new(车架_C)- RefY_old(车架_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上。
------------方法论更新
如评论所述,这些最后的图片证明了最初提出的参考计算(max.Y/min.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,即只需添加车框的左/底值(如果位于0,0,则将是最终值)。