Hi,
I’m purposfully trying to get the plane-aligned flatbox (bounding box of no volume) of a triangular mesh face. This turned out to be far more challenging than expected!
import Rhino.Geometry as rg
def get_face_edges(face_vertices):
"""Returns edges as lines for a list of face vertices."""
edges = []
for i in range(len(face_vertices) - 2):
edges.append(rg.Line(face_vertices[i], face_vertices[i + 1]))
edges.append(rg.Line(face_vertices[-1], face_vertices[0]))
return edges
if __name__ == "__main__":
# Mesh and fIndex are GHPython component inputs
face = Mesh.Faces[fIndex] # triangular face
vertices = [rg.Point3d(v.X, v.Y, v.Z) for v in Mesh.Faces.GetFaceVertices(fIndex)[1:]]
edge = get_face_edges(vertices)[0]
normal = Mesh.FaceNormals[fIndex]
yaxis = edge.UnitTangent
xaxis = rg.Vector3d.CrossProduct(yaxis, normal)
plane = rg.Plane(edge.From, xaxis, yaxis)
fmesh = rg.Mesh()
for i in range(len(vertices)):
fmesh.Vertices.Add(vertices[i])
fmesh.Faces.AddFace(0, 1, 2)
xform = rg.Transform.ChangeBasis(rg.Plane.WorldXY, plane)
bbox = fmesh.GetBoundingBox(xform)
plane_to_world = rg.Transform.ChangeBasis(plane, rg.Plane.WorldXY)
bbox.Transform(plane_to_world) # inflates the previously flatbox to a 3D bounding box ?
# Output
a = bbox
In the WorldXY-plane, the correct flat bounding box appears at the world origin, however when I try to transform it back to the plane of the face, it gets inflated to 3D?
Why is the Transform()
method of Rhino.Geometry.BoundingBox
different from that of other geometry?
Merry christmas everybody!
example.gh (9.3 KB)