private static IEnumerable <Point3D> BuildEdgeIntersectionList(List <SolverGeometricObject> solverGeometry) { var geometry = solverGeometry; var intersectionList = new List <Point3D>(); var boxes = new SortedDictionary <int, ShapeBoundBox>(); foreach (var geometricObject in geometry) { if (geometricObject.Parent == null) { continue; } if (geometricObject.Builder.Shape == null) { continue; } var transformedShape = geometricObject.Builder.Shape.Located(new TopLocLocation(geometricObject.Builder.Transformation)); var bndBox = ShapeUtils.ExtractBoundingBox(transformedShape); boxes[geometricObject.Parent.Index] = bndBox; } foreach (var geometricObject in geometry) { if (geometricObject.Edges.Count == 0) { continue; } if (geometricObject.Edges.Count > 20) { continue; } if (geometricObject.Parent == null) { continue; } if (!boxes.ContainsKey(geometricObject.Parent.Index)) { continue; } foreach (var destinationObject in geometry) { if (destinationObject.Parent == null) { continue; } if (destinationObject.Edges.Count == 0) { continue; } if (geometricObject.Edges.Count == 1 || destinationObject.Edges.Count == 1) { continue; } if (destinationObject.Edges.Count > 20) { continue; } if (geometricObject.Parent.Index == destinationObject.Parent.Index) { continue; } if (!boxes.ContainsKey(destinationObject.Parent.Index)) { continue; } var sourceBox = boxes[geometricObject.Parent.Index]; var destBox = boxes[destinationObject.Parent.Index]; if (sourceBox == null || destBox == null) { continue; } if (sourceBox.IsOut(destBox)) { continue; } BuildEdgeIntersections(geometricObject, destinationObject, intersectionList); } } foreach (var geometricObject in geometry) { if (geometricObject.Edges.Count == 0) { continue; } foreach (var destinationObject in geometry) { if (destinationObject.Edges.Count == 0) { continue; } if (destinationObject.Builder.Node.Index <= geometricObject.Builder.Node.Index) { continue; } if (geometricObject.Edges.Count == 1 || destinationObject.Edges.Count == 1) { BuildEdgeIntersections(geometricObject, destinationObject, intersectionList); } } } return(intersectionList); }