www.pudn.com > scanalyze-1.0.3_source_code.rar > absorient.h, change:2003-09-15,size:2014b
//############################################################
// absorient.h
// Kari Pulli
// 06/06/97
//
// Two methods for solving the rotation and translation for
// registering two sets of 3D points.
//
// Horn's method takes as input two lists of corresponding
// 3D points. It calculates in one step the optimum motion
// to align the sets. The starting point does not have to
// be close to the solution.
//
// Chen & Medioni's method takes as input a list of points
// and a list of planes, one plane for each point. The
// algorithm tries to move the sets so that the points get
// close to their corresponding planes. It is assumed that
// only small rotations are needed, i.e., the sets are
// in approximate registration.
//############################################################
#ifndef _ABSORIENT_H_
#define _ABSORIENT_H_
typedef enum {
alignHorn,
alignChenMedioni
} AlignmentMethod;
//
// Alignment methods:
// horn_align does point-to-point
// chen_medioni does point-to-plane
// Both methods calculate the transformation necessary to align
// src to dst, as a quaternion rotation and a translation.
//
// Meanings of parameters:
// src Source points to align
// dst Target positioning
// nrmDst Normals at points in dst
// n Number of point pairs
// q[7] Registration quaternion; 0..3 rot, 4..6 trans
//
// Horn's method: calculates transformation from points to points
void
horn_align(Pnt3 *src, // source points to align
Pnt3 *dst, // target orientation
int n, // how many pairs
double q[7]); // registration quaternion
// Chen-Medioni method: calculates transformation from points to planes
void
chen_medioni(Pnt3 *src, // source points to align
Pnt3 *dst, // target orientation (points on tangent planes)
Pnt3 *nrmDst, // and orientation of planes at target
int n, // how many pairs
double q[7]); // registration quaternion
#endif // _ABSORIENT_H_