Skip to content

Commit 8eb224a

Browse files
author
Stefan Seil
committed
Fix redundant hit tests in OctTree
1 parent 709feae commit 8eb224a

1 file changed

Lines changed: 22 additions & 22 deletions

File tree

CADability/OctTree.cs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -494,34 +494,34 @@ internal void GetObjectsFromLine(GeoPoint start, GeoVector dir, double maxdist,
494494
}
495495
}
496496
}
497-
internal void GetObjectsFromRect(Projection projection, BoundingRect rect, bool onlyInside, Set<TT> addToList)
497+
internal void GetObjectsFromRect(Projection projection, BoundingRect rect, bool onlyInside, Set<TT> addToList, HashSet<TT> alreadyTested)
498498
{
499499
if (cube.Interferes(projection, rect))
500500
{
501501
if (list != null)
502502
{
503503
foreach (TT item in list)
504504
{
505-
if (!addToList.Contains(item) && item.HitTest(projection, rect, onlyInside))
505+
if (alreadyTested.Add(item) && item.HitTest(projection, rect, onlyInside))
506506
{
507507
addToList.Add(item);
508508
}
509509
}
510510
}
511511
else if (ppp != null)
512512
{
513-
ppp.GetObjectsFromRect(projection, rect, onlyInside, addToList);
514-
mpp.GetObjectsFromRect(projection, rect, onlyInside, addToList);
515-
pmp.GetObjectsFromRect(projection, rect, onlyInside, addToList);
516-
mmp.GetObjectsFromRect(projection, rect, onlyInside, addToList);
517-
ppm.GetObjectsFromRect(projection, rect, onlyInside, addToList);
518-
mpm.GetObjectsFromRect(projection, rect, onlyInside, addToList);
519-
pmm.GetObjectsFromRect(projection, rect, onlyInside, addToList);
520-
mmm.GetObjectsFromRect(projection, rect, onlyInside, addToList);
513+
ppp.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
514+
mpp.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
515+
pmp.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
516+
mmp.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
517+
ppm.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
518+
mpm.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
519+
pmm.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
520+
mmm.GetObjectsFromRect(projection, rect, onlyInside, addToList, alreadyTested);
521521
}
522522
}
523523
}
524-
internal void GetObjectsFromRect(Projection.PickArea area, bool onlyInside, Set<TT> addToList)
524+
internal void GetObjectsFromRect(Projection.PickArea area, bool onlyInside, Set<TT> addToList, HashSet<TT> alreadyTested)
525525
{
526526
if (area == null) return;
527527
if (cube.Interferes(area))
@@ -530,22 +530,22 @@ internal void GetObjectsFromRect(Projection.PickArea area, bool onlyInside, Set<
530530
{
531531
foreach (TT item in list)
532532
{
533-
if (!addToList.Contains(item) && item.HitTest(area, onlyInside))
533+
if (alreadyTested.Add(item) && item.HitTest(area, onlyInside))
534534
{
535535
addToList.Add(item);
536536
}
537537
}
538538
}
539539
else if (ppp != null)
540540
{
541-
ppp.GetObjectsFromRect(area, onlyInside, addToList);
542-
mpp.GetObjectsFromRect(area, onlyInside, addToList);
543-
pmp.GetObjectsFromRect(area, onlyInside, addToList);
544-
mmp.GetObjectsFromRect(area, onlyInside, addToList);
545-
ppm.GetObjectsFromRect(area, onlyInside, addToList);
546-
mpm.GetObjectsFromRect(area, onlyInside, addToList);
547-
pmm.GetObjectsFromRect(area, onlyInside, addToList);
548-
mmm.GetObjectsFromRect(area, onlyInside, addToList);
541+
ppp.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
542+
mpp.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
543+
pmp.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
544+
mmp.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
545+
ppm.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
546+
mpm.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
547+
pmm.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
548+
mmm.GetObjectsFromRect(area, onlyInside, addToList, alreadyTested);
549549
}
550550
}
551551
}
@@ -1205,7 +1205,7 @@ public T[] GetObjectsFromRect(Projection projection, BoundingRect rect, bool onl
12051205
{
12061206
//GeoObjectList dbg = DebugCheck(delegate(IOctTreeInsertable[] theList, BoundingCube bc) { return bc.Interferes(projection, rect); });
12071207
Set<T> addToList = new Set<T>();
1208-
node.GetObjectsFromRect(projection, rect, onlyInside, addToList);
1208+
node.GetObjectsFromRect(projection, rect, onlyInside, addToList, new HashSet<T>());
12091209
return addToList.ToArray();
12101210
}
12111211
/// <summary>
@@ -1220,7 +1220,7 @@ public T[] GetObjectsFromRect(Projection.PickArea area, bool onlyInside)
12201220
{
12211221
//GeoObjectList dbg = DebugCheck(delegate(IOctTreeInsertable[] theList, BoundingCube bc) { return bc.Interferes(projection, rect); });
12221222
Set<T> addToList = new Set<T>();
1223-
node.GetObjectsFromRect(area, onlyInside, addToList);
1223+
node.GetObjectsFromRect(area, onlyInside, addToList, new HashSet<T>());
12241224
return addToList.ToArray();
12251225
}
12261226
/// <summary>

0 commit comments

Comments
 (0)