refactor: delegate Part.Intersects to Collision.Check
This commit is contained in:
+8
-47
@@ -171,57 +171,18 @@ namespace OpenNest
|
|||||||
if (perimeter1 == null || perimeter2 == null)
|
if (perimeter1 == null || perimeter2 == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
perimeter1.Offset(Location);
|
var polygon1 = perimeter1.ToPolygon();
|
||||||
perimeter2.Offset(part.Location);
|
var polygon2 = perimeter2.ToPolygon();
|
||||||
|
|
||||||
if (!perimeter1.Intersects(perimeter2, out var rawPts))
|
if (polygon1 == null || polygon2 == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Exclude intersection points that coincide with a vertex of either
|
polygon1.Offset(Location);
|
||||||
// perimeter — these are boundary contact points (shared corners,
|
polygon2.Offset(part.Location);
|
||||||
// endpoints, or a corner touching an edge) with zero area overlap,
|
|
||||||
// not actual crossings where one shape enters the other's interior.
|
|
||||||
var verts1 = CollectVertices(perimeter1);
|
|
||||||
var verts2 = CollectVertices(perimeter2);
|
|
||||||
|
|
||||||
foreach (var pt in rawPts)
|
var result = Geometry.Collision.Check(polygon1, polygon2);
|
||||||
{
|
pts = result.IntersectionPoints.ToList();
|
||||||
if (IsNearAnyVertex(pt, verts1) || IsNearAnyVertex(pt, verts2))
|
return result.Overlaps;
|
||||||
continue;
|
|
||||||
pts.Add(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pts.Count > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<Vector> CollectVertices(Geometry.Shape shape)
|
|
||||||
{
|
|
||||||
var verts = new List<Vector>();
|
|
||||||
foreach (var entity in shape.Entities)
|
|
||||||
{
|
|
||||||
switch (entity)
|
|
||||||
{
|
|
||||||
case Geometry.Line line:
|
|
||||||
verts.Add(line.StartPoint);
|
|
||||||
verts.Add(line.EndPoint);
|
|
||||||
break;
|
|
||||||
case Geometry.Arc arc:
|
|
||||||
verts.Add(arc.StartPoint());
|
|
||||||
verts.Add(arc.EndPoint());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return verts;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsNearAnyVertex(Vector pt, List<Vector> vertices)
|
|
||||||
{
|
|
||||||
foreach (var v in vertices)
|
|
||||||
{
|
|
||||||
if (pt.X.IsEqualTo(v.X) && pt.Y.IsEqualTo(v.Y))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public double Left
|
public double Left
|
||||||
|
|||||||
Reference in New Issue
Block a user