Holes and boundaries
Restoring boundaries
The package also provides an option for restoring boundaries. In addition to setting the RestoreBoundary property, one needs to provide edge constraints to restore the boundaries.
using var constraintEdges = new NativeArray<int>(..., Allocator.Persistent);
using var positions = new NativeArray<double2>(..., Allocator.Persistent);
using var triangulator = new Triangulator(Allocator.Persistent)
{
Input = {
Positions = positions,
ConstraintEdges = constraintEdges,
},
Settings = {
RestoreBoundary = true,
}
};
triangulator.Run();
var triangles = triangulator.Output.Triangles;
Holes supports
The package also provides an option for creating holes.
In addition to setting the Input.ConstraintEdges, a user needs to provide positions of the holes in the same space as the Input.Positions. Enabling the RestoreBoundary option is not mandatory; holes could be introduced independently of preserving the boundaries.
using var constraintEdges = new NativeArray<int>(..., Allocator.Persistent);
using var holes = new NativeArray<double2>(..., Allocator.Persistent);
using var positions = new NativeArray<double2>(..., Allocator.Persistent);
using var triangulator = new Triangulator(Allocator.Persistent)
{
Input = {
Positions = positions,
ConstraintEdges = constraintEdges,
HoleSeeds = holes,
},
Settings = {
RestoreBoundary = true, // optional can be set independently
}
};
triangulator.Run();
var triangles = triangulator.Output.Triangles;
Auto holes and boundary
The package also provides automatic hole detection and restoring boundary. If one sets Settings.AutoHolesAndBoundary to true, then holes will be created automatically depending on the provided constraints.
using var positions = new NativeArray<double2>(..., Allocator.Persistent);
using var constraintEdges = new NativeArray<int>(..., Allocator.Persistent);
using var triangulator = new Triangulator(Allocator.Persistent)
{
Input = {
Positions = positions,
ConstraintEdges = constraintEdges,
},
Settings = { AutoHolesAndBoundary = true, },
};
triangulator.Run();
var triangles = triangulator.Output.Triangles;
Note
AutoHolesAndBoundary fills regions using the even-odd rule, so islands can be nested at any depth:
regions inside an odd number of constraint loops are kept, and regions inside an even number are removed.
Ignore constraints for planting seeds
As described in the introduction, the algorithm for triangle removal (and automatic hole detection) is based on a "spreading virus" mechanism, where constrained edges block the propagation. This behavior can be overridden by setting IgnoreConstraintForPlantingSeeds to true for a given constraint
using var positions = new NativeArray<double2>(..., Allocator.Persistent);
using var constraintEdges = new NativeArray<int>(..., Allocator.Persistent);
using var ignoreConstraint = new NativeArray<bool>(..., Allocator.Persistent);
using var triangulator = new Triangulator(Allocator.Persistent)
{
Input = {
Positions = positions,
ConstraintEdges = constraintEdges,
IgnoreConstraintForPlantingSeeds = ignoreConstraint,
},
Settings = { AutoHolesAndBoundary = true, },
};
triangulator.Run();
var triangles = triangulator.Output.Triangles;
This feature is especially useful when the user wants to include a constraint but does not wish to enable hole detection for that edge. Consider the following example input:
In this example, the red constraint is set to true in IgnoreConstraintForPlantingSeeds. As a result, a hole is not generated from red constraint, and the edge remains part of the final triangulation.