Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
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
}
Exemplo n.º 3
0
// 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; 
}