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