contrib/oxl/mvl/HMatrix1DCompute3Point.cxx
Go to the documentation of this file.
00001 #include "HMatrix1DCompute3Point.h"
00002 
00003 #include <vcl_vector.h>
00004 #include <vcl_cassert.h>
00005 #include <vgl/vgl_homg_point_1d.h>
00006 #include <mvl/HMatrix1D.h>
00007 
00008 //
00009 // computes 1d Moebius map from three point correspondences :
00010 //
00011 static
00012 void
00013 direct_compute(double T[2][2],
00014                double p11,double p12,double p13,// p1 p2 p3
00015                double p21,double p22,double p23,
00016 
00017                double q11,double q12,double q13,// q1 q2 q3
00018                double q21,double q22,double q23)
00019 {
00020   double A[2][2],B[2][2];
00021   double t;
00022 
00023   t=+(p22*p13-p12*p23); A[0][0]=t*p11; A[1][0]=t*p21;
00024   t=-(p21*p13-p11*p23); A[0][1]=t*p12; A[1][1]=t*p22;
00025 
00026   t=+(q22*q13-q12*q23); B[0][0]=t*q11; B[1][0]=t*q21;
00027   t=-(q21*q13-q11*q23); B[0][1]=t*q12; B[1][1]=t*q22;
00028 
00029   T[0][0]= B[0][0]*A[1][1]-B[0][1]*A[1][0];
00030   T[1][0]= B[1][0]*A[1][1]-B[1][1]*A[1][0];
00031   T[0][1]=-B[0][0]*A[0][1]+B[0][1]*A[0][0];
00032   T[1][1]=-B[1][0]*A[0][1]+B[1][1]*A[0][0];
00033 }
00034 
00035 HMatrix1DCompute3Point::HMatrix1DCompute3Point(void) : HMatrix1DCompute() { }
00036 HMatrix1DCompute3Point::~HMatrix1DCompute3Point() { }
00037 
00038 bool
00039 HMatrix1DCompute3Point::compute_cool_homg(const vcl_vector<vgl_homg_point_1d<double> >& points1,
00040                                           const vcl_vector<vgl_homg_point_1d<double> >& points2,
00041                                           HMatrix1D *H)
00042 {
00043   assert(points1.size() == 3);
00044   assert(points2.size() == 3);
00045   double T[2][2];
00046   direct_compute(T,
00047                  points1[0].x() , points1[1].x() , points1[2].x(),
00048                  points1[0].w() , points1[1].w() , points1[2].w(),
00049 
00050                  points2[0].x() , points2[1].x() , points2[2].x(),
00051                  points2[0].w() , points2[1].w() , points2[2].w());
00052   H->set(&T[0][0]);
00053   return true;
00054 }