/// <summary> /// /// </summary> /// <param name="originA"></param> /// <param name="normalA"></param> /// <param name="originB"></param> /// <param name="normalB"></param> /// <param name="point"></param> /// <param name="axis"></param> /// <returns></returns> public static bool PlanePlaneIntersect(Vector3d originA, Vector3d normalA, Vector3d originB, Vector3d normalB, out Vector3d point, out Vector3d axis) { axis = Vector3d.Cross(normalA, normalB); if (axis.SquareLength > 0.0) { var d = Vector3d.Reject(normalB, normalA); point = ProjectToPlaneAlong(originA, originB, normalB, d); return(true); } // normals are parallel, no unique solution point = Vector3d.Zero; return(false); }
/// <summary> /// Returns the aspect ratio of the triangle defined by 3 given points. /// This is defined as the longest edge / shortest altitude. /// </summary> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <returns></returns> public static double GetAspect(Vector3d p0, Vector3d p1, Vector3d p2) { double maxEdge = 0.0; // longest edge double minAlt = Double.PositiveInfinity; // shortest altitude Vector3d v0 = p1 - p0; Vector3d v1 = p2 - p1; Vector3d v2 = p0 - p2; Sub(v0, v1); Sub(v1, v2); Sub(v2, v0); return(Math.Sqrt(maxEdge) / Math.Sqrt(minAlt)); void Sub(Vector3d a, Vector3d b) { maxEdge = Math.Max(maxEdge, a.SquareLength); minAlt = Math.Min(minAlt, Vector3d.Reject(b, a).SquareLength); } }