This library consists of two folders. The idea is that one is for testing purposes and the other folder is the folder you drag into your project.
Make sure all input coordinates are normalized to range 0-1 to avoid floating point precision issues! Normalizing methods exists in HelpMethods. This is not always needed but if you notice that an algorithm doesn't work, try to normalize the input coordinates.
Some of these algorithms are available in tutorial form here: https://www.habrador.com/tutorials/math/
Point-triangle
Point-polygon. Suffers from floating point precision issues
Triangle-triangle
AABB-AABB
Line-line
Ray-plane
Line-plane
Plane-plane
Point-circle
Grid mesh
Mesh shapes: Arrow, circles, lines
*Jarvis March. Is also known as "Gift wrapping"
Triangulate convex polygon.
You have points on a convex hull you want to triangulate. You have four options here if you have colinear points (points on the same line):
- Triangulate the convex hull while ignoring the colinear points. The area covered will be the same anyway.
- Triangulate the convex hull and add the colinear points by splitting triangle edges.
- Add a point inside of the convex hull.
- Use the algorithm below called "Triangulate points with 'visible edge' algorithm."
Triangulate points with "visible edge" algorithm.
You have some points you want to triangulate, you follow the steps:
- Sort all points in x and then y direction
- Find the first triangle
- Add the rest of the sorted points one-by-one and build triangles to visible edges on the existing triangulation. To determine if an edge is visible from the point you build the convex shape from the existing triangles. Then for each edge in the convex hull, you build a triangle with the point. If this triangle is oriented clockwise, the edge is visible and you can add a new triangle.
A visualization of this algorithm can be found here: https://www.youtube.com/watch?v=MkMXKu1m6A4
Triangulate points with "point-by-point" algorithm.
You have some points you want to triangulate, you follow the steps:
- Generate the convex hull of all points.
- Triangulate the convex hull with one of several algorithms mentioned above.
- Add the rest of the points one-by-one by splitting the triangles they end up in into three new triangles.
"point-by-point" method
You generate a big triangle around all points you want to triangulate. Then you add each point one after the other. The triangle the point ends up in is split into three new triangles. After the split you restore the Delaunay triangulation by flipping edges. When all points have been added you remove the remains of the first big triangle. A visualization of this algorithm can be found here: https://www.youtube.com/watch?v=YNQR5tH-s40
"flip edges" method
You triangulate the points by using a "bad" triangulation method (which is in this case either "visible edge" or "point-by-point" from above). Then you go through all edges and check if the edge should be flipped to make a better triangle. When no more edges can be flipped you are done! A visualization of this algorithm can be found: https://www.youtube.com/watch?v=-d7Nb4fxL5s and https://www.youtube.com/watch?v=lR_SzgEkDwk
Constrained triangulation
You add the constraints to the points and generate a Delaunay triangulation by using one of the above methods. Use this triangulation to find which edges interesect with the constraints. Then you flip these edges until they no longer interesect with the constraint. You finally remove the triangles that are "inside" of the constraint.
From a Delaunay triangulation
You first generate a Delaunay triangulation by using some method. Then you use the fact that you can get the Voronoi diagram from the Delaunay triangulation.
Greiner-Hormann method
Sutherland-Hodgman method
Is a triangle oriented clockwise?
Is a point left, on, or right of vector?
Is a point left, on, or right of a plane? Which is the same as the distance to the plane.
Is a quadrilateral convex?
Is a point between two other points on the same line?
Closest point on a line-segment?
- Dynamic constrained delaunay triangulation
- Convex hull: Quickhull from the Valve paper
- Convex hull: Graham scan
- Marching cubes
- Cut 3d mesh with plane
- Metaballs
- Voronoi with Fortune's algorithm
- Voronoi point-by-point
- Triangulation concave polygon by ear clipping
- Rectangle-rectangle with SAT
- Triangulate with marching squares
- Optimize Constrained Delaunay - there's a faster method to find edges that intersects with the constrained edge. I also think the method where triangles within the constrain is removed can be faster.
- Make a test scene to test that the "find which triangle a point is in by triangulation walk" is working
Follow me on Twitter for more Unity stuff: https://twitter.com/eriknordeus