Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
142 lines (119 sloc) 4.14 KB
 # -*- coding: utf-8 -*- # ----------------------------------------------------------------------------- # Copyright (c) Vispy Development Team. All Rights Reserved. # Distributed under the (new) BSD License. See LICENSE.txt for more info. # ----------------------------------------------------------------------------- import numpy as np from .triangulation import Triangulation class PolygonData(object): """Polygon class for data handling Parameters ---------- vertices : (Nv, 3) array Vertex coordinates. If faces is not specified, then this will instead be interpreted as (Nf, 3, 3) array of coordinates. edges : (Nv, 2) array Constraining edges specified by vertex indices. faces : (Nf, 3) array Indexes into the vertex array. Notes ----- All arguments are optional. """ def __init__(self, vertices=None, edges=None, faces=None): self._vertices = vertices self._edges = edges self._faces = faces self._convex_hull = None @property def faces(self): """Return an array (Nf, 3) of vertex indexes, three per triangular face in the mesh. If faces have not been computed for this mesh, the function computes them. If no vertices or faces are specified, the function returns None. """ if self._faces is None: if self._vertices is None: return None self.triangulate() return self._faces @faces.setter def faces(self, f): """ If vertices and faces are incompatible, this will generate vertices from these faces and set them. """ self._faces = f @property def vertices(self): """Return an array (Nf, 3) of vertices. If only faces exist, the function computes the vertices and returns them. If no vertices or faces are specified, the function returns None. """ if self._faces is None: if self._vertices is None: return None self.triangulate() return self._vertices @vertices.setter def vertices(self, v): """ If vertices and faces are incompatible, this will generate faces from these vertices and set them. """ self._vertices = v @property def edges(self): """Return an array (Nv, 2) of vertex indices. If no vertices or faces are specified, the function returns None. """ return self._edges @edges.setter def edges(self, e): """ Ensures that all edges are valid. """ self._edges = e @property def convex_hull(self): """Return an array of vertex indexes representing the convex hull. If faces have not been computed for this mesh, the function computes them. If no vertices or faces are specified, the function returns None. """ if self._faces is None: if self._vertices is None: return None self.triangulate() return self._convex_hull def triangulate(self): """ Triangulates the set of vertices and stores the triangles in faces and the convex hull in convex_hull. """ npts = self._vertices.shape[0] if np.any(self._vertices[0] != self._vertices[1]): # start != end, so edges must wrap around to beginning. edges = np.empty((npts, 2), dtype=np.uint32) edges[:, 0] = np.arange(npts) edges[:, 1] = edges[:, 0] + 1 edges[-1, 1] = 0 else: # start == end; no wrapping required. edges = np.empty((npts-1, 2), dtype=np.uint32) edges[:, 0] = np.arange(npts) edges[:, 1] = edges[:, 0] + 1 tri = Triangulation(self._vertices, edges) tri.triangulate() return tri.pts, tri.tris def add_vertex(self, vertex): """ Adds given vertex and retriangulates to generate new faces. Parameters ---------- vertex : array-like The vertex to add. """ raise NotImplementedError
You can’t perform that action at this time.