diff --git a/Geo/SOrientedBoundingBox.cpp b/Geo/SOrientedBoundingBox.cpp index f419aba855cd54adb4e0c2d2f53bda9bad75c989..0538ef1861073616808c355c40601386b54a5886 100644 --- a/Geo/SOrientedBoundingBox.cpp +++ b/Geo/SOrientedBoundingBox.cpp @@ -231,10 +231,16 @@ SOrientedBoundingBox* SOrientedBoundingBox::buildOBB(std::vector<SPoint3> vertic // Compute the empirical means fullVector<double> mean(3); + fullVector<double> vmins(3); + fullVector<double> vmaxs(3); for (int i = 0; i < 3; i++) { mean(i) = 0; + vmins(i) = DBL_MAX; + vmaxs(i) = -DBL_MAX; for (int j = 0; j < num_vertices; j++) { mean(i) += data(i,j); + vmaxs(i) =std::max(vmaxs(i),data(i,j)); + vmins(i) = std::min(vmins(i),data(i,j)); } mean(i) /= (double)num_vertices; } @@ -293,12 +299,27 @@ SOrientedBoundingBox* SOrientedBoundingBox::buildOBB(std::vector<SPoint3> vertic sizes[i] = maxs(i) - mins(i); //means[i] = (maxs(i) - mins(i)) / 2.; } - /* - Msg::Debug("Sizes : %f %f %f",sizes[0],sizes[1], sizes[2]); - Msg::Debug("Eig Axis 1 : %f %f %f",left_eigv(0,0),left_eigv(1,0), left_eigv(2,0)); - Msg::Debug("Eig Axis 2 : %f %f %f",left_eigv(0,1),left_eigv(1,1), left_eigv(2,1)); - Msg::Debug("Eig Axis 3 : %f %f %f",left_eigv(0,2),left_eigv(1,2), left_eigv(2,2)); - */ + + if (sizes[0] == 0 && sizes[1] == 0) { + // Entity is a straight line... + SVector3 center; + SVector3 Axis1; + SVector3 Axis2; + SVector3 Axis3; + + Axis1[0] = left_eigv(0,0); Axis1[1] = left_eigv(1,0); Axis1[2] = left_eigv(2,0); + Axis2[0] = left_eigv(0,1); Axis2[1] = left_eigv(1,1); Axis2[2] = left_eigv(2,1); + Axis3[0] = left_eigv(0,2); Axis3[1] = left_eigv(1,2); Axis3[2] = left_eigv(2,2); + + center[0] = (vmaxs(0)+vmins(0))/2.0; + center[1] = (vmaxs(1)+vmins(1))/2.0; + center[2] = (vmaxs(2)+vmins(2))/2.0; + + return(new SOrientedBoundingBox(center, sizes[0], sizes[1], sizes[2], + Axis1, Axis2, Axis3)); + } + + // We take the smallest component, then project the data on the plane defined by the other twos int smallest_comp = 0; @@ -336,7 +357,6 @@ SOrientedBoundingBox* SOrientedBoundingBox::buildOBB(std::vector<SPoint3> vertic record.points[i].where.h = points[i]->x()+(10e-6)*sizes[smallest_comp==0?1:0]*(-0.5+((double)rand())/RAND_MAX); record.points[i].where.v = points[i]->y()+(10e-6)*sizes[smallest_comp==2?1:0]*(-0.5+((double)rand())/RAND_MAX); record.points[i].adjacent = NULL; - //Msg::Info("Points for delaunay : %f %f",record.points[i].where.h,record.points[i].where.v); } record.MakeMeshWithPoints();