Beispiel #1
0
        //"Spin" = rotate around a relative center of motion :o)
        //----------------------------------------------------------------
        public void Spin(float radians, IVector3H1 axisUnitVector, IVector3H1 RelCenter)
        {
            Matrix3H4 Trans1 = new Matrix3H4();

            Trans1.SetTranslate(-(Vector3H1)RelCenter); //translate relative center to oragine
            Matrix3H4 RotateMat = new Matrix3H4();

            RotateMat.RotateAnyAxis(radians, axisUnitVector); //Do 3D rotation
            Matrix3H4 Trans2 = new Matrix3H4();

            Trans2.SetTranslate(RelCenter);                  // put it back
            IMatrix3H4 Answer = Trans2 * RotateMat * Trans1; //multiply out answer

            this.Copy(Answer);
        }
Beispiel #2
0
        public object Clone()
        {
            Matrix3H4 MyClone = new Matrix3H4();

            MyClone.Data[0, 0] = Data[0, 0];  // copy the elements
            MyClone.Data[0, 1] = Data[0, 1];
            MyClone.Data[0, 2] = Data[0, 2];
            MyClone.Data[0, 3] = Data[0, 3];
            MyClone.Data[1, 0] = Data[1, 0];
            MyClone.Data[1, 1] = Data[1, 1];
            MyClone.Data[1, 2] = Data[1, 2];
            MyClone.Data[1, 3] = Data[1, 3];
            MyClone.Data[2, 0] = Data[2, 0];
            MyClone.Data[2, 1] = Data[2, 1];
            MyClone.Data[2, 2] = Data[2, 2];
            MyClone.Data[2, 3] = Data[2, 3];
            return((object)MyClone);
        }
Beispiel #3
0
        public static Matrix3H4 operator -(Matrix3H4 B)
        {
            Matrix3H4 NewMat = new Matrix3H4();

            NewMat.Data[0, 0] = -B.Data[0, 0];
            NewMat.Data[0, 1] = -B.Data[0, 1];
            NewMat.Data[0, 2] = -B.Data[0, 2];
            NewMat.Data[0, 3] = -B.Data[0, 3];
            NewMat.Data[1, 0] = -B.Data[1, 0];
            NewMat.Data[1, 1] = -B.Data[1, 1];
            NewMat.Data[1, 2] = -B.Data[1, 2];
            NewMat.Data[1, 3] = -B.Data[1, 3];
            NewMat.Data[2, 0] = -B.Data[2, 0];
            NewMat.Data[2, 1] = -B.Data[2, 1];
            NewMat.Data[2, 2] = -B.Data[2, 2];
            NewMat.Data[2, 3] = -B.Data[2, 3];
            return(NewMat);
        }
Beispiel #4
0
        public static Matrix3H4 operator *(Matrix3H4 A, float coeff) //allow reverse order
        {
            Matrix3H4 NewMat = new Matrix3H4();

            NewMat.Data[0, 0] = coeff * A.Data[0, 0];
            NewMat.Data[0, 1] = coeff * A.Data[0, 1];
            NewMat.Data[0, 2] = coeff * A.Data[0, 2];
            NewMat.Data[0, 3] = coeff * A.Data[0, 3];
            NewMat.Data[1, 0] = coeff * A.Data[1, 0];
            NewMat.Data[1, 1] = coeff * A.Data[1, 1];
            NewMat.Data[1, 2] = coeff * A.Data[1, 2];
            NewMat.Data[1, 3] = coeff * A.Data[1, 3];
            NewMat.Data[2, 0] = coeff * A.Data[2, 0];
            NewMat.Data[2, 1] = coeff * A.Data[2, 1];
            NewMat.Data[2, 2] = coeff * A.Data[2, 2];
            NewMat.Data[2, 3] = coeff * A.Data[2, 3];
            return(NewMat);
        }
Beispiel #5
0
        public static Matrix3H4 operator *(float coeff, Matrix3H4 A)
        {
            Matrix3H4 NewMat = new Matrix3H4();

            NewMat.Data[0, 0] = coeff * A.Data[0, 0];
            NewMat.Data[0, 1] = coeff * A.Data[0, 1];
            NewMat.Data[0, 2] = coeff * A.Data[0, 2];
            NewMat.Data[0, 3] = coeff * A.Data[0, 3];
            NewMat.Data[1, 0] = coeff * A.Data[1, 0];
            NewMat.Data[1, 1] = coeff * A.Data[1, 1];
            NewMat.Data[1, 2] = coeff * A.Data[1, 2];
            NewMat.Data[1, 3] = coeff * A.Data[1, 3];
            NewMat.Data[2, 0] = coeff * A.Data[2, 0];
            NewMat.Data[2, 1] = coeff * A.Data[2, 1];
            NewMat.Data[2, 2] = coeff * A.Data[2, 2];
            NewMat.Data[2, 3] = coeff * A.Data[2, 3];
            return(NewMat);
        }
Beispiel #6
0
        public static Matrix3H4 operator *(Matrix3H4 A, Matrix3H4 B)
        {
            Matrix3H4 C = new Matrix3H4(); //ACCELERATED W/ OUT LOOPS

            C.Data[0, 0] = A.Data[0, 0] * B.Data[0, 0] + A.Data[0, 1] * B.Data[1, 0] + A.Data[0, 2] * B.Data[2, 0];
            C.Data[0, 1] = A.Data[0, 0] * B.Data[0, 1] + A.Data[0, 1] * B.Data[1, 1] + A.Data[0, 2] * B.Data[2, 1];
            C.Data[0, 2] = A.Data[0, 0] * B.Data[0, 2] + A.Data[0, 1] * B.Data[1, 2] + A.Data[0, 2] * B.Data[2, 2];
            C.Data[0, 3] = A.Data[0, 0] * B.Data[0, 3] + A.Data[0, 1] * B.Data[1, 3] + A.Data[0, 2] * B.Data[2, 3] + A.Data[0, 3]; // *1; //implied

            C.Data[1, 0] = A.Data[1, 0] * B.Data[0, 0] + A.Data[1, 1] * B.Data[1, 0] + A.Data[1, 2] * B.Data[2, 0];
            C.Data[1, 1] = A.Data[1, 0] * B.Data[0, 1] + A.Data[1, 1] * B.Data[1, 1] + A.Data[1, 2] * B.Data[2, 1];
            C.Data[1, 2] = A.Data[1, 0] * B.Data[0, 2] + A.Data[1, 1] * B.Data[1, 2] + A.Data[1, 2] * B.Data[2, 2];
            C.Data[1, 3] = A.Data[1, 0] * B.Data[0, 3] + A.Data[1, 1] * B.Data[1, 3] + A.Data[1, 2] * B.Data[2, 3] + A.Data[1, 3]; // *1; //hommogenous

            C.Data[2, 0] = A.Data[2, 0] * B.Data[0, 0] + A.Data[2, 1] * B.Data[1, 0] + A.Data[2, 2] * B.Data[2, 0];
            C.Data[2, 1] = A.Data[2, 0] * B.Data[0, 1] + A.Data[2, 1] * B.Data[1, 1] + A.Data[2, 2] * B.Data[2, 1];
            C.Data[2, 2] = A.Data[2, 0] * B.Data[0, 2] + A.Data[2, 1] * B.Data[1, 2] + A.Data[2, 2] * B.Data[2, 2];
            C.Data[2, 3] = A.Data[2, 0] * B.Data[0, 3] + A.Data[2, 1] * B.Data[1, 3] + A.Data[2, 2] * B.Data[2, 3] + A.Data[2, 3]; // *1; //one
            return(C);
        }
Beispiel #7
0
        //"stretch" = scale around a relative (quasi-center) point
        //basically you move to the origin, do a normal scale, then move the object back
        public void Stretch(float SX, float SY, float SZ, IVector3H1 RelCenter) //probably cannot be done in 3x3... 3H4???
        {
            //translate relative center to oragine
            Matrix3H4 Trans1 = new Matrix3H4();

            Trans1.SetTranslate(-RelCenter.X, -RelCenter.Y, -RelCenter.Z);

            //do the scaling
            Matrix3H4 ScaleMat = new Matrix3H4();

            ScaleMat.SetScale(SX, SY, SZ);

            // put it back
            Matrix3H4 Trans2 = new Matrix3H4();

            Trans2.SetTranslate(RelCenter);

            IMatrix3H4 Answer = Trans2 * ScaleMat * Trans1;

            this.Copy(Answer);
        }