//"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); }
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); }
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); }
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); }
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); }
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); }
//"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); }