#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(any(doc, doctest), doc = include_str!("../README.md"))]
#![forbid(unsafe_code)]
#[expect(
clippy::redundant_pub_crate,
reason = "`pub(crate)` keeps internal cross-module intent visible while `core` is private"
)]
mod core {
pub mod algorithms {
pub mod flips;
pub mod incremental_insertion;
pub mod locate;
pub(crate) mod pl_manifold_repair;
}
pub mod adjacency;
pub mod facet_incidence;
pub mod simplex;
pub mod collections {
mod aliases;
mod buffers;
mod helpers;
mod key_maps;
mod secondary_maps;
mod triangulation_maps;
pub(crate) mod spatial_hash_grid;
pub(crate) use aliases::StorageMap;
pub use aliases::{
Entry, FacetIndex, FastBuildHasher, FastHashMap, FastHashSet, FastHasher,
MAX_PRACTICAL_DIMENSION_SIZE, SecureHashMap, SecureHashSet, SmallBuffer, Uuid,
};
pub use buffers::*;
pub use helpers::*;
pub use key_maps::*;
pub use secondary_maps::*;
pub use triangulation_maps::*;
}
pub mod construction;
pub mod edge;
pub mod facet;
pub mod insertion;
pub mod operations;
pub mod orientation;
pub mod query;
pub mod realization;
pub mod repair;
pub(crate) mod rollback;
pub mod tds {
mod equality;
pub mod errors;
pub(crate) mod incidence;
mod keys;
mod mutation;
pub(crate) mod rollback;
mod snapshot;
mod storage;
mod validation;
pub use errors::*;
pub use keys::{SimplexKey, VertexKey};
pub(crate) use rollback::{
TdsOwnerRollbackTransaction, TdsRollbackOwner, TdsRollbackTransaction,
};
pub use storage::{Tds, TopologyOwner, TopologyOwnerId};
}
pub mod triangulation;
pub mod validation;
pub mod util {
pub(crate) mod canonical_points;
pub mod deduplication;
pub mod facet_keys;
pub mod facet_utils;
pub mod hashing;
pub mod hilbert;
pub mod jaccard;
pub mod measurement;
pub mod uuid;
pub use deduplication::*;
pub use facet_keys::*;
pub use facet_utils::*;
pub use hashing::*;
pub use hilbert::*;
pub use jaccard::*;
pub use measurement::*;
pub use uuid::*;
}
pub mod vertex;
pub mod traits {
pub mod data_type;
pub mod facet_incidence_analysis;
pub use data_type::*;
}
}
#[cfg(feature = "bench")]
#[doc(hidden)]
pub mod bench_fixtures;
pub mod geometry {
pub mod algorithms {
pub mod convex_hull;
pub use convex_hull::*;
}
pub mod coordinate_range;
pub mod realization;
#[macro_use]
pub mod matrix;
pub mod kernel;
pub mod point;
pub mod predicates;
pub mod quality;
pub mod robust_predicates;
pub mod sos;
pub mod util {
pub mod circumsphere;
pub mod conversions;
pub mod measures;
pub mod norms;
pub mod point_generation;
pub(crate) mod simplex_lp;
pub mod triangulation_generation;
pub use circumsphere::*;
pub use conversions::*;
pub use measures::*;
pub use norms::*;
pub use point_generation::*;
pub use triangulation_generation::*;
}
pub mod traits {
pub mod coordinate;
pub use coordinate::*;
}
pub use algorithms::*;
pub use coordinate_range::*;
pub use matrix::*;
pub use point::*;
pub use predicates::*;
pub use quality::*;
pub use realization::*;
pub use traits::*;
pub use util::*;
}
#[path = "delaunay/builder.rs"]
pub mod builder;
#[path = "delaunay/construction.rs"]
pub mod construction;
#[path = "delaunay/property_validation.rs"]
mod delaunay_property_validation;
#[path = "delaunay/query.rs"]
pub(crate) mod delaunay_query;
#[path = "delaunay/rollback.rs"]
pub(crate) mod delaunay_rollback;
#[path = "delaunay/delaunayize.rs"]
pub mod delaunayize;
#[path = "delaunay/deletion.rs"]
pub(crate) mod deletion;
#[path = "delaunay/diagnostics.rs"]
pub mod diagnostics;
#[path = "delaunay/flips.rs"]
pub mod flips;
#[path = "delaunay/insertion.rs"]
pub(crate) mod insertion;
#[path = "delaunay/locality.rs"]
pub(crate) mod locality;
#[path = "delaunay/pachner.rs"]
pub mod pachner;
#[path = "delaunay/repair.rs"]
pub mod repair;
#[path = "delaunay/serialization.rs"]
pub(crate) mod serialization;
#[path = "delaunay/spherical.rs"]
pub mod spherical;
#[path = "delaunay/triangulation.rs"]
pub(crate) mod triangulation;
#[path = "delaunay/validation.rs"]
pub mod validation;
pub mod io {
pub mod visualization;
pub use visualization::*;
}
pub use crate::builder::DelaunayTriangulationBuilder;
pub use crate::construction::{
ConstructionOptions, ConstructionSkipSample, ConstructionSlowInsertionSample,
ConstructionStatistics, DedupPolicy, DedupTolerance, DelaunayConstructionFailure,
DelaunayConstructionRepairPhase, DelaunayConstructionRetryFailure, DelaunayError,
DelaunayResult, DelaunayTriangulationConstructionError,
DelaunayTriangulationConstructionErrorWithStatistics, InitialSimplexStrategy,
InsertionOrderStrategy, RetryPolicy,
};
pub use crate::core::algorithms::incremental_insertion::{
CavityFillingError, CavityRepairStage, DelaunayRepairErrorKind, DelaunayRepairFailureContext,
HullExtensionReason, InitialSimplexConstructionError, InitialSimplexUnexpectedInsertionStage,
InsertionError, InsertionErrorKind, InsertionErrorSourceKind,
InsertionTopologyValidationContext, NeighborRebuildError, NeighborWiringError,
SpatialIndexConstructionFailure, TdsConstructionFailure, TdsValidationFailure,
};
pub use crate::core::algorithms::pl_manifold_repair::{
PlManifoldRepairError, PlManifoldRepairStage, PlManifoldRepairStats,
};
pub use crate::core::construction::{
FinalDelaunayValidationContext, FinalTopologyValidationContext, TriangulationConstructionError,
};
pub use crate::core::insertion::DuplicateDetectionMetrics;
pub use crate::core::operations::{
InsertionOutcome, InsertionResult, InsertionStatistics, RepairDecision, RepairSkipReason,
SuspicionFlags, TopologicalOperation,
};
pub use crate::core::realization::{
PeriodicDomainPeriodError, TriangulationRealizationIntersectionDetail,
TriangulationRealizationSimplexDetail, TriangulationRealizationSimplexPairDetail,
TriangulationRealizationValidationError, TriangulationRealizationValidationErrorKind,
TriangulationRealizationValidationReport,
};
pub use crate::core::triangulation::Triangulation;
pub use crate::core::util::DeduplicationError;
pub use crate::core::validation::{
OrientationWitness, TopologyGuarantee, TriangulationValidationError,
ValidationConfigurationError, ValidationPolicy,
};
#[cfg(feature = "diagnostics")]
#[cfg_attr(docsrs, doc(cfg(feature = "diagnostics")))]
pub use crate::delaunay_property_validation::debug_print_first_delaunay_violation;
pub use crate::delaunay_property_validation::{
DelaunayValidationError, DelaunayViolationDetail, DelaunayViolationReport,
delaunay_violation_report, find_delaunay_violations,
};
pub use crate::delaunay_query::{SimplexBarycenterError, SimplexDataFillError};
pub use crate::deletion::DeleteVertexError;
pub use crate::io::visualization::{
AdjacencyRecord, MESH_EXPORT_SCHEMA, MESH_EXPORT_SCHEMA_VERSION, MeshAdjacencyRecord,
MeshExport, MeshExportError, MeshExportValidationError, MeshSimplexRecord, MeshVertexRecord,
SimplexRecord, VISUALIZATION_SCHEMA, VISUALIZATION_SCHEMA_VERSION, ValidatedMeshExport,
ValidatedVisualizationData, VertexRecord, VisualizationData, VisualizationDataValidationError,
VisualizationExportError, VisualizationMetadata, VisualizationTopologyGuarantee,
VisualizationTopologyKind,
};
pub use crate::repair::{
DelaunayCheckPolicy, DelaunayRepairHeuristicConfig, DelaunayRepairHeuristicSeeds,
DelaunayRepairOperation, DelaunayRepairOutcome, DelaunayRepairPolicy,
};
pub use crate::spherical::{
SphericalDelaunayBuilder, SphericalDelaunayConstructionError, SphericalDelaunayTriangulation,
SphericalDelaunayValidationError, SphericalSimplex, SphericalSimplexError,
SphericalValidationLayer,
};
pub use crate::tds::{
InvariantError, InvariantKind, InvariantViolation, TriangulationValidationReport,
};
pub use crate::topology::spaces::spherical::{
SphericalMetric, SphericalPoint, SphericalPointError,
};
pub use crate::triangulation::*;
pub use crate::validation::{
DelaunayTriangulationValidationError, DelaunayVerificationError, DelaunayVerificationErrorKind,
};
pub fn try_vertices_from_points<const D: usize>(
points: &[geometry::Point<D>],
) -> Result<Vec<tds::Vertex<(), D>>, geometry::CoordinateConversionError> {
points
.iter()
.map(|point| tds::Vertex::try_new(*point.coords()))
.collect()
}
pub mod topology {
pub mod traits {
pub(crate) mod global_topology_model;
pub mod topological_space;
pub use global_topology_model::GlobalTopologyModelError;
pub use topological_space::*;
}
pub mod characteristics {
pub mod euler;
pub mod validation;
pub use euler::*;
pub use validation::*;
}
pub mod manifold;
pub mod ridge;
pub mod spaces {
pub mod euclidean;
pub mod spherical;
pub mod toroidal;
pub use euclidean::EuclideanSpace;
pub use spherical::{SphericalMetric, SphericalPoint, SphericalPointError};
pub use toroidal::{LiftedLinkEdge, LiftedVertexId, ToroidalSpace};
}
pub use crate::TopologyGuarantee;
pub use characteristics::*;
pub use manifold::{
BoundaryFacetClassification, ManifoldError, classify_boundary_facet,
validate_closed_boundary, validate_ridge_links, validate_vertex_links,
};
pub use ridge::{
RidgeCandidate, RidgeCandidateError, RidgeLinkView, RidgeQuery, RidgeView,
ridge_star_simplices,
};
pub use traits::*;
}
pub mod collections {
pub use crate::core::collections::{
Entry, FacetIndex, FacetIssuesMap, FacetSharingSimplicesBuffer, FacetVertexMap,
FastBuildHasher, FastHashMap, FastHashSet, FastHasher, KeyBasedSimplexMap,
KeyBasedVertexMap, MAX_PRACTICAL_DIMENSION_SIZE, NeighborBuffer, PeriodicOffsetBuffer,
SecureHashMap, SecureHashSet, SimplexKeyBuffer, SimplexKeySet, SimplexNeighborsMap,
SimplexSecondaryMap, SimplexToVertexUuidsMap, SimplexVertexBuffer, SimplexVertexKeyBuffer,
SimplexVertexKeysMap, SimplexVertexUuidBuffer, SimplexVerticesMap, SmallBuffer, Uuid,
UuidToSimplexKeyMap, UuidToVertexKeyMap, VertexKeyBuffer, VertexKeySet, VertexSecondaryMap,
VertexToSimplicesMap, VertexUuidBuffer, VertexUuidSet, fast_hash_map_with_capacity,
fast_hash_set_with_capacity, small_buffer_with_capacity_2, small_buffer_with_capacity_8,
small_buffer_with_capacity_16,
};
pub mod algorithm_buffers {
pub use crate::core::collections::{
BadSimplexBuffer, CLEANUP_OPERATION_BUFFER_SIZE, CavityBoundaryBuffer, FacetInfoBuffer,
GeometricPointBuffer, PointBuffer, SimplexRemovalBuffer, ValidSimplicesBuffer,
ViolationBuffer,
};
}
}
pub mod tds {
pub use crate::core::adjacency::*;
pub use crate::core::collections::{
FacetIndex, FastHashMap, FastHashSet, NeighborBuffer, PeriodicOffsetBuffer,
SimplexKeyBuffer, SmallBuffer, Uuid,
};
pub use crate::core::edge::*;
pub use crate::core::facet::*;
pub use crate::core::simplex::*;
pub use crate::core::tds::*;
pub use crate::core::util::{
UuidValidationError, checked_facet_key_from_vertex_keys, facet_view_to_vertices,
facet_views_are_adjacent, format_jaccard_report, jaccard_distance, jaccard_index,
make_uuid, measure_with_result, stable_hash_u64_slice, usize_to_u8, validate_uuid,
verify_facet_index_consistency,
};
pub use crate::core::vertex::*;
}
pub mod algorithms {
#[cfg(feature = "diagnostics")]
#[cfg_attr(docsrs, doc(cfg(feature = "diagnostics")))]
pub use crate::core::algorithms::locate::verify_conflict_region_completeness;
pub use crate::core::algorithms::locate::{
ConflictError, InternalInconsistencySite, LocateError, LocateFallback,
LocateFallbackReason, LocateResult, LocateStats, extract_cavity_boundary,
find_conflict_region, locate, locate_with_stats,
};
}
pub mod query {
pub use crate::assert_jaccard_gte;
pub use crate::core::query::QueryError;
pub use crate::core::traits::data_type::{
DataCopy, DataDebug, DataDeserialize, DataIdentity, DataSerde, DataSerialize, DataType,
};
pub use crate::core::traits::facet_incidence_analysis::FacetIncidenceAnalysis;
pub use crate::core::util::{
JaccardComputationError, extract_edge_set, extract_facet_identifier_set,
extract_hull_facet_set, extract_vertex_coordinate_set, format_jaccard_report,
jaccard_distance, jaccard_index, measure_with_result,
};
pub use crate::flips::RidgeHandle;
pub use crate::geometry::Point;
pub use crate::geometry::algorithms::convex_hull::{
ConvexHull, ConvexHullConstructionError, ConvexHullValidationError,
};
pub use crate::geometry::kernel::{
AdaptiveKernel, ExactPredicates, FastKernel, Kernel, RobustKernel,
};
pub use crate::geometry::traits::coordinate::Coordinate;
pub use crate::geometry::{insphere, insphere_distance, insphere_lifted};
pub use crate::tds::{
AllFacetsIter, BoundaryFacetsIter, EdgeIndex, EdgeKey, EdgeKeyError, EdgeView, FacetHandle,
FacetIncidenceView, FacetToSimplicesIndex, FacetView, IncidenceView, OneSidedFacetsIter,
Simplex, SimplexFacetsIter, SimplexKey, SimplexNeighborIndex, TopologyIndexBuildError,
TriangulationAdjacency, Vertex, VertexKey,
};
pub use crate::topology::ridge::{
RidgeCandidate, RidgeCandidateError, RidgeLinkView, RidgeQuery, RidgeView,
};
pub use crate::{DelaunayTriangulation, Triangulation};
pub use crate::{SimplexBarycenterError, SimplexDataFillError};
}
pub mod prelude {
pub use crate::query::{
DataCopy, DataDebug, DataDeserialize, DataIdentity, DataSerde, DataSerialize, DataType,
FacetIncidenceAnalysis, QueryError, RidgeCandidate, RidgeCandidateError, RidgeHandle,
RidgeLinkView, RidgeQuery, RidgeView, SimplexBarycenterError, SimplexDataFillError,
};
pub use crate::tds::*;
pub use crate::vertex;
pub use crate::{
ConstructionOptions, ConstructionSkipSample, ConstructionSlowInsertionSample,
ConstructionStatistics, DedupPolicy, DedupTolerance, DelaunayCheckPolicy,
DelaunayConstructionFailure, DelaunayConstructionRepairPhase,
DelaunayConstructionRetryFailure, DelaunayError, DelaunayRepairHeuristicConfig,
DelaunayRepairHeuristicSeeds, DelaunayRepairOperation, DelaunayRepairOutcome,
DelaunayRepairPolicy, DelaunayResult, DelaunayTriangulation, DelaunayTriangulationBuilder,
DelaunayTriangulationConstructionError,
DelaunayTriangulationConstructionErrorWithStatistics, DelaunayTriangulationValidationError,
DelaunayVerificationError, DelaunayVerificationErrorKind, DuplicateDetectionMetrics,
FinalDelaunayValidationContext, FinalTopologyValidationContext, InitialSimplexStrategy,
InsertionOrderStrategy, InsertionResult, PeriodicDomainPeriodError, PlManifoldRepairError,
PlManifoldRepairStage, PlManifoldRepairStats, RepairDecision, RepairSkipReason,
RetryPolicy, SphericalDelaunayBuilder, SphericalDelaunayConstructionError,
SphericalDelaunayTriangulation, SphericalDelaunayValidationError, SphericalMetric,
SphericalPoint, SphericalPointError, SphericalSimplex, SphericalSimplexError,
SphericalValidationLayer, TopologicalOperation, TopologyGuarantee, Triangulation,
TriangulationConstructionError, TriangulationRealizationIntersectionDetail,
TriangulationRealizationSimplexDetail, TriangulationRealizationSimplexPairDetail,
TriangulationRealizationValidationError, TriangulationRealizationValidationErrorKind,
TriangulationRealizationValidationReport, TriangulationValidationError,
TriangulationValidationReport, ValidationConfigurationError, ValidationPolicy,
try_vertices_from_points,
};
pub use self::ordering::{
HilbertBitDepth, HilbertError, HilbertQuantizedBatch, HilbertQuantizedVec,
MAX_HILBERT_BITS, hilbert_index_in_range, hilbert_indices_for_quantized_batch,
hilbert_indices_prequantized, hilbert_quantize_batch_in_range, hilbert_quantize_in_range,
hilbert_sort_by_stable_in_range, hilbert_sort_by_unstable_in_range,
hilbert_sorted_indices_in_range, try_hilbert_index, try_hilbert_quantize,
try_hilbert_sort_by_stable, try_hilbert_sort_by_unstable, try_hilbert_sorted_indices,
};
pub use crate::core::util::{
DeduplicationError, dedup_vertices_epsilon, dedup_vertices_exact,
filter_vertices_excluding, try_dedup_vertices_epsilon,
};
pub use crate::delaunay_property_validation::{
DelaunayValidationError, DelaunayViolationDetail, DelaunayViolationReport,
delaunay_violation_report, find_delaunay_violations,
};
pub use crate::query::{
JaccardComputationError, extract_edge_set, extract_facet_identifier_set,
extract_hull_facet_set, extract_vertex_coordinate_set, format_jaccard_report,
jaccard_distance, jaccard_index, measure_with_result,
};
pub use crate::tds::{
UuidValidationError, checked_facet_key_from_vertex_keys, facet_view_to_vertices,
facet_views_are_adjacent, make_uuid, stable_hash_u64_slice, usize_to_u8, validate_uuid,
verify_facet_index_consistency,
};
pub use crate::topology::{
GlobalTopology, GlobalTopologyModelError, TopologyError, TopologyKind,
ToroidalConstructionMode, ToroidalDomain, ToroidalDomainError,
};
pub use crate::algorithms::{
ConflictError, InternalInconsistencySite, LocateError, LocateFallback,
LocateFallbackReason, LocateResult, LocateStats, locate, locate_with_stats,
};
pub use crate::{
CavityFillingError, CavityRepairStage, DelaunayRepairErrorKind,
DelaunayRepairFailureContext, HullExtensionReason, InitialSimplexConstructionError,
InitialSimplexUnexpectedInsertionStage, InsertionError, InsertionErrorKind,
InsertionErrorSourceKind, InsertionTopologyValidationContext, NeighborRebuildError,
NeighborWiringError, SpatialIndexConstructionFailure, TdsConstructionFailure,
TdsValidationFailure,
};
pub use crate::{InsertionOutcome, InsertionStatistics, SuspicionFlags};
pub use crate::flips::{
DelaunayRepairDiagnostics, DelaunayRepairError, DelaunayRepairHeuristicRebuildFailure,
DelaunayRepairHeuristicRebuildFailureKind, DelaunayRepairHeuristicVertexContext,
DelaunayRepairOrientationCanonicalizationFailure,
DelaunayRepairOrientationCanonicalizationFailureKind, DelaunayRepairPostconditionFailure,
DelaunayRepairStats, DelaunayRepairVerificationContext, FlipContextError,
FlipEdgeAdjacencyError, FlipError, FlipFailureKind, FlipMutationError,
FlipNeighborCavityFailureKind, FlipNeighborDelaunayValidationFailureKind,
FlipNeighborHullExtensionFailureKind, FlipNeighborRepairDiagnostics,
FlipNeighborRepairFailure, FlipNeighborWiringError, FlipOrientationCheckStage,
FlipPredicateError, FlipPredicateOperation, FlipTriangleAdjacencyError,
FlipVertexAdjacencyError, RepairQueueOrder, TriangleHandleError,
};
pub use crate::collections::{
FastHashMap, FastHashSet, SecureHashMap, SecureHashSet, SimplexNeighborsMap,
SimplexSecondaryMap, SmallBuffer, VertexSecondaryMap, VertexToSimplicesMap,
fast_hash_map_with_capacity, fast_hash_set_with_capacity,
};
pub use crate::geometry::{
algorithms::*, coordinate_range::*, kernel::*, matrix::*, point::*, predicates::*,
quality::*, robust_predicates::*, traits::coordinate::*, util::*,
};
pub mod construction {
pub use crate::builder::{DelaunayTriangulationBuilder, ExplicitConstructionError};
pub use crate::construction::{
ConstructionOptions, ConstructionSkipSample, ConstructionSlowInsertionSample,
ConstructionStatistics, DedupPolicy, DedupTolerance, DelaunayConstructionFailure,
DelaunayConstructionRepairPhase, DelaunayConstructionRetryFailure, DelaunayError,
DelaunayResult, DelaunayTriangulationConstructionError,
DelaunayTriangulationConstructionErrorWithStatistics, InitialSimplexStrategy,
InsertionOrderStrategy, RetryPolicy,
};
pub use crate::core::util::DeduplicationError;
pub use crate::geometry::coordinate_range::{
CoordinateRangeBound, CoordinateRangeError, CoordinateRangeOrdering,
InvalidCoordinateValue,
};
pub use crate::geometry::traits::coordinate::CoordinateValidationError;
pub use crate::geometry::util::{InvalidPositiveScalar, RandomPointGenerationError};
pub use crate::repair::DelaunayRepairPolicy;
pub use crate::spherical::{
SphericalDelaunayBuilder, SphericalDelaunayConstructionError,
SphericalDelaunayTriangulation, SphericalDelaunayValidationError, SphericalSimplex,
SphericalSimplexError, SphericalValidationLayer,
};
pub use crate::tds::{
SimplexValidationError, SimplexValidationReport, Vertex, VertexValidationError,
VertexValidationReport,
};
pub use crate::topology::traits::{
GlobalTopology, GlobalTopologyModelError, TopologyKind, ToroidalConstructionMode,
ToroidalDomain, ToroidalDomainError,
};
pub use crate::validation::{
DelaunayTriangulationValidationError, DelaunayVerificationError,
DelaunayVerificationErrorKind,
};
pub use crate::vertex;
pub use crate::{
CavityFillingError, CavityRepairStage, DelaunayTriangulation, DeleteVertexError,
FinalDelaunayValidationContext, FinalTopologyValidationContext,
SpatialIndexConstructionFailure, TopologyGuarantee, Triangulation,
TriangulationConstructionError, try_vertices_from_points,
};
}
pub mod triangulation {
pub use crate::collections::{FacetIssuesMap, SimplexKeyBuffer, SmallBuffer};
pub use crate::geometry::kernel::{
AdaptiveKernel, ExactPredicates, FastKernel, Kernel, RobustKernel,
};
pub use crate::geometry::point::Point;
pub use crate::query::{
AllFacetsIter, BoundaryFacetsIter, DataCopy, DataDebug, DataDeserialize, DataIdentity,
DataSerde, DataSerialize, DataType, EdgeIndex, EdgeKey, EdgeKeyError, EdgeView,
FacetIncidenceAnalysis, FacetIncidenceView, FacetToSimplicesIndex, FacetView,
IncidenceView, OneSidedFacetsIter, QueryError, RidgeCandidate, RidgeCandidateError,
RidgeHandle, RidgeLinkView, RidgeQuery, RidgeView, SimplexFacetsIter,
SimplexNeighborIndex, TopologyIndexBuildError, TriangulationAdjacency,
};
pub use crate::tds::{
FacetHandle, InvariantError, NeighborSlot, Simplex, SimplexKey, Tds,
TdsConstructionError, TdsError, TdsErrorKind, TdsMutationError,
TriangulationValidationErrorKind, Vertex, VertexKey,
};
pub use crate::topology::manifold::ManifoldError;
pub use crate::vertex;
pub use crate::{
InsertionError, PeriodicDomainPeriodError, SpatialIndexConstructionFailure,
TopologyGuarantee, Triangulation, TriangulationConstructionError,
TriangulationRealizationIntersectionDetail, TriangulationRealizationSimplexDetail,
TriangulationRealizationSimplexPairDetail, TriangulationRealizationValidationError,
TriangulationRealizationValidationErrorKind, TriangulationRealizationValidationReport,
TriangulationValidationError, TriangulationValidationReport,
ValidationConfigurationError, ValidationPolicy,
};
}
pub mod pachner {
pub use crate::flips::{
BistellarFlipKind, FlipDirection, FlipError, RidgeHandle, TriangleHandle,
TriangleHandleError,
};
pub use crate::pachner::{
PachnerMove, PachnerMoveFeasibility, PachnerMoveResult, PachnerMoves, PachnerProposal,
};
pub use crate::tds::{
EdgeKey, EdgeKeyError, FacetError, FacetHandle, SimplexKey, TopologyOwner,
TopologyOwnerId, Vertex, VertexKey,
};
pub use crate::vertex;
}
pub mod insertion {
pub use crate::{
CavityFillingError, CavityRepairStage, DelaunayRepairErrorKind,
DelaunayRepairFailureContext, HullExtensionReason, InitialSimplexConstructionError,
InitialSimplexUnexpectedInsertionStage, InsertionError, InsertionErrorKind,
InsertionErrorSourceKind, InsertionTopologyValidationContext, NeighborRebuildError,
NeighborWiringError, SpatialIndexConstructionFailure, TdsConstructionFailure,
TdsValidationFailure,
};
pub use crate::{InsertionOutcome, InsertionResult, InsertionStatistics};
}
pub mod deletion {
pub use crate::DeleteVertexError;
pub use crate::tds::VertexKey;
}
pub mod operations {
pub use crate::{
InsertionOutcome, InsertionResult, InsertionStatistics, RepairDecision,
RepairSkipReason, SuspicionFlags, TopologicalOperation,
};
}
pub mod repair {
pub use crate::flips::{
DelaunayRepairDiagnostics, DelaunayRepairError, DelaunayRepairHeuristicRebuildFailure,
DelaunayRepairHeuristicRebuildFailureKind, DelaunayRepairHeuristicVertexContext,
DelaunayRepairOrientationCanonicalizationFailure,
DelaunayRepairOrientationCanonicalizationFailureKind,
DelaunayRepairPostconditionFailure, DelaunayRepairStats,
DelaunayRepairVerificationContext, FlipContextError, FlipEdgeAdjacencyError, FlipError,
FlipFailureKind, FlipMutationError, FlipNeighborCavityFailureKind,
FlipNeighborDelaunayValidationFailureKind, FlipNeighborHullExtensionFailureKind,
FlipNeighborRepairDiagnostics, FlipNeighborRepairFailure, FlipNeighborWiringError,
FlipOrientationCheckStage, FlipPredicateError, FlipPredicateOperation,
FlipTriangleAdjacencyError, FlipVertexAdjacencyError, RepairQueueOrder,
TriangleHandleError,
};
pub use crate::repair::{
DelaunayCheckPolicy, DelaunayRepairHeuristicConfig, DelaunayRepairHeuristicSeeds,
DelaunayRepairOutcome, DelaunayRepairPolicy,
};
pub use crate::{
DelaunayRepairErrorKind, DelaunayRepairOperation, DelaunayTriangulation,
DelaunayTriangulationValidationError, DelaunayVerificationError,
DelaunayVerificationErrorKind,
};
pub use crate::{
DelaunayValidationError, DelaunayViolationDetail, DelaunayViolationReport,
delaunay_violation_report, find_delaunay_violations,
};
pub use crate::{
TopologyGuarantee, Triangulation, ValidationConfigurationError, ValidationPolicy,
};
}
pub mod delaunayize {
pub use crate::delaunayize::*;
pub use crate::{DelaunayTriangulation, DelaunayTriangulationBuilder};
pub use crate::{PlManifoldRepairError, PlManifoldRepairStage, PlManifoldRepairStats};
}
pub mod validation {
pub use crate::topology::manifold::ManifoldError;
pub use crate::validation::*;
pub use crate::{
DelaunayTriangulationValidationError, DelaunayVerificationError,
DelaunayVerificationErrorKind, OrientationWitness, PeriodicDomainPeriodError,
SphericalDelaunayValidationError, SphericalValidationLayer, TopologyGuarantee,
TriangulationRealizationIntersectionDetail, TriangulationRealizationSimplexDetail,
TriangulationRealizationSimplexPairDetail, TriangulationRealizationValidationError,
TriangulationRealizationValidationErrorKind, TriangulationRealizationValidationReport,
TriangulationValidationError, TriangulationValidationReport,
ValidationConfigurationError, ValidationPolicy,
};
pub use crate::{
DelaunayValidationError, DelaunayViolationDetail, DelaunayViolationReport,
delaunay_violation_report, find_delaunay_violations,
};
}
pub mod collections {
pub use crate::collections::{
Entry, FacetIndex, FacetIssuesMap, FacetSharingSimplicesBuffer, FastBuildHasher,
FastHashMap, FastHashSet, FastHasher, KeyBasedSimplexMap, KeyBasedVertexMap,
MAX_PRACTICAL_DIMENSION_SIZE, NeighborBuffer, PeriodicOffsetBuffer, SecureHashMap,
SecureHashSet, SimplexKeyBuffer, SimplexKeySet, SimplexNeighborsMap,
SimplexSecondaryMap, SimplexToVertexUuidsMap, SimplexVertexBuffer,
SimplexVertexKeyBuffer, SimplexVertexKeysMap, SimplexVertexUuidBuffer,
SimplexVerticesMap, SmallBuffer, Uuid, UuidToSimplexKeyMap, UuidToVertexKeyMap,
VertexKeyBuffer, VertexKeySet, VertexSecondaryMap, VertexToSimplicesMap,
VertexUuidBuffer, VertexUuidSet, fast_hash_map_with_capacity,
fast_hash_set_with_capacity, small_buffer_with_capacity_2,
small_buffer_with_capacity_8, small_buffer_with_capacity_16,
};
pub mod algorithm_buffers {
pub use crate::collections::algorithm_buffers::{
BadSimplexBuffer, CLEANUP_OPERATION_BUFFER_SIZE, CavityBoundaryBuffer,
FacetInfoBuffer, GeometricPointBuffer, PointBuffer, SimplexRemovalBuffer,
ValidSimplicesBuffer, ViolationBuffer,
};
}
}
pub mod tds {
pub use crate::collections::{
FacetIndex, FastHashMap, FastHashSet, NeighborBuffer, PeriodicOffsetBuffer,
SimplexKeyBuffer, SmallBuffer, Uuid,
};
pub use crate::tds::*;
}
pub mod geometry {
pub use crate::geometry::{
coordinate_range::{
CoordinateRange, CoordinateRangeBound, CoordinateRangeError,
CoordinateRangeOrdering, InvalidCoordinateValue,
},
kernel::{AdaptiveKernel, ExactPredicates, FastKernel, Kernel, RobustKernel},
matrix::{LaError, Matrix, MatrixError, determinant},
point::Point,
predicates::{
InSphere, Orientation, insphere, insphere_distance, insphere_lifted,
simplex_orientation,
},
quality::{
QualityDegeneracyMeasure, QualityError, QualityNumericOperation,
QualitySimplexVerticesError, normalized_volume, radius_ratio,
},
realization::{
LabeledSimplexRealization, LabeledSimplexRealizationError, PeriodicSimplexSpan,
PeriodicSimplexSpanError, SimplexIntersectionFailure, SimplexIntersectionWitness,
SimplexRealizationBuffer, axis_aligned_bounding_boxes_overlap,
coordinate_range_for_axis, try_periodic_simplex_span,
validate_simplex_realizations_intersect_only_in_shared_faces,
},
robust_predicates::{
ConsistencyResult, InsphereConsistencyError, robust_insphere, robust_orientation,
},
traits::coordinate::{
Coordinate, CoordinateConversionError, CoordinateConversionValue,
CoordinateIdentity, CoordinateRepresentation, CoordinateValidationError,
CoordinateValues, DEFAULT_TOLERANCE_F64, DegenerateSimplexReason,
F64_MANTISSA_DIGITS, FiniteCheck, FiniteCoordinateValue, HashCoordinate,
OrderedCmp, OrderedEq,
},
util::{
ArrayConversionFailureReason, CircumcenterError, CircumcenterFailureReason,
DegenerateGeometry, DegenerateMeasure, SurfaceMeasureError, ValueConversionError,
ValueConversionFailureReason, circumcenter, circumradius, circumradius_with_center,
facet_measure, hypot, inradius, safe_coords_from_f64, safe_coords_to_f64,
safe_scalar_from_f64, safe_scalar_to_f64, safe_usize_to_scalar, simplex_volume,
squared_norm, surface_measure,
},
};
}
pub mod algorithms {
pub use crate::algorithms::{
ConflictError, InternalInconsistencySite, LocateError, LocateFallback,
LocateFallbackReason, LocateResult, LocateStats, extract_cavity_boundary,
find_conflict_region, locate, locate_with_stats,
};
}
pub mod diagnostics {
#[cfg(feature = "diagnostics")]
#[cfg_attr(docsrs, doc(cfg(feature = "diagnostics")))]
pub use crate::algorithms::verify_conflict_region_completeness;
#[cfg(feature = "diagnostics")]
#[cfg_attr(docsrs, doc(cfg(feature = "diagnostics")))]
pub use crate::debug_print_first_delaunay_violation;
pub use crate::diagnostics::{
BatchLocalRepairTrigger, ConstructionTelemetry, LocalRepairSample,
};
pub use crate::tds::NeighborSlot;
pub use crate::{
DelaunayViolationDetail, DelaunayViolationReport, delaunay_violation_report,
};
}
pub mod export {
pub use crate::geometry::traits::coordinate::InvalidCoordinateValue;
pub use crate::io::visualization::{
AdjacencyRecord, MESH_EXPORT_SCHEMA, MESH_EXPORT_SCHEMA_VERSION, MeshAdjacencyRecord,
MeshExport, MeshExportError, MeshExportValidationError, MeshSimplexRecord,
MeshVertexRecord, SimplexRecord, VISUALIZATION_SCHEMA, VISUALIZATION_SCHEMA_VERSION,
ValidatedMeshExport, ValidatedVisualizationData, VertexRecord, VisualizationData,
VisualizationDataValidationError, VisualizationExportError, VisualizationMetadata,
VisualizationTopologyGuarantee, VisualizationTopologyKind,
};
}
pub mod query {
pub use crate::tds::{
EdgeIndex, EdgeKey, EdgeKeyError, EdgeView, FacetHandle, FacetIncidenceView,
FacetToSimplicesIndex, IncidenceView, SimplexKey, SimplexNeighborIndex,
TopologyIndexBuildError, TriangulationAdjacency, VertexKey,
};
pub use crate::{DelaunayTriangulation, Triangulation};
pub use crate::geometry::Point;
pub use crate::geometry::kernel::{
AdaptiveKernel, ExactPredicates, FastKernel, Kernel, RobustKernel,
};
pub use crate::geometry::traits::coordinate::Coordinate;
pub use crate::query::{
AllFacetsIter, BoundaryFacetsIter, DataCopy, DataDebug, DataDeserialize, DataIdentity,
DataSerde, DataSerialize, DataType, FacetIncidenceAnalysis, FacetView,
OneSidedFacetsIter, QueryError, RidgeCandidate, RidgeCandidateError, RidgeHandle,
RidgeLinkView, RidgeQuery, RidgeView, Simplex, SimplexBarycenterError,
SimplexDataFillError, SimplexFacetsIter, Vertex,
};
pub use crate::geometry::{insphere, insphere_distance, insphere_lifted};
pub use crate::assert_jaccard_gte;
pub use crate::geometry::algorithms::convex_hull::{
ConvexHull, ConvexHullConstructionError, ConvexHullValidationError,
};
pub use crate::query::{
JaccardComputationError, extract_edge_set, extract_facet_identifier_set,
extract_hull_facet_set, extract_vertex_coordinate_set, format_jaccard_report,
jaccard_distance, jaccard_index,
};
pub use crate::query::measure_with_result;
}
pub mod generators {
pub use crate::TopologyGuarantee;
pub use crate::construction::InsertionOrderStrategy;
pub use crate::geometry::coordinate_range::{
CoordinateRange, CoordinateRangeBound, CoordinateRangeError, CoordinateRangeOrdering,
InvalidCoordinateValue,
};
pub use crate::geometry::util::{
InvalidPositiveScalar, RandomPointCount, RandomPointCountError,
RandomPointGenerationError, RandomTriangulationBuilder,
RandomTriangulationBuilderError, generate_grid_points,
generate_poisson_points_in_range, generate_random_points_in_ball,
generate_random_points_in_ball_seeded, generate_random_points_in_range,
generate_random_points_in_range_seeded, generate_random_points_periodic,
generate_random_triangulation_in_range,
generate_random_triangulation_in_range_with_topology_guarantee,
scaled_bounds_by_point_count, try_generate_poisson_points, try_generate_random_points,
try_generate_random_points_seeded, try_generate_random_triangulation,
try_generate_random_triangulation_with_topology_guarantee,
};
}
pub mod ordering {
pub use crate::core::util::{
HilbertBitDepth, HilbertError, HilbertQuantizedBatch, HilbertQuantizedVec,
MAX_HILBERT_BITS, hilbert_index_in_range, hilbert_indices_for_quantized_batch,
hilbert_indices_prequantized, hilbert_quantize_batch_in_range,
hilbert_quantize_in_range, hilbert_sort_by_stable_in_range,
hilbert_sort_by_unstable_in_range, hilbert_sorted_indices_in_range, try_hilbert_index,
try_hilbert_quantize, try_hilbert_sort_by_stable, try_hilbert_sort_by_unstable,
try_hilbert_sorted_indices,
};
}
pub mod topology {
pub mod validation {
pub use crate::topology::TopologyGuarantee;
pub use crate::topology::characteristics::{euler, validation};
pub use crate::topology::characteristics::{euler::*, validation::*};
pub use crate::topology::manifold::{
BoundaryFacetClassification, ManifoldError, classify_boundary_facet,
validate_closed_boundary, validate_ridge_links, validate_ridge_links_for_simplices,
validate_vertex_links,
};
pub use crate::topology::ridge::{
RidgeCandidate, RidgeCandidateError, RidgeLinkView, RidgeQuery, RidgeView,
ridge_star_simplices,
};
pub use crate::topology::traits::{
GlobalTopology, GlobalTopologyModelError, TopologicalSpace, TopologyError,
TopologyKind, ToroidalConstructionMode,
};
}
pub mod spaces {
pub use crate::topology::spaces::*;
pub use crate::topology::traits::{
GlobalTopology, GlobalTopologyModelError, TopologicalSpace, TopologyError,
TopologyKind, ToroidalConstructionMode, ToroidalDomain, ToroidalDomainError,
};
}
}
}
#[must_use]
pub const fn is_normal<T: Send + Sync + Unpin>() -> bool {
true
}
#[cfg(test)]
mod tests {
use crate::geometry::matrix::LaError;
use crate::{
DelaunayTriangulation,
core::{
adjacency::TriangulationAdjacency, edge::EdgeKey, simplex::Simplex, tds::Tds,
triangulation::Triangulation, vertex::Vertex,
},
geometry::{
Point, algorithms::convex_hull::ConvexHull, kernel::FastKernel, util::CircumcenterError,
},
is_normal,
prelude::delaunayize::{
DelaunayTriangulationConstructionError, DelaunayizeConfig, DelaunayizeError,
DelaunayizeOutcome, PlManifoldRepairError, PlManifoldRepairStage,
PlManifoldRepairStats, SimplexDataRestoreError, SimplexValidationError,
},
prelude::repair::{
DelaunayCheckPolicy, DelaunayRepairError, DelaunayRepairOutcome, DelaunayRepairPolicy,
DelaunayRepairStats, DelaunayTriangulation as RepairDelaunayTriangulation,
FlipContextError, FlipError, RepairQueueOrder, TopologyGuarantee,
},
prelude::*,
vertex,
};
use std::assert_matches;
#[cfg(feature = "count-allocations")]
use allocation_counter::measure;
#[test]
fn normal_types() {
assert!(is_normal::<Point<3>>());
assert!(is_normal::<Vertex<(), 3>>());
assert!(is_normal::<Simplex<(), 4>>());
assert!(is_normal::<Tds<(), (), 4>>());
assert!(is_normal::<Triangulation<FastKernel<f64>, (), (), 3>>());
assert!(is_normal::<DelaunayTriangulation<FastKernel<f64>, (), (), 3>>());
assert!(is_normal::<ConvexHull<(), (), 3>>());
assert!(is_normal::<EdgeKey>());
assert!(is_normal::<TriangulationAdjacency<'static>>());
assert!(is_normal::<DelaunayizeConfig>());
assert!(is_normal::<DelaunayizeOutcome<(), (), 3>>());
assert!(is_normal::<DelaunayizeError>());
assert!(is_normal::<DelaunayRepairError>());
assert!(is_normal::<DelaunayRepairStats>());
assert!(is_normal::<PlManifoldRepairError>());
assert!(is_normal::<PlManifoldRepairStage>());
assert!(is_normal::<PlManifoldRepairStats<(), (), 3>>());
assert!(is_normal::<SimplexDataRestoreError>());
assert!(is_normal::<SimplexValidationError>());
assert!(is_normal::<DelaunayError>());
assert!(is_normal::<DelaunayTriangulationConstructionError>());
}
#[test]
fn circumcenter_error_clones_linear_algebra_source() {
let source = LaError::non_finite_input_matrix(1, 2);
let error = CircumcenterError::LinearAlgebraFailure { source };
assert_eq!(error.clone(), error);
assert!(error.to_string().contains("Linear algebra"));
}
#[test]
fn la_errors_map_to_public_circumcenter_errors() {
let unsupported = CircumcenterError::from(LaError::unsupported_dimension(9, 7));
assert_eq!(
unsupported,
CircumcenterError::UnsupportedMatrixDimension {
requested: 9,
max: 7,
}
);
let index_error = CircumcenterError::from(LaError::index_out_of_bounds(3, 4, 2));
assert_eq!(
index_error,
CircumcenterError::MatrixError {
source: MatrixError::OutOfBounds {
row: 3,
column: 4,
dimension: 2,
},
}
);
}
#[test]
fn prelude_collections_exports() {
let mut map: FastHashMap<u64, usize> = FastHashMap::default();
map.insert(123, 456);
assert_eq!(map.get(&123), Some(&456));
let mut set: FastHashSet<u64> = FastHashSet::default();
set.insert(789);
assert!(set.contains(&789));
let mut buffer: SmallBuffer<i32, 8> = SmallBuffer::new();
buffer.push(42);
assert_eq!(buffer.len(), 1);
let map_with_cap = fast_hash_map_with_capacity::<u64, usize>(100);
assert!(map_with_cap.capacity() >= 100);
let set_with_cap = fast_hash_set_with_capacity::<u64>(50);
assert!(set_with_cap.capacity() >= 50);
let _neighbors: SimplexNeighborsMap = SimplexNeighborsMap::default();
let _vertex_simplices: VertexToSimplicesMap = VertexToSimplicesMap::default();
}
#[test]
fn prelude_repair_exports() {
let vertices = vec![
vertex![0.0, 0.0].unwrap(),
vertex![1.0, 0.0].unwrap(),
vertex![0.0, 1.0].unwrap(),
];
let dt: RepairDelaunayTriangulation<_, (), (), 2> =
RepairDelaunayTriangulation::builder(&vertices)
.build()
.unwrap();
assert!(dt.verify_via_flip_predicates().is_ok());
assert!(dt.is_valid_delaunay().is_ok());
let stats = DelaunayRepairStats::default();
let outcome = DelaunayRepairOutcome {
stats: stats.clone(),
heuristic: None,
};
assert_eq!(outcome.stats.flips_performed, stats.flips_performed);
let order = RepairQueueOrder::Fifo;
assert_matches!(order, RepairQueueOrder::Fifo);
assert_eq!(
DelaunayRepairPolicy::default(),
DelaunayRepairPolicy::EveryInsertion
);
assert_eq!(DelaunayCheckPolicy::default(), DelaunayCheckPolicy::EndOnly);
let err = DelaunayRepairError::from(FlipError::DegenerateSimplex);
assert_matches!(err, DelaunayRepairError::Flip { .. });
let context_err = FlipContextError::ReplacementPeriodicOffsetCountMismatch {
simplex_count: 1,
offset_count: 0,
};
assert_matches!(
context_err,
FlipContextError::ReplacementPeriodicOffsetCountMismatch { .. }
);
let topo = TopologyGuarantee::PLManifold;
assert_matches!(topo, TopologyGuarantee::PLManifold);
}
#[test]
fn prelude_quality_exports() {
let vertices = vec![
vertex![0.0, 0.0].unwrap(),
vertex![1.0, 0.0].unwrap(),
vertex![0.0, 1.0].unwrap(),
];
let dt: DelaunayTriangulation<_, (), (), 2> =
DelaunayTriangulation::builder(&vertices).build().unwrap();
let (simplex_key, _) = dt.simplices().next().unwrap();
let ratio = radius_ratio(dt.as_triangulation(), simplex_key).unwrap();
assert!(ratio > 0.0);
let norm_vol = normalized_volume(dt.as_triangulation(), simplex_key).unwrap();
assert!(norm_vol > 0.0);
}
#[test]
fn test_prelude_kernel_exports() {
let fast_kernel = FastKernel::<f64>::new();
let robust_kernel = RobustKernel::<f64>::new();
let triangle = [
Point::try_new([0.0, 0.0]).expect("finite point coordinates"),
Point::try_new([1.0, 0.0]).expect("finite point coordinates"),
Point::try_new([0.0, 1.0]).expect("finite point coordinates"),
];
let fast_orientation = fast_kernel.orientation(&triangle).unwrap();
assert_ne!(fast_orientation, 0, "Triangle should be non-degenerate");
let robust_orientation = robust_kernel.orientation(&triangle).unwrap();
assert_eq!(
fast_orientation, robust_orientation,
"Both kernels should agree"
);
let collinear = [
Point::try_new([0.0, 0.0]).expect("finite point coordinates"),
Point::try_new([1.0, 0.0]).expect("finite point coordinates"),
Point::try_new([2.0, 0.0]).expect("finite point coordinates"),
];
assert_eq!(
fast_kernel.orientation(&collinear).unwrap(),
0,
"Collinear points should have zero orientation"
);
let inside_point = Point::try_new([0.25, 0.25]).expect("finite point coordinates");
let result = fast_kernel.in_sphere(&triangle, &inside_point).unwrap();
assert_eq!(result, 1, "Point should be inside circumcircle");
let outside_point = Point::try_new([2.0, 2.0]).expect("finite point coordinates");
let result = fast_kernel.in_sphere(&triangle, &outside_point).unwrap();
assert_eq!(result, -1, "Point should be outside circumcircle");
}
#[test]
fn test_prelude_core_types() {
let p1 = Point::try_new([0.0, 0.0, 0.0]).expect("finite point coordinates");
let p2 = Point::try_new([1.0, 0.0, 0.0]).expect("finite point coordinates");
assert_ne!(p1, p2);
let v1: Vertex<(), 3> = vertex!([0.0, 0.0, 0.0]).unwrap();
let v2: Vertex<(), 3> = vertex!([1.0, 0.0, 0.0]).unwrap();
assert_ne!(v1.point(), v2.point());
let vertices = vec![
vertex![0.0, 0.0, 0.0].unwrap(),
vertex![1.0, 0.0, 0.0].unwrap(),
vertex![0.0, 1.0, 0.0].unwrap(),
vertex![0.0, 0.0, 1.0].unwrap(),
];
let dt: DelaunayTriangulation<_, (), (), 3> =
DelaunayTriangulation::builder(&vertices).build().unwrap();
assert_eq!(dt.number_of_vertices(), 4);
assert_eq!(dt.number_of_simplices(), 1);
let tri = dt.as_triangulation();
assert_eq!(tri.number_of_vertices(), 4);
assert_eq!(tri.number_of_simplices(), 1);
for (simplex_key, _simplex) in tri.simplices() {
assert!(tri.simplex(simplex_key).is_some());
}
}
#[test]
fn test_prelude_point_location() {
let vertices = vec![
vertex![0.0, 0.0].unwrap(),
vertex![1.0, 0.0].unwrap(),
vertex![0.0, 1.0].unwrap(),
];
let dt: DelaunayTriangulation<_, (), (), 2> =
DelaunayTriangulation::builder(&vertices).build().unwrap();
let query_point = Point::try_new([0.3, 0.3]).expect("finite point coordinates");
let result = dt.locate(&query_point, None);
assert!(result.is_ok());
match result.unwrap() {
LocateResult::InsideSimplex(_)
| LocateResult::OnFacet { .. }
| LocateResult::OnEdge { .. }
| LocateResult::OnVertex(_) => { }
LocateResult::Outside => panic!("Point should be inside triangulation"),
}
let outside_point = Point::try_new([10.0, 10.0]).expect("finite point coordinates");
let result = dt.locate(&outside_point, None);
assert!(result.is_ok());
}
#[test]
fn test_prelude_geometry_types() {
let p = Point::try_new([1.0_f64, 2.0_f64, 3.0_f64]).expect("finite point coordinates");
assert!((p.coords()[0] - 1.0_f64).abs() < f64::EPSILON);
assert!((p.coords()[1] - 2.0_f64).abs() < f64::EPSILON);
assert!((p.coords()[2] - 3.0_f64).abs() < f64::EPSILON);
let triangle = [
Point::try_new([0.0, 0.0]).expect("finite point coordinates"),
Point::try_new([1.0, 0.0]).expect("finite point coordinates"),
Point::try_new([0.0, 1.0]).expect("finite point coordinates"),
];
let orientation = simplex_orientation(&triangle).unwrap();
assert_ne!(orientation, Orientation::DEGENERATE);
let test_point = Point::try_new([0.25, 0.25]).expect("finite point coordinates");
let result = insphere(&triangle, test_point).unwrap();
assert_eq!(result, InSphere::INSIDE);
}
#[test]
fn test_prelude_convex_hull() {
let vertices = vec![
vertex![0.0, 0.0, 0.0].unwrap(),
vertex![1.0, 0.0, 0.0].unwrap(),
vertex![0.0, 1.0, 0.0].unwrap(),
vertex![0.0, 0.0, 1.0].unwrap(),
];
let dt: DelaunayTriangulation<_, (), (), 3> =
DelaunayTriangulation::builder(&vertices).build().unwrap();
let hull = ConvexHull::try_from_triangulation(dt.as_triangulation()).unwrap();
assert_eq!(hull.number_of_facets(), 4);
let outside_point = Point::try_new([2.0, 2.0, 2.0]).expect("finite point coordinates");
let is_outside = hull
.is_point_outside(&outside_point, dt.as_triangulation())
.unwrap();
assert!(is_outside);
let inside_point = Point::try_new([0.25, 0.25, 0.25]).expect("finite point coordinates");
let is_outside = hull
.is_point_outside(&inside_point, dt.as_triangulation())
.unwrap();
assert!(!is_outside);
}
#[cfg(feature = "count-allocations")]
#[test]
fn basic_alloc_counting() {
let result = measure(|| {
let x = 1 + 1;
assert_eq!(x, 2);
});
assert_eq!(
result.count_total, 0,
"Expected zero total allocations for trivial operation, found: {}",
result.count_total
);
assert_eq!(
result.bytes_total, 0,
"Expected zero total bytes allocated for trivial operation, found: {}",
result.bytes_total
);
assert_eq!(
result.count_current, 0,
"Expected zero current allocations after trivial operation, found: {}",
result.count_current
);
assert_eq!(
result.bytes_current, 0,
"Expected zero current bytes allocated after trivial operation, found: {}",
result.bytes_current
);
}
#[cfg(feature = "count-allocations")]
#[test]
fn alloc_counting_with_vec() {
let result = measure(|| {
let _vec: Vec<i32> = vec![1, 2, 3, 4, 5];
});
assert!(
result.count_total > 0,
"Expected some allocations for Vec creation, found: {}",
result.count_total
);
assert!(
result.bytes_total > 0,
"Expected some bytes allocated for Vec creation, found: {}",
result.bytes_total
);
assert_eq!(
result.count_current, 0,
"Expected zero current allocations after Vec drop, found: {}",
result.count_current
);
assert_eq!(
result.bytes_current, 0,
"Expected zero current bytes after Vec drop, found: {}",
result.bytes_current
);
assert!(
result.count_max >= result.count_total,
"Max count should be >= total count"
);
assert!(
result.bytes_max >= result.bytes_total,
"Max bytes should be >= total bytes"
);
}
}