Как я могу преобразовать координаты на квадрате в координаты на окружности?
-
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;
Однако это может привести к отсечке величины вместо нормализации для внутренних значений. То есть вы получите то же значение для контроллера, помещенного " полностью " в верхнем левом углу и контроллер почти полностью выдвинут в том же направлении.