\require{color}
Two types of topology (i.e. connectivity):
Hence mesh modification is geometric (i.e. no changes to mesh connectivity but can change underlying surface.)
Whereas surface modification is topological (i.e. no changes to the underlying surface, but allow changes within mesh connectivity.)
.Underlying space: “the structure” of the object.
A new vertex can be inserted onto
Recursively subdivide into 6 triangles (angles get very small but mathematically easy to do.)
A type of vertex insertion; new vertices are inserted into the centroid of the subdivided triangles.
Add a vertex to each edge and cut. Can be done with and without smoothing.
Delete 2 triangles and add the opposite edge, recreating two triangles. Used for mesh refining
BE CAREFUL! A contractible edge ab must satisfy \textcolor{red}{Lk(a) \cup Lk(b) = Lk(ab)}.
Lk is the link function.
These are sufficient, other operations are a combination of the above. How to do these efficiently?
Any operation that moves vertices/edges can cause self-intersection. However we often want our model to be water-tight (closed manifold with no-intersection)
A set of points S is affinely independent if any point x in S is not a linear combination of S \setminus {x}.
A set of vectors is affinely dependent if there are more vectors than necessary to generate their affine hull.
A simplicial complex is a set K of simplices that must satisfy:
Given simplicial complex K and a subset S \subseteq K:
Below illustrates Lk(a) and Lk(ab). A contractible edge ab must satisfy \textcolor{red}{Lk(a) \cup Lk(b) = Lk(ab)}.
No self intersection = mesh is a simplicial complex.
Given 2 triangles, how do we tell if 2 triangles are intersecting?
How to check in a mesh with n vertices for intersections?
Naive: Brute force checking every pair of triangles O(n^2).
More efficient: We can use binary search trees to partition the triangles into pairs.
These more efficient methods reduce the number of triangles we have to brute-force compare on.
If 2 triangles share a common edge, we don’t consider them as intersecting (we can detect by checking the fnexts).
Imprecise calculations are bad. Heuristic epsilons, interval arithmetic don’t cut it.
Mostly in terms of predicates. e.g. Given 3 points, return if case is turn left, turn right or collinear.
Computation: \begin{aligned} & \det(\left| \begin{matrix} \mathbf{i} & \mathbf{j} & \mathbf{k}\\ x_c - x_b & y_c - y_b & 0 \\ x_b - x_a & y_b - y_a & 0 \\ \end{matrix} \right|) \\ & = \left|\begin{matrix} x_c - x_b & y_c - y_b \\ x_b - x_a & y_b - y_a \\ \end{matrix} \right| \mathbf{k} \\ & = \frac{1}{2} \left| \begin{matrix} x_a & y_a & 1 \\ x_b & y_b & 1 \\ x_c & y_c & 1 \\ \end{matrix} \right| \mathbf{k} \quad \textcolor{red}{\text{(SignedArea(a, b, c))}}\\ &\ge 0 \end{aligned}
a, b on opposite sides of c,d. and c, d on opposite sides of a, b.
\Rightarrow abd is a opposite handed turn of abc, and cda is an opposite handed turn of cdb
\Rightarrow \text{SignedArea}(a,b,d) \cdot \text{SignedArea}(a,b,c) <0 AND \text{SignedArea}(c,d,a) \cdot \text{SignedArea}(c,d,b)<0
When predicates (signed area) yield zero.
Arithmetic filter: only do exact arithmetic computation when falls within a certain epsilon of 0.