这个张量的正确解决方案

时间:2011-03-17 21:42:04

标签: language-agnostic math

我正在this paper中实现该系统,并且我有点不正确地实现了径向张量场。

此系统中的所有张量均采用第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 个答案:

答案 0 :(得分:2)

显然,您正在比较论文的公式(1)和(2)。请注意标量多个 l = || (u_x,u_y)||在公式(1)中,并在该部分的早期用R标识。这个因素隐含在公式(2)中,所以为了使它们匹配,我们必须将R out分解。

公式(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`。

好吧,差不多。正如belisarius警告的那样,我们需要检查角度t是否在正确的象限中。该论文的作者在Sec的开头写道。 4根据公式R >= 0,他们的“t”(指的是张量)取决于R [ cos(2t), sin(2t); sin(2t) -cos(2t) ]和theta(你的t)位于[0,2pi]。

由于正弦和余弦具有周期2pi,因此t(θ)仅在长度pi的间隔内唯一确定。我怀疑作者的意思是写出2t位于[0,2pi]或更简单地说t位于[0,pi)。 belisarius建议使用“atan2等价物”将避免任何除零。我们可能(如果函数返回负值)需要添加pi以便t >= 0。这相当于增加2pi到2t,因此它不影响无痕迹正交矩阵中的条目的符号(因为'R> = 0',符号的模式应该在公式(1)和(2)中一致)。