【问题标题】:Transform points between two screens在两个屏幕之间转换点
【发布时间】:2019-01-10 12:51:09
【问题描述】:

我有大量的点想要在脚本中从一个屏幕/监视器转换到另一个。

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

• 黑匣子:屏幕/监视器。
• 绿色框:屏幕的一部分,所有点都将从 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的正确方法是什么?

【问题讨论】:

    标签: geometry transformation resolution scaling coordinate-transformation


    【解决方案1】:

    当然,公式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

    【讨论】:

    • 我可以确认这是完美的 :) 我感觉那些内部矩形对结果有一些影响——我只是无法描述如何。至于 X_New 加倍,我使用的应用程序只有在我将坐标减半时才准确,所以我必须开始使用应用程序中的值进行计算 - 因此加倍。
    猜你喜欢
    • 2015-04-15
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多