Ejemplo n.º 1
0
double SQFitting::qualityOfFit(pcl::PointCloud<pcl::PointXYZ>& cloud, SQParameters& sqParams) {
	pcl::PointXYZ _pnt;

	Eigen::MatrixXd m(3, 3), _m(3, 3);

	m(0, 0) = cos(sqParams.phi) * cos(sqParams.theta) * cos(sqParams.psi) - sin(sqParams.phi) * sin(sqParams.psi);
	m(0, 1) = -cos(sqParams.phi) * cos(sqParams.theta) * sin(sqParams.psi) - sin(sqParams.phi) * cos(sqParams.psi);
	m(0, 2) = cos(sqParams.phi) * sin(sqParams.theta);
	m(1, 0) = sin(sqParams.phi) * cos(sqParams.theta) * cos(sqParams.psi) + cos(sqParams.phi) * sin(sqParams.psi);
	m(1, 1) = -sin(sqParams.phi) * cos(sqParams.theta) * sin(sqParams.psi) + cos(sqParams.phi) * cos(sqParams.psi);
	m(1, 2) = sin(sqParams.phi) * sin(sqParams.theta);
	m(2, 0) = -sin(sqParams.theta) * cos(sqParams.psi);
	m(2, 1) = sin(sqParams.theta) * sin(sqParams.psi);
	m(2, 2) = cos(sqParams.theta);

	_m = m.inverse();

	double f, a, b, c, d, e, error = 0;

	for (int i = 0; i < (int) cloud.points.size(); i++) {
		Eigen::MatrixXd pntMove(3, 1);
		Eigen::MatrixXd pnt(3, 1);
		Eigen::MatrixXd _pnt(3, 1);

		pntMove(0, 0) = (double) cloud.points[i].x - sqParams.px; 
		pntMove(1, 0) = (double) cloud.points[i].y - sqParams.py; 
		pntMove(2, 0) = (double) cloud.points[i].z - sqParams.pz;

		_pnt = _m * pntMove;

		_pnt(0, 0) = _pnt(0, 0) / (sqParams.kx * _pnt(2, 0) / sqParams.a3 + 1);
		_pnt(1, 0) = _pnt(1, 0) / (sqParams.ky * _pnt(2, 0) / sqParams.a3 + 1);

		a = pow(fabs(_pnt(0, 0) / sqParams.a1), 2.0 / sqParams.e2);
		b = pow(fabs(_pnt(1, 0) / sqParams.a2), 2.0 / sqParams.e2);
		c = pow(fabs(_pnt(2, 0) / sqParams.a3), 2.0 / sqParams.e1);
		d = pow(a + b, (double) (sqParams.e2 / sqParams.e1));
		e = d + c;
		f = pow(e, (double) (sqParams.e1));

		double tempError = pow((f - 1), 2.0);
		error += exp(-tempError * 10000);

	}

	error = sqrt(error);

	return (error);
}
void frgExtractTopologicalEntsFromLinesAlgm::_addto_rtree(Vertex2dsOnSegment2d &stru)
{
	const AcGeLineSeg2d &seg = stru.seg;
	std::map<double, rlVertex2d *, rl_double_sort1> &vertices = stru.vertex2ds;
	std::map<double, rlVertex2d *, rl_double_sort1>::iterator it = vertices.begin();

	AcGePoint2d base = seg.startPoint();
	AcGeVector2d dir = seg.direction();
	for (; it != vertices.end(); ++it)
	{
		AcGePoint2d pnt = base;
		pnt.transformBy(dir * it->first);

		Point_2d _pnt(pnt.x, pnt.y);
		rlId id = 0;
		if (_is_in_rtree(id, _pnt))
		{
			it->second = _topologies->get<rlVertex2d *>(id);
			assert(it->second);
		}
		else
		{
			rlVertex2d *_v = _topologies->_new<rlVertex2d>();
			_v->set_x(_pnt.get<0>());
			_v->set_y(_pnt.get<1>());

			Point2d_Id _pair(_pnt, _v->id());
			_rtree.insert(_pair);

			it->second = _v;
		}
	}
}