// 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 "Wm4ApprGaussPointsFit3.h" #include "Wm4Eigen.h" namespace Wm4 { //---------------------------------------------------------------------------- template Box3 GaussPointsFit3 (int iQuantity, const Vector3* akPoint) { Box3 kBox(Vector3::ZERO,Vector3::UNIT_X, Vector3::UNIT_Y,Vector3::UNIT_Z,(Real)1.0,(Real)1.0, (Real)1.0); // compute the mean of the points kBox.Center = akPoint[0]; int i; for (i = 1; i < iQuantity; i++) { kBox.Center += akPoint[i]; } Real fInvQuantity = ((Real)1.0)/iQuantity; kBox.Center *= fInvQuantity; // compute the covariance matrix of the points Real fSumXX = (Real)0.0, fSumXY = (Real)0.0, fSumXZ = (Real)0.0; Real fSumYY = (Real)0.0, fSumYZ = (Real)0.0, fSumZZ = (Real)0.0; for (i = 0; i < iQuantity; i++) { Vector3 kDiff = akPoint[i] - kBox.Center; fSumXX += kDiff.X()*kDiff.X(); fSumXY += kDiff.X()*kDiff.Y(); fSumXZ += kDiff.X()*kDiff.Z(); fSumYY += kDiff.Y()*kDiff.Y(); fSumYZ += kDiff.Y()*kDiff.Z(); fSumZZ += kDiff.Z()*kDiff.Z(); } fSumXX *= fInvQuantity; fSumXY *= fInvQuantity; fSumXZ *= fInvQuantity; fSumYY *= fInvQuantity; fSumYZ *= fInvQuantity; fSumZZ *= fInvQuantity; // setup the eigensolver Eigen kES(3); kES(0,0) = fSumXX; kES(0,1) = fSumXY; kES(0,2) = fSumXZ; kES(1,0) = fSumXY; kES(1,1) = fSumYY; kES(1,2) = fSumYZ; kES(2,0) = fSumXZ; kES(2,1) = fSumYZ; kES(2,2) = fSumZZ; kES.IncrSortEigenStuff3(); for (i = 0; i < 3; i++) { kBox.Extent[i] = kES.GetEigenvalue(i); kES.GetEigenvector(i,kBox.Axis[i]); } return kBox; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // explicit instantiation //---------------------------------------------------------------------------- template WM4_FOUNDATION_ITEM Box3 GaussPointsFit3 (int, const Vector3*); template WM4_FOUNDATION_ITEM Box3 GaussPointsFit3 (int, const Vector3*); //---------------------------------------------------------------------------- }