51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
import numpy as np
|
|
from scipy.spatial import ConvexHull
|
|
from stl import mesh
|
|
|
|
|
|
def generate_mesh(points, depth):
|
|
"""
|
|
Generate a mesh by extruding a 2D shape along the Z-axis.
|
|
|
|
:param points: List of (x, y) tuples representing the 2D shape.
|
|
:param depth: Extrusion depth along the Z-axis.
|
|
:return: Tuple of vertices and faces.
|
|
"""
|
|
# Convert points to a numpy array
|
|
points_2d = np.array(points)
|
|
|
|
# Get the convex hull of the points to ensure they form a proper polygon
|
|
hull = ConvexHull(points_2d)
|
|
hull_points = points_2d[hull.vertices]
|
|
|
|
# Generate the top and bottom faces
|
|
bottom_face = np.hstack((hull_points, np.zeros((hull_points.shape[0], 1))))
|
|
top_face = np.hstack((hull_points, np.ones((hull_points.shape[0], 1)) * depth))
|
|
|
|
# Combine top and bottom vertices
|
|
vertices_array = np.vstack((bottom_face, top_face))
|
|
|
|
# Create faces
|
|
faces = []
|
|
|
|
# Bottom face triangulation (counter-clockwise)
|
|
for i in range(len(hull_points) - 2):
|
|
faces.append([0, i + 2, i + 1])
|
|
|
|
# Top face triangulation (counter-clockwise, with an offset)
|
|
top_offset = len(hull_points)
|
|
for i in range(len(hull_points) - 2):
|
|
faces.append([top_offset, top_offset + i + 1, top_offset + i + 2])
|
|
|
|
# Side faces (ensure counter-clockwise order)
|
|
for i in range(len(hull_points)):
|
|
next_i = (i + 1) % len(hull_points)
|
|
faces.append([i, top_offset + i, top_offset + next_i])
|
|
faces.append([i, top_offset + next_i, next_i])
|
|
|
|
# Convert vertices to the desired format: list of tuples
|
|
vertices = [tuple(vertex) for vertex in vertices_array]
|
|
|
|
return vertices, faces
|
|
|