示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
            }
        }