@@ -255,21 +255,23 @@ namespace diffCheck::segmentation
255255 }
256256 for (auto segment : clusters)
257257 {
258- Eigen::Vector3d segmentCenter;
259- Eigen::Vector3d segmentNormal;
258+ Eigen::Vector3d segmentNormal = Eigen::Vector3d::Zero ();
260259
261260 if (segment->GetNumPoints () == 0 )
262261 {
263262 DIFFCHECK_WARN (" Empty segment. Skipping the segment." );
264263 continue ;
265264 }
266- segmentCenter = segment->GetAxixAlignedBoundingBox ()[0 ] + (segment->GetAxixAlignedBoundingBox ()[1 ] - segment->GetAxixAlignedBoundingBox ()[0 ])/2.0 ;
265+ Eigen::Vector3d segmentCenter = segment->GetAxixAlignedBoundingBox ()[0 ] + (segment->GetAxixAlignedBoundingBox ()[1 ] - segment->GetAxixAlignedBoundingBox ()[0 ])/2.0 ;
267266
268267 for (auto normal : segment->Normals ){segmentNormal += normal;}
268+ if (segmentNormal.norm () == 0 )
269+ {
270+ DIFFCHECK_WARN (" Segment normal is zero. Skipping the segment." );
271+ continue ;
272+ }
269273 segmentNormal.normalize ();
270- double currentDistance = (faceCenter - segmentCenter).norm ();
271274 double currentDitanceOrthogonalToFace = std::abs ((faceCenter - segmentCenter).dot (faceNormal));
272- double currentAngle = std::abs (sin (acos (faceNormal.dot (faceCenter - segmentCenter))));
273275 if (std::abs (sin (acos (faceNormal.dot (segmentNormal)))) < angleThreshold
274276 && currentDitanceOrthogonalToFace < maximumFaceSegmentDistance
275277 && currentDitanceOrthogonalToFace < faceDistance)
@@ -287,64 +289,47 @@ namespace diffCheck::segmentation
287289 }
288290 bool hasColors = correspondingSegment->GetNumColors () > 0 ;
289291
290- for (Eigen::Vector3d point : correspondingSegment->Points )
292+ std::vector<int > indicesToRemove;
293+ for (size_t i = 0 ; i < correspondingSegment->Points .size (); i++)
291294 {
295+ const Eigen::Vector3d& point = correspondingSegment->Points [i];
296+
292297 if (discriminatePoints)
293298 {
294- bool pointInFace = false ;
295299 if (face->IsPointOnFace (point, associationThreshold))
296300 {
297301 facePoints->Points .push_back (point);
298- facePoints->Normals .push_back (
299- correspondingSegment->Normals [std::distance (
300- correspondingSegment->Points .begin (),
301- std::find (correspondingSegment->Points .begin (),
302- correspondingSegment->Points .end (),
303- point))]
304- );
302+ facePoints->Normals .push_back (correspondingSegment->Normals [i]);
305303 if (hasColors)
306304 {
307- facePoints->Colors .push_back (
308- correspondingSegment->Colors [std::distance (
309- correspondingSegment->Points .begin (),
310- std::find (correspondingSegment->Points .begin (),
311- correspondingSegment->Points .end (),
312- point))]
313- );
305+ facePoints->Colors .push_back (correspondingSegment->Colors [i]);
314306 }
307+ indicesToRemove.push_back (i);
315308 }
316309 }
317310 else
318311 {
319312 facePoints->Points .push_back (point);
320- facePoints->Normals .push_back (
321- correspondingSegment->Normals [std::distance (
322- correspondingSegment->Points .begin (),
323- std::find (correspondingSegment->Points .begin (),
324- correspondingSegment->Points .end (),
325- point))]
326- );
313+ facePoints->Normals .push_back (correspondingSegment->Normals [i]);
327314 if (hasColors)
328315 {
329- facePoints->Colors .push_back (
330- correspondingSegment->Colors [std::distance (
331- correspondingSegment->Points .begin (),
332- std::find (correspondingSegment->Points .begin (),
333- correspondingSegment->Points .end (),
334- point))]
335- );
316+ facePoints->Colors .push_back (correspondingSegment->Colors [i]);
336317 }
318+ indicesToRemove.push_back (i);
337319 }
338320 }
339321
340- for (Eigen::Vector3d point : facePoints-> Points )
322+ for ( auto it = indicesToRemove. rbegin (); it != indicesToRemove. rend (); ++it )
341323 {
342- correspondingSegment->Points .erase (
343- std::remove (
344- correspondingSegment->Points .begin (),
345- correspondingSegment->Points .end (),
346- point),
347- correspondingSegment->Points .end ());
324+ int i = *it;
325+
326+ correspondingSegment->Points .erase (correspondingSegment->Points .begin () + i);
327+ correspondingSegment->Normals .erase (correspondingSegment->Normals .begin () + i);
328+
329+ if (hasColors)
330+ {
331+ correspondingSegment->Colors .erase (correspondingSegment->Colors .begin () + i);
332+ }
348333 }
349334 faceSegments.push_back (facePoints);
350335 }
@@ -372,7 +357,7 @@ namespace diffCheck::segmentation
372357 for (std::shared_ptr<geometry::DFPointCloud> cluster : unassociatedClusters)
373358 {
374359 std::shared_ptr<geometry::DFMesh> correspondingMeshFace;
375- Eigen::Vector3d clusterCenter;
360+ Eigen::Vector3d clusterCenter = Eigen::Vector3d::Zero () ;
376361 Eigen::Vector3d clusterNormal = Eigen::Vector3d::Zero ();
377362
378363 if (cluster->GetNumPoints () == 0 )
@@ -390,7 +375,7 @@ namespace diffCheck::segmentation
390375 DIFFCHECK_WARN (" No meshes to associate with the clusters. Skipping the cluster." );
391376 continue ;
392377 }
393- for (Eigen::Vector3d point : cluster->Points )
378+ for (const Eigen::Vector3d& point : cluster->Points )
394379 {
395380 clusterCenter += point;
396381 }
@@ -466,11 +451,13 @@ namespace diffCheck::segmentation
466451
467452 double dotProduct = clusterNormal.dot ((clusterCenter - faceCenter).normalized ());
468453 dotProduct = std::max (-1.0 , std::min (1.0 , dotProduct));
469- double clusterNormalToJunctionLineAngle = std::acos (dotProduct);
470454
471- double currentDistance = (clusterCenter - faceCenter).norm () * std::abs (std::cos (clusterNormalToJunctionLineAngle))
472- / std::min (std::abs (clusterNormal.dot (faceNormal)), 0.05 ) ;
473- if (std::abs (sin (acos (faceNormal.dot (clusterNormal)))) < angleThreshold && currentDistance < maximumFaceSegmentDistance && currentDistance * (std::abs (faceNormal.dot ((faceCenter - clusterCenter) / (faceCenter - clusterCenter).norm ()))) < distance)
455+ double anglePenalty = 100 *std::abs (clusterNormal.dot (faceNormal));
456+ double currentDistance = (clusterCenter - faceCenter).norm () * (.1 + std::abs (dotProduct)) / std::max (anglePenalty, 1.0 );
457+ double normalAlignment = std::abs (faceNormal.dot (clusterNormal));
458+ if (std::abs (std::sqrt (1.0 - normalAlignment * normalAlignment)) < angleThreshold
459+ && currentDistance < maximumFaceSegmentDistance
460+ && currentDistance < distance)
474461 {
475462 goodMeshIndex = meshIndex;
476463 goodFaceIndex = faceIndex;
@@ -495,13 +482,16 @@ namespace diffCheck::segmentation
495482 }
496483 std::shared_ptr<geometry::DFPointCloud> completed_segment = existingPointCloudSegments[goodMeshIndex][goodFaceIndex];
497484
498- for (Eigen::Vector3d point : cluster->Points )
485+ std::vector<int > indicesToRemove;
486+ for (size_t i = 0 ; i < cluster->Points .size (); i++)
499487 {
488+ const Eigen::Vector3d& point = cluster->Points [i];
500489 if (isCylinder)
501490 {
502491 completed_segment->Points .push_back (point);
503- completed_segment->Normals .push_back (cluster->Normals [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
504- completed_segment->Colors .push_back (cluster->Colors [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
492+ completed_segment->Normals .push_back (cluster->Normals [i]);
493+ completed_segment->Colors .push_back (cluster->Colors [i]);
494+ indicesToRemove.push_back (i);
505495 }
506496 else
507497 {
@@ -510,27 +500,20 @@ namespace diffCheck::segmentation
510500 if (correspondingMeshFace->IsPointOnFace (point, associationThreshold))
511501 {
512502 completed_segment->Points .push_back (point);
513- completed_segment->Normals .push_back (cluster->Normals [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
514- completed_segment->Colors .push_back (cluster->Colors [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
503+ completed_segment->Normals .push_back (cluster->Normals [i]);
504+ completed_segment->Colors .push_back (cluster->Colors [i]);
505+ indicesToRemove.push_back (i);
515506 }
516507 }
517508 else
518509 {
519510 completed_segment->Points .push_back (point);
520- completed_segment->Normals .push_back (cluster->Normals [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
521- completed_segment->Colors .push_back (cluster->Colors [std::distance (cluster->Points .begin (), std::find (cluster->Points .begin (), cluster->Points .end (), point))]);
511+ completed_segment->Normals .push_back (cluster->Normals [i]);
512+ completed_segment->Colors .push_back (cluster->Colors [i]);
513+ indicesToRemove.push_back (i);
522514 }
523515 }
524516 }
525- std::vector<int > indicesToRemove;
526-
527- for (int i = 0 ; i < cluster->Points .size (); ++i)
528- {
529- if (std::find (completed_segment->Points .begin (), completed_segment->Points .end (), cluster->Points [i]) != completed_segment->Points .end ())
530- {
531- indicesToRemove.push_back (i);
532- }
533- }
534517 for (auto it = indicesToRemove.rbegin (); it != indicesToRemove.rend (); ++it)
535518 {
536519 std::swap (cluster->Points [*it], cluster->Points .back ());
0 commit comments