Navigation
API > API/Plugins > API/Plugins/DynamicMesh > API/Plugins/DynamicMesh/Operations
Inheritance Hierarchy
- FSimpleIntrinsicEdgeFlipMesh
- FIntrinsicEdgeFlipMesh
- FSimpleIntrinsicMesh
- FIntrinsicMesh
- FIntrinsicTriangulation
References
| Module | DynamicMesh |
| Header | /Engine/Plugins/Runtime/GeometryProcessing/Source/DynamicMesh/Public/Operations/IntrinsicTriangulationMesh.h |
| Include | #include "Operations/IntrinsicTriangulationMesh.h" |
Syntax
class FSimpleIntrinsicEdgeFlipMesh
Remarks
Intrinsic Meshes:
An Intrinsic Mesh can be thought of as a mesh that overlays another mesh, sharing the original surface. The edges of the intrinsic mesh are constrained to be on the original mesh surface, but need not align with the original mesh edges. The lengths of the intrinsic edges are measured on the surface of the original mesh (not the R3 distance). The original mesh vertices are a subset of the intrinsic mesh vertices and intrinsic edge splits and triangle pokes may introduce new intrinsic mesh vertices.
Note: the implementation is a simple triangle-based mesh but there is no restriction that edge(a, b) is unique (e.g. multiple intrinsic edges may connect the same two vertices with different paths). In fact this mesh allows triangles and edges with repeated vertices. Such structures arise naturally with intrinsic triangulation, for example an edge that starts and ends at the same vertex may encircle a mesh.
The bookkeeping that manages the correspondence between locations on the intrinsic mesh and on the surface mesh is implemented either using integer-based "Normal Coordinates" ( cf 'Integer Coordinates for Intrinsic Geometry Processing' M. Gillespie, N. Sharp, and K. Crane, TOG , Vol. 40, December 2021. ) as used by FIntrinsicEdgeFlipMesh and FIntrinsicMesh; or alternately floating-point based generalized directions "Signpost data" ( cf 'Signpost Coordinates inspired by "Navigating Intrinsic Triangulations' Sharp, Soliman and Crane [2019, ACM Transactions on Graphics]) as used by FIntrinsicTriangulation. The FSimpleIntrinsicEdgeFlipMesh is designed to work with the function FlipToDelaunay() to make an Intrinsic Delaunay Triangulation (IDT) of the same surface as a given FDynamicMesh, allowing for more robust cotangent-Laplacians (see LaplacianMatrixAssembly.h)
The vertices in this FSimpleIntrinsicEdgeFlipMesh are exactly those found in the surface mesh since it supports edge flips, but no other operations that change the mesh connectivity, and no operations that affect the vertices.
This mesh alone does not support computing the intersections of intrinsic edges with the surface mesh edges and as a result it can not be used to easily extract the path of an intrinsic edge. To do such computations FIntrinsicEdgeFlipMesh, FIntrinsicMesh or FIntrinsicTriangulation should be used.
The API of FIntrinsicEdgeFlipMesh is similar to FDynamicMesh3, but only has a minimal subset of methods and some such as ::FlipEdge() and ::GetEdgeOpposingV() have very different implementations.
In addition to managing vertices, triangles and edges this class also tracks edge lengths (as measured on the surface mesh) and for convenience the internal angles for each triangle.
Variables
| Type | Name | Description | |
|---|---|---|---|
| const int32[3] | AddOneModThree | ||
| const int32[3] | AddTwoModThree | ||
| TDynamicVector< double > | EdgeLengths | ||
| FRefCountVector | EdgeRefCounts | ||
| TDynamicVector< FEdge > | Edges | ||
| TDynamicVector< FVector3d > | InternalAngles | ||
| TDynamicVector< FIndex3i > | TriangleEdges | ||
| FRefCountVector | TriangleRefCounts | ||
| TDynamicVector< FIndex3i > | Triangles | ||
| FSmallListSet | VertexEdgeLists | ||
| FRefCountVector | VertexRefCounts | ||
| TDynamicVector< FVector3d > | Vertices |
Constructors
| Type | Name | Description | |
|---|---|---|---|
FSimpleIntrinsicEdgeFlipMesh
(
const FDynamicMesh3& SrcMesh |
Constructor does ID-matching deep copy the basic mesh topology (but no attributes or groups) | ||
Functions
| Type | Name | Description | |
|---|---|---|---|
| void | Clear () |
Discard all data | |
| FVector3d | ComputeTriInternalAnglesR
(
const int32 TID |
Computes the angles based on the edge lengths, so must have valid EdgeLengths for this tri before calling. | |
| double | EdgeCotanWeight
(
int32 EID |
Return 1/2 ( cot(alpha_{ij}) + cot(beta_{ij}) ) where alpha_{ij} and beta_{ij} are the to interior angles opposite the specified edge, EID. | |
| int32 | EdgeCount () |
||
| FRefCountVector::IndexEnumerable | |||
| FVector2d | EdgeOpposingAngles
(
int32 EID |
Return FVector2( alpha_{ij} , beta_{ij} ) where alpha_{ij} and beta_{ij} are the two interior angles opposite the specified edge, EID. | |
| EMeshResult | FlipEdge
(
int32 EID, |
Flip a single edge in the Intrinsic Mesh. | |
| EMeshResult | FlipEdgeTopology
(
int32 eab, |
Update the mesh topology (e.g. triangles and edges) by doing an edge flip, but does not update the intrinsic edge lengths or angles. | |
| FEdge | GetEdge
(
int32 EdgeID |
||
| double | GetEdgeLength
(
int32 EID |
||
| FVector3d | GetEdgeLengthTriple
(
const FIndex3i& EIDs |
||
| FIndex2i | GetEdgeOpposingV
(
int32 EID |
||
| FIndex2i | GetEdgeT
(
int32 EdgeID |
||
| FIndex2i | GetEdgeV
(
int32 EdgeID |
||
| double | GetOpposingVerticesDistance
(
int32 EID |
||
| FIndex2i | GetOrientedEdgeV
(
int32 EID, |
||
| FIndex3i | GetTriangle
(
int32 TriangleID |
||
| const FIndex3i & | GetTriangleRef
(
int TriangleID |
||
| FVector3d | GetTriEdgeLengths
(
const int32 TID |
||
| FIndex3i | GetTriEdges
(
int32 TriangleID |
||
| double | GetTriInternalAngleR
(
const int32 TID, |
||
| FVector3d | GetVertex
(
int32 VertexID |
||
| int32 | GetVtxEdgeCount
(
int32 VID |
||
| bool | IsBoundaryEdge
(
int32 EdgeID |
||
| bool | IsBoundaryVertex
(
int32 VertexID |
||
| bool | IsEdge
(
int32 EdgeID |
||
| bool | IsTriangle
(
int32 TriangleID |
||
| bool | IsVertex
(
int32 VertexID |
||
| int32 | MaxEdgeID () |
||
| int32 | |||
| int32 | MaxVertexID () |
||
| Vector3Type | Permute
(
int32 Index, |
Cyclic permutation of the src vector such that the 'Index' entry in the src is the first entry in the result NB: Index must be 0, 1, or 2. | |
| int32 | ReplaceEdgeTriangle
(
int32 eID, |
Replace tOld with tNew in an existing edge | |
| int32 | ReplaceTriangleEdge
(
int32 tID, |
Replace eOld with eNew in and existing triangle | |
| void | Reset
(
const FDynamicMesh3& SrcMesh |
Reset the mesh to an ID-matching deep copy the basic mesh topology (but no attributes or groups) | |
| void | SetEdgeTrianglesInternal
(
int32 EdgeID, |
Update the existing edge to reference triangles t0 and t1 | |
| void | SetEdgeVerticesInternal
(
int32 EdgeID, |
Update the existing edge to reference vertices 'a' and 'b'. | |
| int32 | |||
| FRefCountVector::IndexEnumerable | |||
| FSmallListSet::ValueEnumerable | VtxEdgesItr
(
int32 VID |
Typedefs
| Name | Description |
|---|---|
| FEdge | |
| FEdgeFlipInfo |
Constants
| Name | Description |
|---|---|
| InvalidID | InvalidID indicates that a vertex/edge/triangle ID is invalid |