Волею судеб вынужденный находиться в квартире...

Jan 01, 2007 05:50

...решил проверить своё размышление насчёт существенной матрицы в трехмерной конформальной геометрической алгебре.

Провёл натурный эксперимент, с помощью GAViewer.


# -----------------------------------------------------------------------------
# A .geo file to demonstrate projective geometry in geometric algebra.

# -----------------------------------------------------------------------------
# Setting of a camera.

campos [34*e3]
camori [2.354459e+000*e2^e3 + -1.214139e-001*e3^e1 + 9.428185e-002*e1^e2]

# -----------------------------------------------------------------------------
# Create a projected point.

console M=color(c3ga_point(1,1,5),0,1,1),

# -----------------------------------------------------------------------------
# Create a fixed camera origin and projection plane.

console dynamic{ Ofixed=color(no,0,0,0),}
console dynamic{ Pfixed=color(c3ga_point(1,0,1)^c3ga_point(0,1,1)^c3ga_point(1,1,1)^ni,0.1,0.1,0.1,0.5),}
console dynamic{ Lfixed=color(Ofixed^M^ni,1,1,0),}
console dynamic{ Ifixed=normalize(dual(dual(Lfixed)^dual(Pfixed)));}
console dynamic{ Afixed=color(c3ga_point((e3ga)(Ifixed.no)),0,0.5,0.5),}

# -----------------------------------------------------------------------------
# Create a dynamic camera translation and rotation.

console dynOffset=color(c3ga_point(2,0,-0.5),1,1,1),
console dynamic{ dynTV=tv((e3ga)dynOffset);}
console ctrl_range(dynAngleA = 0.0, -1.5707963267948966, 1.5707963267948966);
console dynamic{ dynRotorA = cos(dynAngleA)+(sin(dynAngleA)*e1^e3);}
console dynamic{ dynVersor = dynTV dynRotorA;}

# -----------------------------------------------------------------------------
# Create a dynamic camera origin and projection plane.

console dynamic{ Odynamic=vp(dynVersor,no);}
console dynamic{ Pdynamic=color(vp(dynVersor,c3ga_point(1,0,1)^c3ga_point(0,1,1)^c3ga_point(1,1,1)^ni),0.9,0.9,0.9,0.5),}
console dynamic{ Ldynamic=color(Odynamic^M^ni,1,1,0),}
console dynamic{ Idynamic=normalize(dual(dual(Ldynamic)^dual(Pdynamic)));}
console dynamic{ Adynamic=color(c3ga_point((e3ga)(Idynamic.no)),0,0.5,0.5),}

# Place dynamic camera projection into fixed camera frame.
console dynamic{ Adynamicfixed=red(ivp(dynVersor,Adynamic)),}

# -----------------------------------------------------------------------------
# Verifying an equivalent to essential matrix equation.

console dynamic{ mustbezero1 = Ofixed^Afixed^(dynVersor no inverse(dynVersor))^(dynVersor Adynamicfixed inverse(dynVersor))^ni;}

# The same equation, but a with only one versor product.
console dynamic{ mustbezero2 = Ofixed^Afixed^(dynVersor (no^Adynamicfixed) inverse(dynVersor))^ni;}Можно двигать точку M (проецируемую на обе камеры), белую точку - центр проекции перемещаемой камеры и движок dynAngleA - угол поворота камеры.

В процессе перемещения в консоли можно проверить правильность моих предположений, набрав mustbezero1 и mustbezero2. Оба должны давать ответ "ans = 0" всё время.

Результатом доволен. ;)

Теперь это надо свести к задаче наименьших квадратов.

геометрическая алгебра, компьютерное зрение, существенная матрица, эксперимент, нравится

Previous post Next post
Up