Пример #1
0
        // 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);
        }
Пример #2
0
        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);
        }