Преобразование координат одного прямоугольника в другой прямоугольник

введите описание изображения здесь

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

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

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

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

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


person Yogesh    schedule 17.12.2013    source источник
comment
Находится ли новая точка на «том же» месте в следующем прямоугольнике?   -  person Jeroen van Langen    schedule 17.12.2013
comment
да, это было бы на том же месте   -  person Yogesh    schedule 17.12.2013
comment
Как бы то ни было, я хочу относительное позиционирование между точками   -  person Yogesh    schedule 17.12.2013
comment
дублировать с ответом: stackoverflow.com/questions/20536770/   -  person MBo    schedule 17.12.2013
comment
MBo, это тот же вопрос, который я опубликовал   -  person Yogesh    schedule 17.12.2013
comment
Rectangle1 может варьироваться от -900 до 13700, но ваше начало (ширина / 2, высота / 2) вы говорите ?? Этот вид предполагает, что вы используете 2 отдельные системы координат в ОДНОМ прямоугольнике. Ваши точки внутри прямоугольника указаны от другого источника к углам прямоугольника ??   -  person mathematician1975    schedule 17.12.2013


Ответы (2)


If:

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);
}
person Matthew Watson    schedule 17.12.2013
comment
@Peter Duniho Спасибо за редактирование, показывающее пример C #. (и да, я знаю, что комментирование просто в знак благодарности - это своего рода нарушение правил, но правила написаны для исключения) - person ElektroStudios; 21.03.2016
comment
У кого-нибудь были ошибки округления при использовании этого метода? Я использую это и обнаруживаю, что иногда мне нужно округлить, чтобы получить правильную точку, а иногда мне нужно округлить в меньшую сторону. Следует ли использовать коэффициент масштабирования? - person Robben_Ford_Fan_boy; 12.07.2016

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

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;

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

person Life of Madness    schedule 17.12.2013