You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							126 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							126 lines
						
					
					
						
							3.9 KiB
						
					
					
				| // David Eberly, Geometric Tools, Redmond WA 98052 | |
| // Copyright (c) 1998-2021 | |
| // Distributed under the Boost Software License, Version 1.0. | |
| // https://www.boost.org/LICENSE_1_0.txt | |
| // https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt | |
| // Version: 4.0.2019.08.13 | |
|  | |
| #pragma once | |
|  | |
| #include <Mathematics/Delaunay3.h> | |
|  | |
| namespace gte | |
| { | |
|     template <typename InputType, typename ComputeType, typename RationalType> | |
|     class Delaunay3Mesh | |
|     { | |
|     public: | |
|         // Construction. | |
|         Delaunay3Mesh(Delaunay3<InputType, ComputeType> const& delaunay) | |
|             : | |
|             mDelaunay(&delaunay) | |
|         { | |
|         } | |
| 
 | |
|         // Mesh information. | |
|         inline int GetNumVertices() const | |
|         { | |
|             return mDelaunay->GetNumVertices(); | |
|         } | |
| 
 | |
|         inline int GetNumTetrahedra() const | |
|         { | |
|             return mDelaunay->GetNumTetrahedra(); | |
|         } | |
| 
 | |
|         inline Vector3<InputType> const* GetVertices() const | |
|         { | |
|             return mDelaunay->GetVertices(); | |
|         } | |
| 
 | |
|         inline int const* GetIndices() const | |
|         { | |
|             return &mDelaunay->GetIndices()[0]; | |
|         } | |
| 
 | |
|         inline int const* GetAdjacencies() const | |
|         { | |
|             return &mDelaunay->GetAdjacencies()[0]; | |
|         } | |
| 
 | |
|         // Containment queries. | |
|  | |
|         int GetContainingTetrahedron(Vector3<InputType> const& P) const | |
|         { | |
|             typename Delaunay3<InputType, ComputeType>::SearchInfo info; | |
|             return mDelaunay->GetContainingTetrahedron(P, info); | |
|         } | |
| 
 | |
|         bool GetVertices(int t, std::array<Vector3<InputType>, 4>& vertices) const | |
|         { | |
|             if (mDelaunay->GetDimension() == 3) | |
|             { | |
|                 std::array<int, 4> indices; | |
|                 if (mDelaunay->GetIndices(t, indices)) | |
|                 { | |
|                     PrimalQuery3<ComputeType> const& query = mDelaunay->GetQuery(); | |
|                     Vector3<ComputeType> const* ctVertices = query.GetVertices(); | |
|                     for (int i = 0; i < 4; ++i) | |
|                     { | |
|                         Vector3<ComputeType> const& V = ctVertices[indices[i]]; | |
|                         for (int j = 0; j < 3; ++j) | |
|                         { | |
|                             vertices[i][j] = (InputType)V[j]; | |
|                         } | |
|                     } | |
|                     return true; | |
|                 } | |
|             } | |
|             return false; | |
|         } | |
| 
 | |
|         bool GetIndices(int t, std::array<int, 4>& indices) const | |
|         { | |
|             return mDelaunay->GetIndices(t, indices); | |
|         } | |
| 
 | |
|         bool GetAdjacencies(int t, std::array<int, 4>& adjacencies) const | |
|         { | |
|             return mDelaunay->GetAdjacencies(t, adjacencies); | |
|         } | |
| 
 | |
|         bool GetBarycentrics(int t, Vector3<InputType> const& P, std::array<InputType, 4>& bary) const | |
|         { | |
|             std::array<int, 4> indices; | |
|             if (mDelaunay->GetIndices(t, indices)) | |
|             { | |
|                 PrimalQuery3<ComputeType> const& query = mDelaunay->GetQuery(); | |
|                 Vector3<ComputeType> const* vertices = query.GetVertices(); | |
|                 Vector3<RationalType> rtP{ P[0], P[1], P[2] }; | |
|                 std::array<Vector3<RationalType>, 4> rtV; | |
|                 for (int i = 0; i < 4; ++i) | |
|                 { | |
|                     Vector3<ComputeType> const& V = vertices[indices[i]]; | |
|                     for (int j = 0; j < 3; ++j) | |
|                     { | |
|                         rtV[i][j] = (RationalType)V[j]; | |
|                     } | |
|                 }; | |
| 
 | |
|                 RationalType rtBary[4]; | |
|                 if (ComputeBarycentrics(rtP, rtV[0], rtV[1], rtV[2], rtV[3], rtBary)) | |
|                 { | |
|                     for (int i = 0; i < 4; ++i) | |
|                     { | |
|                         bary[i] = (InputType)rtBary[i]; | |
|                     } | |
|                     return true; | |
|                 } | |
|             } | |
|             return false; | |
|         } | |
| 
 | |
|     private: | |
|         Delaunay3<InputType, ComputeType> const* mDelaunay; | |
|     }; | |
| }
 | |
| 
 |