public Rotation(double Angle, Point3D Axis) { Axis.Normalize(); mQ0 = Math.Cos(Angle / 2.0); Axis.Scale(Math.Sin(Angle / 2.0)); mQX = Axis.X; mQY = Axis.Y; mQZ = Axis.Z; Normalize(); }
private Point2D coordsInFundDomain(Point3D p) { //want baricentric coords (u,v) st. B + u*(A-B) + v*(C-B) = p' //where p' is p projected to X=1.0 plane. p.Scale(1.0 / p.X); Point3D A = domainCorner(0); Point3D B = domainCorner(1); Point3D C = domainCorner(2); Point2D v0 = new Point2D(A.Y - B.Y, A.Z - B.Z); Point2D v1 = new Point2D(C.Y - B.Y, C.Z - B.Z); Point2D v2 = new Point2D(p.Y - B.Y, p.Z - B.Z); double dot00 = Point2D.Dot(v0, v0); double dot01 = Point2D.Dot(v0, v1); double dot02 = Point2D.Dot(v0, v2); double dot11 = Point2D.Dot(v1, v1); double dot12 = Point2D.Dot(v1, v2); double invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01); return new Point2D( (dot11 * dot02 - dot01 * dot12) * invDenom, (dot00 * dot12 - dot01 * dot02) * invDenom); }