Implements 2-dimensional meshes of triangles. Abstractly, a mesh is a connected set of triangles with convex boundary.
type vertex = int
type vertex_data = Geometry2D.pointThe vertices within a mesh are identified by integer labels. Each vertex corresponds to a 2D point.
type triangle = int
datatype triangle_data =
Tri of
{ vertices: vertex * vertex * vertex
, neighbors: triangle * triangle * triangle
}The triangles within a mesh are identified by integer labels. Each triangle
has three vertices, and up to three neighboring triangles. The label ~1 is
used to indicate that no neighbor exists.
The vertices of a triangle must always appear in counter-clockwise order. Any rotation is equivalent, but CCW order must be preserved.
The neighbors of a triangle must respect the rotation of the vertices.
For vertices (u,v,w) and neighbors (a,b,c), the neighbor a must be
across the face (w,u), neighbor b must be across face (u,v), and neighbor
c must be across face (v,w), as shown below:
w
| \ --> c
a <-- | v
| / --> b
u
type meshThe abstract mesh type.
val numVertices: mesh -> int
val numTriangles: mesh -> intThe number of vertices and triangles in a mesh. Vertices are labeled between
0 and n-1 where n is the number of vertices. Similarly, triangles are
labeled between 0 and m-1 where m is the number of triangles.
val vdata: mesh -> vertex -> vertex_data
val tdata: mesh -> triangle -> triangle_dataLook up info about the position and neighbors of vertices and triangles in a mesh.
val verticesOfTriangle: mesh -> triangle -> vertex * vertex * vertex
val neighborsOfTriangle: mesh -> triangle -> triangle * triangle * triangleConvenience functions, often preferable to using tdata directly.
val triangleOfVertex: mesh -> vertex -> triangleReturns one of the triangles that a vertex participates in. (No guarantees on which one.)
val getPoints: mesh -> Geometry2D.point Seq.tThe collection of points for the vertices.
Note that Seq.nth (getPoints mesh i) = vdata mesh i.
type simplexA simplex is an oriented triangle. It has a distinguished edge.
val find: mesh -> vertex -> simplex -> simplex
val findPoint: mesh -> Geometry2D.point -> simplex -> simplexWalk through a mesh to find where a point lies. The resulting triangle
will either have that point on its boundary, or within its center. In the
case of find, we search for a vertex in the mesh. For findPoint, we search
for any arbitrary point within the convex boundary of the mesh.
val across: mesh -> simplex -> simplex optionacross mesh s returns the simplex across the distinguished edge of s.
The distinguished edge of the resulting simplex is the one shared with s.
If there is no such simplex, it returns NONE.
val rotateClockwise: simplex -> simplexRotate the simplex to choose the next distinguished edge. For example,
in the following, if a is the distinguished edge, then after rotation,
the new distinguished edge is b:
w u
| \ --> c rotateClockwise | \ --> a
*a* <-- | v ==============> *b* <-- | w
| / --> b | / --> c
u v
val outside: mesh -> simplex -> vertex -> bool
val pointOutside: mesh -> simplex -> Geometry2D.point -> boolTest if a vertex or arbitrary point is outside a simplex, across its distinguished edge. (I.e., on the other side of the line defined by the distinguished edge).
val inCircle: mesh -> simplex -> vertex -> bool
val pointInCircle: mesh -> simplex -> Geometry2D.point -> boolTest if a vertex or arbitrary point is within the circumcircle of a simplex.
val firstVertex: mesh -> simplex -> vertexWhen viewing a simplex with its distinguished edge on the left, return the
"bottom" vertex. For example, in the picture below, u is the first vertex.
w
| \ --> c
a <-- | v
| / --> b
u
val split: mesh -> triangle -> Geometry2D.point -> meshsplit mesh t p splits the triangle t by putting a new vertex at point
p, creating two new triangles. Requires the point p must be within
the triangle t.
For example below, the new vertex is labeled v and the two new triangles
created are labeled ta0 and ta1.
BEFORE: AFTER:
v1 v1
|\ |\\
| \ t1 | \ \ t1
| \ | \ \
| \ | \ t \
t2 | t v3 t2 |ta0 v --- v3
| / | / ta1 /
| / | / /
| / t3 | / / t3
|/ |//
v2 v2
(TODO... more functions from the interface)