// vector _y as user input public static void ComputePCATransf(List <Point3D> _points, Vector3D v_correction, out Matrix3D trWC2LC, out Matrix3D trLC2WC) { trWC2LC = Matrix3D.Identity; trLC2WC = Matrix3D.Identity; if (_points == null || _points.Count < 1 || v_correction == null) { return; } Point3D pivot; Vector3D vec0, vec1, vec2; GeometricTransforms.CalculatePCA(_points, out pivot, out vec0, out vec1, out vec2); // detect which base vector is closest to the correction vector v_correction.Normalize(); double angle0 = Vector3D.DotProduct(v_correction, vec0); double angle1 = Vector3D.DotProduct(v_correction, vec1); double angle2 = Vector3D.DotProduct(v_correction, vec2); Vector3D vec_to_rotate = vec2; if (Math.Abs(angle0) < Math.Abs(angle1) && Math.Abs(angle0) < Math.Abs(angle2)) { vec_to_rotate = (angle0 > 0) ? vec0 : -vec0; } else if (Math.Abs(angle1) < Math.Abs(angle0) && Math.Abs(angle1) < Math.Abs(angle2)) { vec_to_rotate = (angle1 > 0) ? vec1 : -vec1; } else { vec_to_rotate = (angle2 > 0) ? vec2 : -vec2; } // correct by user-defined vector Matrix3D R = GeometricTransforms.AlingVector(v_correction, vec_to_rotate); Vector3D vec0_r = R.Transform(vec0); Vector3D vec1_r = R.Transform(vec1); Vector3D vec2_r = R.Transform(vec2); // debug List <Vector3D> ucs_1 = new List <Vector3D> { vec0, vec1, vec2, v_correction }; List <Vector3D> ucs_2 = new List <Vector3D> { vec0_r, vec1_r, vec2_r }; string ucs_1_str = GeometricTransforms.VectorListToString(ucs_1); string ucs_2_str = GeometricTransforms.VectorListToString(ucs_2); // debug // calculate the transforms WITH CORRECTION trWC2LC = GeometricTransforms.GetTransformWC2LC(pivot, vec0_r, vec1_r, vec2_r); trLC2WC = GeometricTransforms.GetTransformLC2WC(pivot, vec0_r, vec1_r, vec2_r); }
public static void ComputePCATransf(List <Point3D> _points, out Matrix3D trWC2LC, out Matrix3D trLC2WC) { trWC2LC = Matrix3D.Identity; trLC2WC = Matrix3D.Identity; if (_points == null || _points.Count < 1) { return; } Point3D pivot; Vector3D vec0, vec1, vec2; GeometricTransforms.CalculatePCA(_points, out pivot, out vec0, out vec1, out vec2); // calculate the transforms trWC2LC = GeometricTransforms.GetTransformWC2LC(pivot, vec0, vec1, vec2); trLC2WC = GeometricTransforms.GetTransformLC2WC(pivot, vec0, vec1, vec2); }