Rational operator- (const Rational& a, const Rational& b) { int gcd = GCD(a.denom, b.denom); int newNumer = a.numer*(b.denom / gcd) - b.numer*(a.denom / gcd); int newDenom = a.denom*(b.denom / gcd); signCheck(newNumer, newDenom); return Rational(newNumer, newDenom, true);//Boolean is extra flag to prevent reduction by GCD again }
Rational operator/ (const Rational& a, const Rational& b) { int c = GCD(a.numer, b.numer); int d = GCD(b.denom, a.denom); int newNumer = (a.numer / c)*(b.denom / d); int newDenom = (a.denom / d)*(b.numer / c); signCheck(newNumer, newDenom); return Rational(newNumer, newDenom, true);//Boolean is extra flag to prevent reduction by GCD again }
// Public Methods void // computes the normal to a set of points thanks to PCA method PCA::compute() { computeCentre(); Eigen::Matrix3d covar; computeCovar( covar ); // Compute Eigenvectors & Eigenvalues Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigensolver(covar); // Order the vectors by eigenvalues int order [3] = {0,1,2}; int temp = 0; for(size_t i = 0; i < 3; i++) { for (size_t j = i; j < 3; j++) { if( (eigensolver.eigenvalues())(i) > (eigensolver.eigenvalues())(j) ) { temp = order [j]; order [j] = order [i]; order [i] = temp; } } } normal = ( eigensolver.eigenvectors() ).col( order[0] ); vec_base1 = ( eigensolver.eigenvectors() ).col( order[1] ) ; signCheck(); vec_base2 = normal.cross( vec_base1 ); if (normal.norm()!=normal.norm()){ std::cerr << "Error PCA::compute NaN Normal: " << std::endl; std::cerr << normal << std::endl; } if (normal.norm() == 0) std::cerr << "Error PCA::compute Null Normal" << std::endl; }