Правильное решение для этого тензора - PullRequest
0 голосов
/ 18 марта 2011

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

Все тензоры в этой системе имеют форму, приведенную настраница 3, раздел 4

R [ cos(2t), sin(2t); sin(2t), -cos(2t) ]

Поле радиального тензора определяется как:

R [ yy - xx, -2xy; -2xy, -(yy-xx) ]

В моей системе я храню только R и Theta, поскольку могу вычислять тензор на основеот этой информации.Это означает, что мне нужно вычислить R и Theta для радиального тензора.К сожалению, мои попытки этого не увенчались успехом.Хотя это выглядит правильно, мое решение не работает в верхнем левом и нижнем правом квадрантах.

Приложение : Исходя из обсуждения в комментариях о том, что образ системы не работает, я будупоставьте здесь несколько жестких чисел.Все тензорное поле имеет размер 800x480, центральная точка - {400, 240}, и мы используем стандартную графическую систему координат с отрицательной осью Y (т. Е. Начало координат в верхнем левом углу).

В{400, 240}, тензор R = 0, T = 0 При {200, 120} тензор R = 2.95936E + 9, T = 2.111216 При {600, 120} тензор R = 2.95936E+9, T = 1.03037679

Я легко могу выбрать еще несколько точек, которые, по вашему мнению, могут помочь.

Код, который я использую для вычисления значений:

float x = i - center.X;
float xSqr = x * x;
float y = j - center.Y;
float ySqr = y * y;

float r = (float)Math.Pow(xSqr + ySqr, 2);
float theta = (float)Math.Atan2((-2 * x * y), (ySqr - xSqr)) / 2;
if (theta < 0)
    theta += MathHelper.Pi;

1 Ответ

2 голосов
/ 18 марта 2011

Очевидно, вы сравниваете формулы (1) и (2) статьи. Обратите внимание на скалярное кратное l = || (u_x, u_y) || в формуле (1) и идентифицируйте это с R в начале раздела. Этот фактор неявен в формуле (2), поэтому, чтобы они соответствовали друг другу, мы должны вычленить R.

Формула (2) работает со смещением от "центра" (x0,y0) радиальной карты:

x = xp - x0
y = yp - y0

для формирования заданной матрицы 2x2:

y^2 - x^2       -2xy

  -2xy      -(y^2 - x^2)

Нам нужно вычленить скаляр R из этой матрицы, чтобы получить бесследовую ортогональную матрицу 2x2, как в формуле (1):

 cos(2t)      sin(2t)

 sin(2t)     -cos(2t)

Поскольку cos^2(2t) + sin^2(2t) = 1 коэффициент R можно определить как:

 R = (y^2 - x^2)^2 + (-2xy)^2 = (x^2 + y^2)^2

оставляя бесследную ортогональную матрицу 2x2:

    C           S

    S          -C

, из которого угол 'tan (2t) = S / C` можно извлечь с помощью обратной функции триггера.

Ну, почти. Как предупреждает Велисарий, нам нужно проверить, что угол t находится в правильном квадранте. Авторы статьи пишут в начале гл. 4, что их «t» (которое относится к тензору) зависит от R >= 0 и тета (ваш t), лежащих в [0,2pi) в соответствии с формулой R [ cos(2t), sin(2t); sin(2t) -cos(2t) ].

Поскольку синус и косинус имеют период 2pi, t (тета) определяется только однозначно с интервалом длины pi. Я подозреваю, что авторы намеревались написать, что 2t лежит в [0,2pi) или, проще, что t лежит в [0, pi). Предложение Велисария использовать «эквивалент atan2» позволит избежать деления на ноль. Мы можем (если функция возвращает отрицательное значение) добавить пи так, чтобы t >= 0. Это равносильно добавлению 2pi к 2t, так что это не влияет на знаки записей в бесследной ортогональной матрице (поскольку 'R> = 0` шаблон знаков должен совпадать в формулах (1) и (2)).

...