00001
00002 #include "pop_projective.h"
00003
00004
00005 #include<pop/pop_point_2d.h>
00006 #include<pop/pop_point_3d.h>
00007 #include <vcl_cassert.h>
00008
00009
00010
00011
00012
00013
00014 pop_projective::pop_projective(vcl_vector<pop_parameter*> params,
00015 pop_vertex *cs1, pop_vertex *cs2) :
00016 pop_transform(params,cs1,cs2)
00017 {
00018 this->update();
00019 }
00020
00021
00022 pop_projective::~pop_projective()
00023 {
00024 }
00025
00026
00027 pop_geometric_object* pop_projective::transform(pop_geometric_object *obj)
00028 {
00029
00030 pop_point_3d *p1 = obj->cast_to_pop_point_3d();
00031
00032 if (p1)
00033 {
00034
00035
00036 assert(p1->coordinate_system_ == cs1_);
00037
00038
00039 vnl_vector<double> v1(3);
00040 v1(0) = p1->x();
00041 v1(1) = p1->y();
00042 v1(2) = p1->z();
00043
00044 vnl_vector<double> v2 = trans_ * v1;
00045
00046
00047 if (v2(2)) {
00048 v2 = v2/v2(2);
00049 }
00050
00051
00052 pop_point_2d *p2 = new pop_point_2d(cs2_,v2(0),v2(1));
00053
00054 return p2;
00055 }
00056
00057 return 0;
00058 }
00059
00060
00061 void pop_projective::update()
00062 {
00063
00064
00065
00066
00067
00068 trans_.fill(0.0);
00069 trans_(0,0) = params_[0]->value_;
00070 trans_(1,1) = params_[1]->value_;
00071 trans_(0,1) = params_[2]->value_;
00072 trans_(0,2) = params_[3]->value_;
00073 trans_(1,2) = params_[4]->value_;
00074 trans_(2,2) = 1.0;
00075 }
00076