contrib/mul/m23d/m23d_make_ortho_projection.cxx
Go to the documentation of this file.
00001 #include "m23d_make_ortho_projection.h"
00002 //:
00003 // \file
00004 // \author Tim Cootes
00005 // \brief Return 2 x 3 projection matrix based on viewing from angle (a,b)
00006 
00007 #include <m23d/m23d_rotation_matrix.h>
00008 
00009 //: Return 2 x 3 projection matrix based on viewing from angle (Ax,Ay,Az)
00010 //  If Ax=Ay=Az, then returns matrix (I|0)
00011 vnl_matrix<double> m23d_make_ortho_projection(double Ax, double Ay, double Az)
00012 {
00013   vnl_matrix<double> R=m23d_rotation_matrix(Ax,Ay,Az);
00014   return R.extract(2,3);
00015 }
00016 
00017 // Return projection matrix combination for ns shapes, nm modes
00018 vnl_matrix<double> m23d_make_ortho_projection(vnl_random& r,
00019                                               unsigned ns, unsigned nm,
00020                                               bool first_is_identity,
00021                                               bool basis_true)
00022 {
00023   vnl_matrix<double> P(2*ns,3*(1+nm));
00024   for (unsigned i=0;i<ns;++i)
00025   {
00026     double a = r.drand64(-0.5,0.5);
00027     double b = r.drand64(-0.5,0.5);
00028     double c = r.drand64(-0.5,0.5);
00029     vnl_matrix<double> Pi=m23d_make_ortho_projection(a,b,c);
00030     if (i==0 && first_is_identity)
00031       Pi=m23d_make_ortho_projection(0,0,0);
00032 
00033     for (unsigned j=0;j<=nm;++j)
00034     {
00035       double w=r.drand64(-1.0,1.0);
00036       if (nm==0) w=1.0;  // Ensure no scaling effects for rigid case
00037 
00038       if (basis_true)
00039       {
00040         // Force basis constraints to be true
00041         if (i<=nm && j<=nm)
00042         {
00043           if (i==j) w=1.0;
00044           else      w=0.0;
00045         }
00046       }
00047 
00048       P.update(w*Pi,i*2,j*3);
00049     }
00050   }
00051   return P;
00052 }
00053 
00054