// 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 "Wm4ApprGaussPointsFit2.h" #include "Wm4Eigen.h" namespace Wm4 { //---------------------------------------------------------------------------- template Box2 GaussPointsFit2 (int iQuantity, const Vector2* akPoint) { Box2 kBox(Vector2::ZERO,Vector2::UNIT_X, Vector2::UNIT_Y,(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, fSumYY = (Real)0.0; for (i = 0; i < iQuantity; i++) { Vector2 kDiff = akPoint[i] - kBox.Center; fSumXX += kDiff.X()*kDiff.X(); fSumXY += kDiff.X()*kDiff.Y(); fSumYY += kDiff.Y()*kDiff.Y(); } fSumXX *= fInvQuantity; fSumXY *= fInvQuantity; fSumYY *= fInvQuantity; // setup the eigensolver Eigen kES(2); kES(0,0) = fSumXX; kES(0,1) = fSumXY; kES(1,0) = fSumXY; kES(1,1) = fSumYY; kES.IncrSortEigenStuff2(); for (i = 0; i < 2; i++) { kBox.Extent[i] = kES.GetEigenvalue(i); kES.GetEigenvector(i,kBox.Axis[i]); } return kBox; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // explicit instantiation //---------------------------------------------------------------------------- template WM4_FOUNDATION_ITEM Box2 GaussPointsFit2 (int, const Vector2*); template WM4_FOUNDATION_ITEM Box2 GaussPointsFit2 (int, const Vector2*); //---------------------------------------------------------------------------- }