Преобразование между квадратными и прямоугольными координатами пикселей - PullRequest
2 голосов
/ 29 марта 2010

Я новичок в использовании преобразований и этого типа математики, и был бы признателен за некоторые направления решения моей проблемы кодирования. Я пишу в XCode для iphone и работаю с CGraphics.

Проблема: В Xcode я хочу рисовать кривые, линии и т. Д. На экране из квадратных пикселей. Затем преобразуйте эти точки, как можно ближе, в неквадратную пиксельную систему.

Например, если исходная система координат имеет размер 500 x 500 пикселей, отображаемых на квадратном экране размером 10 на 10 дюймов, я рисую круглый круг с формулой круга. Смотрится кругом, и все хорошо.

Теперь я рисую такой же круг на втором экране размером 10 x 10 дюймов с разрешением 850 на 500 пикселей. Без изменения координат, тот же самый круговой формул отображает нечто, похожее на яйцо.

Как нарисовать круг на втором экране в другой системе координат? И кроме того, мне нужно получить доступ к множеству точек x, y системы индивидуально.

с

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Это простая проблема преобразования ваших мировых координат в экранные координаты.

Я понимаю, что первоначальный вопрос был о кругах, но я собираюсь использовать квадрат в интересах более простых примеров псевдокода и математики.

Рассмотрим простой пример, где вы собираетесь нарисовать квадрат, который вы смоделировали как один угол в [0, 0] и противоположный угол в [1, 1] в мировых координатах. То, что вы хотели бы видеть на первом примере экрана (с пикселями, которые растягиваются от 0 до 500 в каждом измерении) - это один угол в [0, 0], а другой в [500, 500] в пиксельном пространстве.

Это простое матричное преобразование, известное как масштабная матрица . Вкратце, матрица масштабирования, в которой вы нуждаетесь, будет иметь одинаковый коэффициент масштабирования для каждого из диагональных элементов и нулей везде. Записанный в виде псевдокода (используя * в качестве операции умножения матрицы на вектор ), мы можем сказать, что:

worldCorner0 = {0, 0};
scaleMatrix = {500, 0,
               0, 500};
pixelCorner0 = scaleMatrix * worldCorner0;

worldCorner1 = {1, 1};
pixelCorner1 = scaleMatrix * worldCorner1;

Результат будет pixelCorner0 = {0, 0} и pixelCorner1 = {500, 500}.

Теперь в другом примере у вас экран неквадратный, но вы все равно хотите нарисовать свой квадрат без искажений. Вам по-прежнему нужна масштабная матрица, но, если вы хотите видеть весь квадрат на экране, вы должны продолжать масштабирование на наименьшее количество пикселей в размерах экрана. Если вы использовали большее число, квадрат расширится от видимой области (но все равно останется квадратом).

В вашем случае максимальный размер второго экрана составляет 800 пикселей в одном измерении и 500 - в другом. Удобно, что у вас уже есть масштабная матрица, которая масштабируется на 500 пикселей. Если вы нарисуете пиксельные углы, описанные выше, вы сохраните свою геометрию независимо от размеров экрана.

0 голосов
/ 29 марта 2010

Вам нужно аффинное преобразование и простое, просто масштабируемое.См. Википедия в разделе Примеры в 2D-графике и вам нужен масштабируемый фрагмент.

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