5

enter image description hereпреобразовательные координаты одного прямоугольника на другой прямоугольник

в изображении выше я показал два прямоугольника

  • прямоугольник 1 которого х может варьироваться от -900 до 13700 и Y может изменяться от - от 600 до 6458
  • прямоугольник 2, координата X может изменяться от 0 до 3000, и у может изменяться от 0 до 2000

также:прямоугольник 2 имеет начальную точку в левой верхней позиции (0,0), тогда как прямоугольника 1 имеет начальную точку (ширина/2, высота/2).

Что мне нужно сделать: преобразовать точку в прямоугольника 1 к точке из прямоугольника 2 используя масштабирование или перевод.

Итак, что должно быть коэффициент масштабирования для x и y координаты для того, чтобы преобразовать координаты прямоугольника 1 в прямоугольник 2?

+0

Новый пункт находится на «одном» месте в следующем прямоугольнике? –

+0

да было бы там же –

+0

Даже в любом случае я хочу относительное позиционирование среди точек –

ответ

4

Если:

Rectangle 1 has (x1, y1) origin and (w1, h1) for width and height, and 
Rectangle 2 has (x2, y2) origin and (w2, h2) for width and height, then 

Given point (x, y) in terms of Rectangle 1 coords, to convert it to Rectangle 2 coords: 

xNew = ((x-x1)/w1)*w2 + x2; 
yNew = ((y-y1)/h1)*h2 + y2; 

ли вычисление с плавающей точкой и преобразовать обратно в целое после, чтобы избежать возможного переполнения.


В C#, выше будет выглядеть примерно так:

PointF TransformPoint(RectangleF source, RectangleF destination, PointF point) 
{ 
    return new PointF(
     ((point.X - source.X)/source.Width) * destination.Width + destination.X, 
     ((point.Y - source.Y)/source.Height) * destination.Height + destination.Y); 
} 
+0

@Peter Duniho Спасибо за редактирование, показывающее пример C#. (и да, я знаю, что комментирование просто для того, чтобы благодарить, это своего рода нарушение правил, но правила написаны, чтобы делать исключения) – ElektroStudios

+0

У кого-нибудь были ошибки округления с помощью этого метода?Я использую это, и я нахожу, что иногда мне нужно Round Up, чтобы получить правильный Point, и иногда мне нужно округлить. Следует ли использовать коэффициент масштабирования? –

0

Попробуйте использовать это:

rectangelOne.x = rectangelTwo.x + rectangelTwo.width/2; 
rectangelOne.y = rectangelTwo.y + rectangleTwo.height/2; 

если стержень вашего rectangleOne является правильно она должна быть сфокусирована автоматически, otherwhise добавить это:

rectangleOne.x -= rectangleOne.width/2; 
rectangleTwo.y -= rectangleOne.height/2; 

надеюсь, что это поможет.

0
float transformValue (float x,float A,float B, float C, float D){ 

    return C + ((x-A) * (D-C)/(B-A)); 

}