rnc: Added checking in contour building operation in order to avoid the formation of small loops

This commit is contained in:
gdd 2011-10-20 14:42:16 +00:00
parent a5b768e472
commit bb8729db00

View File

@ -74,6 +74,8 @@
#include <set>
#include <utility>
#include <boost/utility.hpp>
// Constructors
enum{
CONTOURS,
@ -167,6 +169,8 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom
myOutputGroup->RadioButton1->setText(tr( "GEOM_SPLINE"));
myOutputGroup->RadioButton3->hide();
myOutputGroup->hide(); //caché pour la demo
// NOTE what follows is mostly unuseful but is kept until end of development as code examples
myCoordGrp1 = new QGroupBox(tr("GEOM_SCALING"), centralWidget());
QGridLayout* myCoordGrpLayout = new QGridLayout(myCoordGrp1);
@ -702,11 +706,15 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
GEOM::ListOfGO_var geomContours = new GEOM::ListOfGO();
int contourCount = 0;
bool insert;
MESSAGE("hierarchy.size() =" << hierarchy.size())
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
contour = contours[idx];
std::vector< cv::Point >::iterator it;
std::vector< cv::Point >::iterator it_previous;
std::vector< cv::Point >::iterator it_next;
GEOM::GEOM_Object_var aGeomContourPnt;
GEOM::ListOfGO_var geomContourPnts = new GEOM::ListOfGO();
geomContourPnts->length( contour.size() );
@ -722,19 +730,49 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects )
// double z = aContourPnt.Z();
// When using the new way with textures on shapes we just have to do the following
int pnt_array[] = {it->x,it->y};
int pnt_array[] = {it->x,it->y};
std::vector<int> pnt (pnt_array, pnt_array + sizeof(pnt_array) / sizeof(int) );
pnt_it=existing_points.insert(pnt);
if (pnt_it.second == true) // To avoid double points in the contours
{
double x = -0.5 *width + it->x;
double y = 0.5 *height - it->y;
double z = 0;
aGeomContourPnt = aBasicOperations->MakePointXYZ( x,y,z );
geomContourPnts->length( j+1 );
geomContourPnts[j] = aGeomContourPnt;
j++;
insert = true;
if (it!=contour.begin()) // From the second point on perform some checking to avoid loops in the contours we build
{
it_previous = boost::prior(it);
it_next = boost::next(it);
double u_v_scalar_product = (it->x - it_previous->x) * (it_next->x - it->x) +
(it->y - it_previous->y) * (it_next->y - it->y);
if (u_v_scalar_product < 0)
{
double u_v_cross_product = (it->x - it_previous->x) * (it_next->y - it->y) -
(it->y - it_previous->y) * (it_next->x - it->x);
double norme_u = sqrt ( (it->x - it_previous->x)*(it->x - it_previous->x) +
(it->y - it_previous->y)*(it->y - it_previous->y) );
double norme_v = sqrt ( (it->x - it_next->x)*(it->x - it_next->x) +
(it->y - it_next->y)*(it->y - it_next->y) );
double u_v_sinus = u_v_cross_product / (norme_u * norme_v);
if (u_v_sinus < Precision::Confusion())
{
insert =false;
}
}
}
if (insert)
{
double x = -0.5 *width + it->x;
double y = 0.5 *height - it->y;
double z = 0;
aGeomContourPnt = aBasicOperations->MakePointXYZ( x,y,z );
geomContourPnts->length( j+1 );
geomContourPnts[j] = aGeomContourPnt;
j++;
}
}
}