Как перевести точку из одного прямоугольника в точку в масштабированном прямоугольнике? - PullRequest
1 голос
/ 29 апреля 2010

У меня есть изображение (i), которое было масштабировано от его исходного размера (rectLarge), чтобы соответствовать меньшему прямоугольнику (rectSmall). Учитывая точку p в rectSmall, как я могу перевести это в точку в rectLarge.

Чтобы сделать этот бетон, предположим, что у меня есть изображение 20x20, масштабированное до прямоугольника 10x10. Точка (1, 1) в меньшем прямоугольнике должна быть масштабирована до точки в большем прямоугольнике (т.е. (2,2)).

Я пытаюсь добиться этого с помощью:

result.x = point.x * (destRect.size.width / srcRect.size.width );
result.y = point.y * (destRect.size.height / srcRect.size.height);

Однако точки, сгенерированные этим кодом, неверны - они не отображаются на соответствующую точку на исходном изображении. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Какой язык вы используете?

Если это C, а rect.size.height и тому подобное - целые числа, то у вас есть серьезная проблема с округлением. Допустим, вы масштабируете точку 10, 10 от размера 20x20 до размера 30x30. Ваши расчеты будут выглядеть так:

result.x = 10 * (30 / 20);

Это упрощает до:

result.x = 10 * (1);

Самый простой способ исправить это - избавиться от скобок:

result.x = point.x * destRect.size.width / srcRect.size.width;
result.y = point.y * destRect.size.height / srcRect.size.height;

Теперь ваш расчет 10 * 30 / 20 упрощается до 300 / 20, а затем до 15, что вам и нужно.

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

0 голосов
/ 29 апреля 2010

Думаю, проблема в том, что ваш прямоугольник расположен не на (0, 0), и поэтому вы не можете масштабировать каждую точку внутри него так же, как вы масштабируете его размеры.

Вы должны определить смещение от некоторой точки привязки в прямоугольника (например, верхняя левая точка), то ваша полученная точка будет anchor_point.x + offset.x * (horizontal_scale_ratio) и то же самое для yvertical_scale_ratio).

Отношения: new_width / old_width и new_height / old_height.

0 голосов
/ 29 апреля 2010

Что такое «подходящая точка»? Если размер srcRect больше destRect, значит, ваш код правильный. Кроме того, не забывайте, что result.x и result.y будут числами с плавающей запятой, и чтобы использовать их на изображении, вам нужно его округлить или выполнить билинейную интерполяцию и т. Д. Прежде чем я могу дать более подробный ответ, что ты собираешься делать с result?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...