예제 #1
0
        public static void RotateOverStreight(Polyhedron ph, Point3d a, Point3d b, double phi)
        {
            double m = b.X - a.X;
            double n = b.Y - a.Y;
            double p = b.Z - a.Z;
            double s = Math.Sqrt(m * m + n * n);
            double d = Math.Sqrt(m * m + n * n + p * p);

            AffineMatrix m0;

            if (Math.Abs(s) < 1e-6)
            {
                AffineMatrix m1 = AffineMatrix.CreateTranslationMatrix(-a.X, -a.Y, -a.Z);
                AffineMatrix m4 = AffineMatrix.CreateZaxisRotationMatrix(phi);
                AffineMatrix m7 = AffineMatrix.CreateTranslationMatrix(a.X, a.Y, a.Z);
                m0 = m7 * m4 * m1;
            }
            else
            {
                AffineMatrix m1 = AffineMatrix.CreateTranslationMatrix(-a.X, -a.Y, -a.Z);
                AffineMatrix m2 = AffineMatrix.CreateZaxisRotationMatrix(n / s, m / s);
                AffineMatrix m3 = AffineMatrix.CreateXaxisRotationMatrix(p / d, s / d);
                AffineMatrix m4 = AffineMatrix.CreateZaxisRotationMatrix(phi);
                AffineMatrix m5 = AffineMatrix.CreateXaxisRotationMatrix(p / d, -s / d);
                AffineMatrix m6 = AffineMatrix.CreateZaxisRotationMatrix(n / s, -m / s);
                AffineMatrix m7 = AffineMatrix.CreateTranslationMatrix(a.X, a.Y, a.Z);
                m0 = m7 * m6 * m5 * m4 * m3 * m2 * m1;
            }
            Execute(ph, m0);
        }
예제 #2
0
        public static void RotateOverCenter(Polyhedron ph, char axis, double phi)
        {
            Point3d      p  = ph.Center.Clone() as Point3d;
            AffineMatrix m1 = AffineMatrix.CreateTranslationMatrix(-p.X, -p.Y, -p.Z);
            AffineMatrix m2;

            switch (axis)
            {
            case 'x':
            case 'X':
                m2 = AffineMatrix.CreateXaxisRotationMatrix(phi);
                break;

            case 'y':
            case 'Y':
                m2 = AffineMatrix.CreateYaxisRotationMatrix(phi);
                break;

            case 'z':
            case 'Z':
                m2 = AffineMatrix.CreateZaxisRotationMatrix(phi);
                break;

            default:
                throw new Exception("Wrong char in rotation over center!");
            }
            AffineMatrix m3 = AffineMatrix.CreateTranslationMatrix(p.X, p.Y, p.Z);
            AffineMatrix m  = m3 * m2 * m1;

            Execute(ph, m);
        }
예제 #3
0
        public static void ScaleOverCenter(Polyhedron ph, double a)
        {
            Point3d      p  = ph.Center.Clone() as Point3d;
            AffineMatrix m1 = AffineMatrix.CreateTranslationMatrix(-p.X, -p.Y, -p.Z);
            AffineMatrix m2 = AffineMatrix.CreateScaleMatrix(a, a, a);
            AffineMatrix m3 = AffineMatrix.CreateTranslationMatrix(p.X, p.Y, p.Z);
            AffineMatrix m  = m3 * m2 * m1;

            Execute(ph, m);
        }
예제 #4
0
        public static void Translate(Polyhedron ph, Point3d a)
        {
            AffineMatrix m = AffineMatrix.CreateTranslationMatrix(a.X, a.Y, a.Z);

            Execute(ph, m);
        }