| |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "Wm4FoundationPCH.h" |
| #include "Wm4ConvexHull1.h" |
|
|
| namespace Wm4 |
| { |
| |
| template <class Real> |
| ConvexHull1<Real>::ConvexHull1 (int iVertexQuantity, Real* afVertex, |
| Real fEpsilon, bool bOwner, Query::Type eQueryType) |
| : |
| ConvexHull<Real>(iVertexQuantity,fEpsilon,bOwner,eQueryType) |
| { |
| assert(afVertex); |
| m_afVertex = afVertex; |
|
|
| std::vector<SortedVertex> kArray(m_iVertexQuantity); |
| int i; |
| for (i = 0; i < m_iVertexQuantity; i++) |
| { |
| kArray[i].Value = m_afVertex[i]; |
| kArray[i].Index = i; |
| } |
| std::sort(kArray.begin(),kArray.end()); |
|
|
| Real fRange = kArray[m_iVertexQuantity-1].Value - kArray[0].Value; |
| if (fRange >= m_fEpsilon) |
| { |
| m_iDimension = 1; |
| m_iSimplexQuantity = 2; |
| m_aiIndex = WM4_NEW int[2]; |
| m_aiIndex[0] = kArray[0].Index; |
| m_aiIndex[1] = kArray[m_iVertexQuantity-1].Index; |
| } |
| } |
| |
| template <class Real> |
| ConvexHull1<Real>::~ConvexHull1 () |
| { |
| if (m_bOwner) |
| { |
| WM4_DELETE[] m_afVertex; |
| } |
| } |
| |
| template <class Real> |
| const Real* ConvexHull1<Real>::GetVertices () const |
| { |
| return m_afVertex; |
| } |
| |
| template <class Real> |
| ConvexHull1<Real>::ConvexHull1 (const char* acFilename) |
| : |
| ConvexHull<Real>(0,(Real)0.0,false,Query::QT_REAL) |
| { |
| m_afVertex = nullptr; |
| bool bLoaded = Load(acFilename); |
| assert(bLoaded); |
| (void)bLoaded; |
| } |
| |
| template <class Real> |
| bool ConvexHull1<Real>::Load (const char* acFilename) |
| { |
| FILE* pkIFile = System::Fopen(acFilename,"rb"); |
| if (!pkIFile) |
| { |
| return false; |
| } |
|
|
| ConvexHull<Real>::Load(pkIFile); |
|
|
| if (m_bOwner) |
| { |
| WM4_DELETE[] m_afVertex; |
| } |
|
|
| m_bOwner = true; |
| m_afVertex = WM4_NEW Real[m_iVertexQuantity]; |
|
|
| size_t uiSize = sizeof(Real); |
| if (uiSize == 4) |
| { |
| System::Read4le(pkIFile,m_iVertexQuantity,m_afVertex); |
| } |
| else |
| { |
| System::Read8le(pkIFile,m_iVertexQuantity,m_afVertex); |
| } |
|
|
| System::Fclose(pkIFile); |
| return true; |
| } |
| |
| template <class Real> |
| bool ConvexHull1<Real>::Save (const char* acFilename) const |
| { |
| FILE* pkOFile = System::Fopen(acFilename,"wb"); |
| if (!pkOFile) |
| { |
| return false; |
| } |
|
|
| ConvexHull<Real>::Save(pkOFile); |
|
|
| size_t uiSize = sizeof(Real); |
| if (uiSize == 4) |
| { |
| System::Write4le(pkOFile,m_iVertexQuantity,m_afVertex); |
| } |
| else |
| { |
| System::Write8le(pkOFile,m_iVertexQuantity,m_afVertex); |
| } |
|
|
| System::Fclose(pkOFile); |
| return true; |
| } |
| |
|
|
| |
| |
| |
| template WM4_FOUNDATION_ITEM |
| class ConvexHull1<float>; |
|
|
| template WM4_FOUNDATION_ITEM |
| class ConvexHull1<double>; |
| |
| } |
|
|