Как я могу преобразовать координаты на квадрате в координаты на окружности? - PullRequest
10 голосов
/ 25 октября 2009

Я разрабатываю инди-видеоигру и работаю в предположении, что, поскольку джойстик на моем контроллере имеет круговой диапазон движения, он возвращает «круговые» координаты; то есть декартовы координаты ограничены круговой областью (радиуса 1). На самом деле, координаты являются «квадратными»; например, верхнее правое положение большого пальца регистрируется как x = 1, y = 1. Когда я преобразовываю координаты из декартовой в полярную, величина может превышать 1, что приводит к тому, что игрок может двигаться по диагонали быстрее, чем по вертикали или горизонтали.

Итак, чтобы уточнить, я хочу записать положение аналогового джойстика с точки зрения направления и величины, где величина находится в диапазоне от 0 до 1. Этот джойстик возвращает координаты на квадратной плоскости, так что просто преобразовав Декартово-полярное недостаточно. Я думаю, что мне нужно преобразовать координату пробел , но это ограничивает мой мозг обезьяны.

Ответы [ 3 ]

17 голосов
/ 25 октября 2009

См. Отображение квадрата в круг . Там также хорошая визуализация для отображения. Вы получаете:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
9 голосов
/ 14 февраля 2016

Отображение не является уникальным. Есть много других решений этого вопроса.

Например, это отображение также будет работать

u = x √ (x² + y² - x²y²) / √ (x² + y²)

v = y √ (x² + y² - x²y²) / √ (x² + y²)

где (u, v) - круговые координаты диска и (x, y) - квадратные координаты.

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

circular Brady bunch


squared Boston Celtics

For a C++ implementation этого другого сопоставления, перейдите к
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
См. http://squircular.blogspot.com для получения дополнительных изображений результатов картирования.

См. Также "Аналитические методы построения квадратов диска" для статьи, в которой обсуждаются различные уравнения отображения с доказательствами и выводами.

0 голосов
/ 25 октября 2009

Разделите каждое значение на величину, чтобы нормализовать все значения к единичному вектору, например,

magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;

Однако это может привести к отсечке величины вместо нормализации для внутренних значений. То есть, вы получите то же значение для контроллера, «полностью» вставленного в верхний левый угол, и контроллера почти полностью сдвинут в том же направлении.

...