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

В настоящее время я работаю над игрой в LBP2, в которой изменен способ ввода данных контроллером. Этот вопрос: Как я могу преобразовать координаты на квадрате в координаты на круге? Очень помог мне в том, что я делаю, но у меня есть одна проблема. Мне нужна функция, обратная той, которую они дают. Они идут от квадрата -> круга, и я пытался повсюду искать, как сопоставить круг с квадратом.

Функция, заданная в предыдущем вопросе:

xКруг = xКвадрат * sqrt(1 - 0,5*yКвадрат^2)

yCircle = ySquare * sqrt(1 - 0,5*xSquare^2)

Из Сопоставление квадрата с кругом

На мой вопрос заданы xCircle и yCircle... как мне найти xSquare и ySquare?

Я испробовал всю известную мне алгебру, заполнил две страницы заметками, пытался получить wolfram alpha, чтобы получить обратные функции, но эта проблема выше моих сил.

Спасибо, что заглянули.


person Jonathan Gawrych    schedule 03.11.2012    source источник
comment
Wolfram Alpha говорит   -  person YXD    schedule 03.11.2012


Ответы (4)


x = ½ √( 2 + u² - v² + 2u√2 ) - ½ √( 2 + u² - v² - 2u√2 )
y = ½ √( 2 - u² + v² + 2v√2 ) - ½ √( 2 - u² + v² - 2v√2 )

Примечание к обозначениям: я использую x = xSquare, y = ySquare, u = xCircle и v = yCircle;

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

отображение сетки

Для реализации уравнений на C++ перейдите по адресу
http://squircular.blogspot.com/2015/09/mapping-circle-to-square.html

Дополнительные примеры изображений см. на http://squircular.blogspot.com.
Также см. http://arxiv.org/abs/1509.06344 для доказательства/вывода

Это отображение является обратным

u = x √( 1 - ½ y² )
v = y √( 1 - ½ x² )


P.S. Отображение не уникально. Есть и другие отображения. Рисунок ниже иллюстрирует неуникальность отображения.

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

person Ch Fong    schedule 04.09.2015

если у вас есть xCircle и yCircle, это означает, что вы находитесь на круге с радиусом R = sqrt(xCircle^2 + yCircle^2). Теперь вам нужно расширить этот круг до квадрата с половиной стороны = R,

if (xCircle < yCircle)
     ySquare = R, xSquare = xCircle * R/yCircle
else
     xSquare = R, ySquare = yCircle * R/xCircle

это для первого квадранта, для других нужна некоторая тривиальная настройка со знаками

person panda-34    schedule 03.11.2012

Есть много способов сделать это; вот один простой способ.

Представьте себе круг радиуса R с центром в начале координат и квадрат со стороной 2R с центром в начале координат. Мы хотим отобразить все точки внутри и на границе окружность (с координатами (x,y)) к точкам внутри и на границе квадрата. Обратите внимание, что мы также можем описать точки внутри круга, используя полярные координаты (r, ø) (предполагается, что это фи), где

x = r cos ø,
y = r sin ø

(т. е. r^2 = x^2 + y^2 и r ‹= 1). Затем представьте другие координаты x' = a(ø) x = a(ø) r cos ø и y' = a(ø) y (т.е. мы решаем, что a не будет зависеть от r).

Чтобы сопоставить границу круга (r = 1) с границей квадрата (x' = R), мы должны иметь для ø ‹ 45 градусов, x' = a(ø) R cos ø = R, поэтому должно быть a(ø) = 1/cos ø. Точно так же для 45 ‹ ‹ ‹ 90 мы должны иметь границу карты круга с y' = R, что дает a(ø) = 1/sin ø в этом регионе. Продолжая движение по кругу, мы видим, что a(ø) всегда должно быть положительным, поэтому окончательное отображение круга в квадрат равно

x' = a(ø) x,
y' = a(ø) y

куда

ø = |arctan y/x| = arctan |y/x|

а также

a(ø) = 1/cos ø, когда ø ‹= 45 градусов (т. е. когда x ‹ y), и
a(ø) = 1/sin ø, когда ø > 45 град.

Это немедленно дает вам отображение в другом направлении. Если у вас есть координаты (x', y') на квадрате (где x' ‹= R и y' ‹= R), тогда

x = x'/a(ø)
y = y'/a(ø)

с a(ø), как указано выше.


Однако гораздо более простым преобразованием является вычисление (r, ø) для нужного положения на окружности и сопоставление его с x' = r и у' = ø. Это также преобразует каждую точку круга в прямоугольник и наоборот и может иметь лучшие свойства, в зависимости от того, что вы хотите сделать.

Так что это реальный вопрос: что вы на самом деле стремитесь сделать здесь?

person Norman Gray    schedule 13.12.2014

Я реализовал решение выше, но результаты не удовлетворяют. Координаты квадрата не точны.

Вот простой контрпример:

  • Рассмотрим точку (x,y)=(0,75, 1) на квадрате.
  • Мы сопоставляем его с кругом с (u, v) = (0,53, 0,85) на круге.
  • Применяя выражение выше, мы получаем новые квадратные координаты

    (x',y')=(u/v,r)=(0,625543242, 1) с r=(u^2+v^2)^(1/2).

Эта точка близка, но не является ожидаемым точным решением.

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

I) u = x*(1-y^2/2)^(1/2)
II) v = y*(1-x^2/2)^(1/2)

В итоге получается 8 корневых точек в качестве решения. Один из корней, который я внедрил в Excel-VBA, который я представляю здесь ниже, работает очень хорошо.

' given the circle coordinates (u,v) caluclates the x coordinate on the square
Function circ2sqrX(u As Double, v As Double) As Double
    Dim r As Double, signX As Double, u2 As Double, v2 As Double, uuvv As Double, temp1 As Double
    u2 = u * u
    v2 = v * v
    r = Sqr(u2 + v2)
    signX = 1
    If v = 0 Or u = 0 Then
       circ2sqrX = u
       Exit Function
    End If
    If u < 0 Then
    signX = -1
    End If
    If Abs(u) = Abs(v) And r = 1 Then
       circ2sqrX = signX
       Exit Function
    End If
    uuvv = (u2 - v2) * (u2 - v2) / 4
    temp1 = 2 * Sqr(uuvv - u2 - v2 + 1)
    circ2sqrX = -((temp1 - u2 + v2 - 2) * Sqr(temp1 + u2 - v2 + 2)) / (4 * u)
End Function

' given the circle coordinates (u,v) caluclates the y coordinate on the square
' make use of symetrie property
Function circ2sqrY(u As Double, v As Double) As Double
    circ2sqrY=circ2sqrX(v,u)
End Function
person Maybe    schedule 11.12.2014