// Can only add overlapping pairs. // Sort edge up and add overlapping pairs private void SortMaxEdgeUp(List<Edge> edgeList, int axisIndex, int edgeIndex) { int maxIndex = edgeList.Count - 1; if (edgeIndex == maxIndex) return; var edge = edgeList[edgeIndex]; var itemInfo = edge.Info; int nextEdgeIndex = edgeIndex + 1; var nextEdge = edgeList[nextEdgeIndex]; while (edge.Position >= nextEdge.Position) { var nextItemInfo = nextEdge.Info; if (nextEdge.IsMax == false) { // New overlapping pair! if (_broadPhase != null || EnableSelfOverlaps) { if (AreOverlapping(itemInfo, nextItemInfo, axisIndex)) { var overlap = new Pair<T>(itemInfo.Item, nextItemInfo.Item); if (Filter == null || Filter.Filter(overlap)) { if (_broadPhase != null) _broadPhase.Add(overlap); if (EnableSelfOverlaps) SelfOverlaps.Add(overlap); } } } nextItemInfo.MinEdgeIndices[axisIndex] = edgeIndex; // Min edge was swapped down. } else { nextItemInfo.MaxEdgeIndices[axisIndex] = edgeIndex; // Max edge was swapped down. } itemInfo.MaxEdgeIndices[axisIndex] = nextEdgeIndex; // Max edge was swapped up. // Swap edges in edge list. edgeList[edgeIndex] = nextEdge; edgeList[nextEdgeIndex] = edge; edgeIndex++; if (edgeIndex == maxIndex) return; nextEdgeIndex++; nextEdge = edgeList[nextEdgeIndex]; } }
public Box Create(Rect area) { var box = new Box(this, area); Boxes.Add(box); _broadPhase.Add(box); return(box); }
// Can only add overlapping pairs. // Sort edge down and add overlapping pairs. private void SortMinEdgeDown(List <Edge> edgeList, int axisIndex, int edgeIndex) { if (edgeIndex == 0) { return; } var edge = edgeList[edgeIndex]; var itemInfo = edge.Info; int previousEdgeIndex = edgeIndex - 1; Edge previousEdge = edgeList[previousEdgeIndex]; while (edge.Position <= previousEdge.Position) { var previousItemInfo = previousEdge.Info; if (previousEdge.IsMax) { // New overlapping pair! if (_broadPhase != null || EnableSelfOverlaps) { if (AreOverlapping(itemInfo, previousItemInfo, axisIndex)) { var overlap = new Pair <T>(itemInfo.Item, previousItemInfo.Item); if (Filter == null || Filter.Filter(overlap)) { if (_broadPhase != null) { _broadPhase.Add(overlap); } if (EnableSelfOverlaps) { SelfOverlaps.Add(overlap); } } } } previousItemInfo.MaxEdgeIndices[axisIndex] = edgeIndex; // Max edge was swapped up. } else { previousItemInfo.MinEdgeIndices[axisIndex] = edgeIndex; // Min edge was swapped up. } itemInfo.MinEdgeIndices[axisIndex] = previousEdgeIndex; // Min edge was swapped down. // Swap edges in edge list. edgeList[edgeIndex] = previousEdge; edgeList[previousEdgeIndex] = edge; edgeIndex--; if (edgeIndex == 0) { return; } previousEdgeIndex--; previousEdge = edgeList[previousEdgeIndex]; } }