Преобразование точек между двумя экранами - PullRequest
0 голосов
/ 10 января 2019

У меня есть большая коллекция точек, которые я хочу преобразовать с одного экрана / монитора в другой в сценарии.

Экран A - разрешение 2880x1800
Экран B - разрешение 1280x1024

enter image description here

• Черный ящик: экран / монитор.
• Зеленая рамка: часть экрана, где все точки будут преобразованы из C (a) в C (b).

Зеленый прямоугольник - это видео с соотношением сторон 16: 9 на обоих экранах. На самом деле я не уверен, что этот зеленый прямоугольник имеет значение, но я включил его, чтобы показать, что я пытаюсь сделать.

До сих пор я пытался следовать этому посту , который, кажется, отлично работает для преобразования значений 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, рассчитанные с помощью Y_New, определенно слишком малы, чтобы быть правильными. Как правильно рассчитать Y_New?

1 Ответ

0 голосов
/ 10 января 2019

Определенно, формула X_New = (X_Old)*(1280/2880) верна - она ​​преобразует 0 в 0, 2880 в 1280, 1440 в 640. Возможно, у вас действительно есть какое-то масштабирование?

О Y - в этом случае (ограничено осью X) вы должны использовать тот же коэффициент X_Coeff и для Y.

Но я вижу, что прямоугольник 16x9 на втором экране имеет размер 1280x720 с пустыми полосами высотой 152, а для первого размера экрана 2880x1620 с пустыми полосами высотой 90

Y_New = 152 + (Y_Old -  90) * X_Coeff

В общем случае нужно выбрать либо X_Coeff, либо Y_Coeff в зависимости от соотношения между экраном и размером прямоугольника видео.

...