Пример #1
0
        /// <summary>
        ///     Compute the normal vector of the specified face.
        /// </summary>
        /// <returns>The normal.</returns>
        /// <param name="face">Face.</param>
        public static Vector3d FaceNormal(MeshFace face)
        {
            if (face.IsBoundaryLoop())
            {
                return(null);
            }

            var u = Vector(face.HalfEdge);
            var v = -Vector(face.HalfEdge.Prev);

            return(u.Cross(v).Unit());
        }
Пример #2
0
        /// <summary>
        ///     Computes the area of the specified face.
        /// </summary>
        /// <returns>The face area.</returns>
        /// <param name="face">Face.</param>
        public static double Area(MeshFace face)
        {
            if (face.IsBoundaryLoop())
            {
                return(0.0);
            }

            var u = Vector(face.HalfEdge);
            var v = -Vector(face.HalfEdge.Prev);

            return(0.5 * u.Cross(v).Length);
        }
Пример #3
0
        /// <summary>
        ///     Compute the centroid of the specified face.
        /// </summary>
        /// <returns>The centroid.</returns>
        /// <param name="face">Face.</param>
        public static Point3d Centroid(MeshFace face)
        {
            var     hE = face.HalfEdge;
            Point3d a  = hE.Vertex;
            Point3d b  = hE.Next.Vertex;
            Point3d c  = hE.Prev.Vertex;

            if (face.IsBoundaryLoop())
            {
                return((a + b) / 2);
            }

            return((a + b + c) / 3);
        }
Пример #4
0
        /// <summary>
        ///     Compute the circumcenter the specified face.
        /// </summary>
        /// <returns>The circumcenter.</returns>
        /// <param name="face">Face.</param>
        public static Point3d Circumcenter(MeshFace face)
        {
            var hE = face.HalfEdge;

            Point3d a = hE.Vertex;
            Point3d b = hE.Next.Vertex;
            Point3d c = hE.Prev.Vertex;

            if (face.IsBoundaryLoop())
            {
                return((a + b) / 2);
            }

            var ac = c - a;
            var ab = b - a;
            var w  = ab.Cross(ac);

            var u = w.Cross(ab) * ac.LengthSquared;
            var v = ac.Cross(w) * ab.LengthSquared;

            var x = ( Point3d )(u + v) / (2 * w.LengthSquared);

            return(x + a);
        }