Как я могу преобразовать координаты на квадрате в координаты на окружности?

StackOverflow https://stackoverflow.com/questions/1621831

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)

Другие советы

Сопоставление не уникально. Есть много других решений этого вопроса.

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

  

u = x & # 8730; (x & # 178; + y & # 178; - x & # 178; y & # 178;) / & # 8730; (x & # 178; + y & # 178;)

     

v = y & # 8730; (x & # 178; + y & # 178; - x & # 178; y & # 178;) / & # 8730; (x & # 178; + y & # 178;)

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

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

 круговой пучок Брейди

<Ч>

 квадрат Бостон Селтикс

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top