两个屏幕之间的转换点

Transform points between two screens

我想在脚本中将大量点从一个 screen/monitor 转换为另一个。

屏幕 A - 2880x1800 分辨率
屏幕 B - 1280x1024 分辨率

• 黑框:screen/monitor.
• 绿框:屏幕的一部分,所有点都将从 C(a) 转换为 C(b)。

绿框是两个屏幕上的宽高比均为 16:9 的视频源。我实际上不确定这个绿框是否重要,但我将其包括在内是为了展示我正在尝试做的事情。

到目前为止,我已尝试遵循 this post,这似乎适用于转换 x 值:

Rectangle Old
NW coordinate - (X0_Old, Y0_Old)
SE coordinate - (X1_Old, Y1_Old)

Rectangle New
NW coordinate - (X0_New, Y0_New)
SE coordinate - (X1_New, Y1_New)

X_New = X0_New + (X_Old - X0_Old) * X_Coeff
X_New =   0    + (X_Old -   0   ) * X_Coeff
  where 
    X_Coeff = (X1_New - X0_New) / (X1_Old - X0_Old)
    X_Coeff = (1280   -   0   ) / (2880   -   0   )

X_New = (X_Old)*(1280/2880)

X_New 并不完美,但出于某种原因,这个是:
X_New = 2*(X_Old)*(1280/2880)

也许这是由于某种缩放比例造成的? x 坐标有效,所以我没有质疑它并继续前进。

当我尝试转换 Y 坐标时,我的问题来了:

Y_New = Y0_New + (Y_Old - Y0_Old) * Y_Coeff
Y_Coeff = (Y1_New - Y0_New) / (Y1_Old - Y0_Old)

Y_New = Y0_New + (Y_Old - Y0_Old) * Y_Coeff
Y_New =    0   + (Y_Old -   136 ) * Y_Coeff
  where
    Y_Coeff = (Y1_New - Y0_New) / (Y1_Old - Y0_Old)
    Y_Coeff = (  720  -   174 ) / (1620   -   136)
    Y_Coeff = 546/1484

Y_New = (Y_Old - 136) * (546/1484)

Y_New计算的Y值肯定太低了,不正确。计算 Y_New 的正确方法是什么?

当然,公式 X_New = (X_Old)*(1280/2880) 是正确的 - 它将 0 转换为 0,将 2880 转换为 1280,将 1440 转换为 640。也许您真的有某种缩放比例?

关于 Y - 在这种情况下(受 X 轴限制)您也应该对 Y 使用相同的系数 X_Coeff

但我可以看到第二个屏幕上的 16x9 矩形尺寸为 1280x720,空条纹高度为 152,而第一个屏幕尺寸为 2880x1620,空条纹高度为 90

Y_New = 152 + (Y_Old -  90) * X_Coeff

一般情况下,必须根据屏幕和视频大小矩形之间的比例选择 X_CoeffY_Coeff