// SPDX-License-Identifier: BSL-1.0 // Geometric Tools, LLC // Copyright (c) 1998-2010 // Distributed under the Boost Software License, Version 1.0. // http://www.boost.org/LICENSE_1_0.txt // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt // // File Version: 4.10.0 (2009/11/18) #include "Wm4FoundationPCH.h" #include "Wm4ConvexHull1.h" namespace Wm4 { //---------------------------------------------------------------------------- template ConvexHull1::ConvexHull1 (int iVertexQuantity, Real* afVertex, Real fEpsilon, bool bOwner, Query::Type eQueryType) : ConvexHull(iVertexQuantity,fEpsilon,bOwner,eQueryType) { assert(afVertex); m_afVertex = afVertex; std::vector 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 ConvexHull1::~ConvexHull1 () { if (m_bOwner) { WM4_DELETE[] m_afVertex; } } //---------------------------------------------------------------------------- template const Real* ConvexHull1::GetVertices () const { return m_afVertex; } //---------------------------------------------------------------------------- template ConvexHull1::ConvexHull1 (const char* acFilename) : ConvexHull(0,(Real)0.0,false,Query::QT_REAL) { m_afVertex = nullptr; bool bLoaded = Load(acFilename); assert(bLoaded); (void)bLoaded; // avoid warning in Release build } //---------------------------------------------------------------------------- template bool ConvexHull1::Load (const char* acFilename) { FILE* pkIFile = System::Fopen(acFilename,"rb"); if (!pkIFile) { return false; } ConvexHull::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 // uiSize == 8 { System::Read8le(pkIFile,m_iVertexQuantity,m_afVertex); } System::Fclose(pkIFile); return true; } //---------------------------------------------------------------------------- template bool ConvexHull1::Save (const char* acFilename) const { FILE* pkOFile = System::Fopen(acFilename,"wb"); if (!pkOFile) { return false; } ConvexHull::Save(pkOFile); size_t uiSize = sizeof(Real); if (uiSize == 4) { System::Write4le(pkOFile,m_iVertexQuantity,m_afVertex); } else // uiSize == 8 { System::Write8le(pkOFile,m_iVertexQuantity,m_afVertex); } System::Fclose(pkOFile); return true; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // explicit instantiation //---------------------------------------------------------------------------- template WM4_FOUNDATION_ITEM class ConvexHull1; template WM4_FOUNDATION_ITEM class ConvexHull1; //---------------------------------------------------------------------------- }