<DIV>I'm using vtk to solve a problem which can use IterativeClosestPoint(ICP) arithmetic to match the source points&nbsp;with&nbsp;the target points.</DIV>
<DIV>What I can get is a Matrix4x4 from the functions in vtk. Now I want to check if the result is correct. So I try to use JacobiN(,,,)&nbsp;in vtk to get the </DIV>
<DIV>quaternion and then use the quaternion to get the rotation matrix. At last , I&nbsp;can get the translation vector.</DIV>
<DIV>But&nbsp;when I compare the translation vector I&nbsp;get and the translation vector I set, I find&nbsp;they are not&nbsp;similar at all.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I can give you the part of the code to show my mean:</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; //the sourcedata and target data have been set.Both of them have 100 points.And I set the translation vector(No rotation matrix)</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; vtkIterativeClosestPointTransform * icp = vtkIterativeClosestPointTransform::New();<BR>&nbsp;&nbsp;&nbsp; icp-&gt;SetSource(SourcePolydata);<BR>&nbsp;&nbsp;&nbsp; icp-&gt;SetTarget(TargetPolydata);<BR>&nbsp;&nbsp;&nbsp; icp-&gt;GetLandmarkTransform()-&gt;SetModeToRigidBody(); <BR>&nbsp;&nbsp; &nbsp;icp-&gt;SetMaximumNumberOfIterations(20);<BR>&nbsp;&nbsp;&nbsp; icp-&gt;StartByMatchingCentroidsOn();<BR>&nbsp;&nbsp;&nbsp; icp-&gt;Modified();<BR>&nbsp;&nbsp;&nbsp; icp-&gt;Update();</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; vtkMatrix4x4* M = icp-&gt;GetMatrix();<BR>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Get the Matrix4X4&nbsp;" &lt;&lt; endl;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; double ** a;<BR>&nbsp;&nbsp; &nbsp;a = (double **)malloc(sizeof(double *)*4);<BR>&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; 4; i++ )<BR>&nbsp;&nbsp;&nbsp; *(a+i)=(double *)malloc(sizeof(double)*4);</DIV>
<DIV>&nbsp;&nbsp;&nbsp; double ** R;<BR>&nbsp;&nbsp; &nbsp;R = (double **)malloc(sizeof(double *)*4);<BR>&nbsp;&nbsp; &nbsp;for( i = 0; i &lt; 4; i++ )<BR>&nbsp;&nbsp;&nbsp; *(R+i)=(double *)malloc(sizeof(double)*4);<BR>&nbsp;&nbsp;&nbsp; double * T;<BR>&nbsp;&nbsp;&nbsp; T = (double *)malloc(sizeof(double)*4);</DIV>
<DIV>&nbsp;&nbsp;&nbsp; for( i = 0; i &lt;= 3; i++ )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j = 0; j &lt;= 3; j++ )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%e\t",M-&gt;Element[i][j]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[i][j] = M-&gt;Element[i][j];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<BR>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; //Get the quaternion</DIV>
<DIV>&nbsp;&nbsp;&nbsp; vtkMath::JacobiN( (double **)a, 4, (double *)T, (double **)R );</DIV>
<DIV>&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;&nbsp;&nbsp; //Get the rotation matrix</DIV>
<DIV>&nbsp;&nbsp;&nbsp; double Rr[3][3];</DIV>
<DIV>&nbsp;&nbsp; &nbsp;Rr[0][0] = R[0][0]*R[0][0]+R[0][1]*R[0][1]-R[0][2]*R[0][2]-R[0][3]*R[0][3];<BR>&nbsp;&nbsp; &nbsp;Rr[0][1] = 2*(R[0][1]*R[0][2]-R[0][0]*R[0][3]);<BR>&nbsp;&nbsp;&nbsp; Rr[0][2] = 2*(R[0][1]*R[0][3]+R[0][0]*R[0][2]);<BR>&nbsp;&nbsp;&nbsp; Rr[1][0] = 2*(R[0][1]*R[0][2]+R[0][0]*R[0][3]);<BR>&nbsp;&nbsp;&nbsp; Rr[1][1] = -(R[0][0]*R[0][0]-R[0][1]*R[0][1]+R[0][2]*R[0][2]-R[0][3]*R[0][3]);<BR>&nbsp;&nbsp;&nbsp; Rr[1][2] = 2*(R[0][2]*R[0][3]-R[0][0]*R[0][1]);<BR>&nbsp;&nbsp;&nbsp; Rr[2][0] = 2*(R[0][1]*R[0][3]-R[0][0]*R[0][2]);<BR>&nbsp;&nbsp;&nbsp; Rr[2][1] = 2*(R[0][2]*R[0][3]+R[0][0]*R[0][1]);<BR>&nbsp;&nbsp;&nbsp; Rr[2][2] = -(R[0][0]*R[0][0]-R[0][1]*R[0][1]-R[0][2]*R[0][2]+R[0][3]*R[0][3]);</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; double C3[3];</DIV>
<DIV>&nbsp;&nbsp;&nbsp; // C2[] is the centre point of target points,C1[] is the centre point of source points&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; C3[0] = C2[0] * Rr[0][0] + C2[1] * Rr[1][0] + C2[2] * Rr[2][0] ;<BR>&nbsp;&nbsp;&nbsp; C3[1] = C2[0] * Rr[0][1] + C2[1] * Rr[1][1] + C2[2] * Rr[2][1] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;C3[2] = C2[0] * Rr[0][2] + C2[1] * Rr[1][2] + C2[2] * Rr[2][2] ;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; 3; i++ )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; C1[i] - C3[i] &lt;&lt; " ";<BR>&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;</DIV>
<DIV>&nbsp;</DIV>
<DIV>Maybe my way to test&nbsp;was wrong.But I want to get the rotation matrix and translation vector. Could you please solve the problem or give me another way to get what I want.</DIV>
<DIV>Thank you.</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tranks</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<DIV style="HEIGHT: 1px; CLEAR: both; OVERFLOW: hidden"></DIV></DIV>
<DIV>&nbsp;</DIV>
<DIV>
<DIV style="HEIGHT: 1px; CLEAR: both; OVERFLOW: hidden"></DIV></DIV>
<DIV>&nbsp;</DIV>