2 #ifndef vgl_affine_coordinates_hxx_ 3 #define vgl_affine_coordinates_hxx_ 14 assert(pts.size()>=3);
20 T det = dv0v0*dv1v1 - dv0v1*dv0v1;
22 assert(fabs(det)>tol);
23 for(
unsigned i =0; i<pts.size(); ++i){
27 T alpha = (dvpv0*dv1v1-dv0v1*dvpv1)/det;
28 T beta = (dv0v0*dvpv1-dvpv0*dv0v1)/det;
36 assert(pts.size()>=4);
46 T det = -dv0v2*dv0v2*dv1v1 + 2*dv0v1*dv0v2*dv1v2 - dv0v0*dv1v2*dv1v2 - dv0v1*dv0v1*dv2v2 + dv0v0*dv1v1*dv2v2;
48 assert(fabs(det)>tol);
49 for(
unsigned i =0; i<pts.size(); ++i){
54 T alpha = (-dv1v2*dv1v2*dvpv0 + dv1v1*dv2v2*dvpv0 + dv0v2*dv1v2*dvpv1 -
55 dv0v1*dv2v2*dvpv1 - dv0v2*dv1v1*dvpv2 + dv0v1*dv1v2*dvpv2)/det;
56 T beta = (dv0v2*dv1v2*dvpv0 - dv0v1*dv2v2*dvpv0 - dv0v2*dv0v2*dvpv1 +
57 dv0v0*dv2v2*dvpv1 + dv0v1*dv0v2*dvpv2 - dv0v0*dv1v2*dvpv2)/det;
58 T gamma = (-dv0v2*dv1v1*dvpv0 + dv0v1*dv1v2*dvpv0 + dv0v1*dv0v2*dvpv1 -
59 dv0v0*dv1v2*dvpv1 - dv0v1*dv0v1*dvpv2 + dv0v0*dv1v1*dvpv2)/det;
69 unsigned n1 = pts1.size(), n2 = pts2.size();
74 T x1=T(0), x2=T(0), y1 = T(0), y2 = T(0);
75 T dist_1 = T(0), dist_2 = T(0);
76 for(
unsigned i = 0; i<n1;++i){
77 x1+=pts1[i].x(); y1+=pts1[i].y();
78 x2+=pts2[i].x(); y2+=pts2[i].y();
81 for(
unsigned i = 0; i<n1;++i){
82 dist_1+=(pts1[i]-cent_1).
length();
83 dist_2+=(pts2[i]-cent_2).
length();
85 dist_1/=n1; dist_2/=n2;
86 std::vector<vgl_point_2d<T> > norm_pts1, norm_pts2;
87 for(
unsigned i = 0; i<n1;++i){
90 np1.
set(np1.x()/dist_1, np1.y()/dist_1);
93 np2.
set(np2.x()/dist_2, np2.y()/dist_2);
94 norm_pts1.push_back(np1);
95 norm_pts2.push_back(np2);
103 T det1 = dv01v01*dv11v11 - dv01v11*dv01v11;
104 assert(fabs(det1)>tol);
109 T alpha_1 = (dv21v01*dv11v11-dv01v11*dv21v11)/det1;
110 T beta_1 = (dv01v01*dv21v11-dv21v01*dv01v11)/det1;
117 T det2 = dv02v02*dv12v12 - dv02v12*dv02v12;
118 assert(fabs(det2)>tol);
123 T alpha_2 = (dv22v02*dv12v12-dv02v12*dv22v12)/det2;
124 T beta_2 = (dv02v02*dv22v12-dv22v02*dv02v12)/det2;
130 T s2 = (alpha_2-alpha_1), fs2 = fabs(s2);
132 s2 = (beta_2-beta_1);
140 for(
unsigned i = 0; i<n1; ++i){
145 T alpha_p1 = (dvp1v01*dv11v11-dv01v11*dvp1v11)/det1;
146 T beta_p1 = (dv01v01*dvp1v11-dvp1v01*dv01v11)/det1;
151 T alpha_p2 = (dvp2v02*dv12v12-dv02v12*dvp2v12)/det2;
152 T beta_p2 = (dv02v02*dvp2v12-dvp2v02*dv02v12)/det2;
157 T sp = (alpha_p2-alpha_p1), fsp = fabs(sp);
159 sp = (beta_p2-beta_p1);
168 T alpha_p = (alpha_p1-gamma_p*alpha_1);
169 T beta_p = (beta_p1-gamma_p*beta_1);
173 #undef VGL_AFFINE_COORDINATES_INSTANTIATE 174 #define VGL_AFFINE_COORDINATES_INSTANTIATE(T) \ 175 template void vgl_affine_coordinates_2d(std::vector<vgl_point_2d<T> > const& pts, std::vector<vgl_point_2d<T> >& affine_pts); \ 176 template void vgl_affine_coordinates_3d(std::vector<vgl_point_3d<T> > const& pts, std::vector<vgl_point_3d<T> >& affine_pts); \ 177 template void vgl_affine_coordinates_3d(std::vector<vgl_point_2d<T> > const& pts1, std::vector<vgl_point_2d<T> > const& pts2, \ 178 std::vector<vgl_point_3d<T> >& affine_pts) 179 #endif // vgl_affine_coordinates_h_ T dot_product(v const &a, v const &b)
dot product or inner product of two vectors.
Direction vector in Euclidean 2D space, templated by type of element.
direction vector in Euclidean 3D space
double length() const
Return the length of this vector.
double length(v const &a)
Return the length of a vector.
void vgl_affine_coordinates_3d(std::vector< vgl_point_3d< T > > const &pts, std::vector< vgl_point_3d< T > > &affine_pts)
void set(Type px, Type py)
Set x and y.
direction vector in Euclidean 2D space
void vgl_affine_coordinates_2d(std::vector< vgl_point_2d< T > > const &pts, std::vector< vgl_point_2d< T > > &affine_pts)
Direction vector in Euclidean 3D space, templated by type of element.
Computes 2-d and 3-d affine coordinates of point sets.