@@ -36,6 +36,7 @@ export interface GapFillSolverInput {
3636 simpleRouteJson : SimpleRouteJson
3737 placedRects : Placed3D [ ]
3838 obstaclesByLayer : XYRect [ ] [ ]
39+ maxEdgeDistance ?: number // Max distance to consider edges "nearby" (default: 2.0)
3940}
4041
4142// Sub-phases for visualization
@@ -52,6 +53,7 @@ interface GapFillState {
5253 inputRects : Placed3D [ ]
5354 obstaclesByLayer : XYRect [ ] [ ]
5455 layerCount : number
56+ maxEdgeDistance : number
5557
5658 edges : RectEdge [ ]
5759 edgeSpatialIndex : FlatbushIndex < RectEdge >
@@ -85,17 +87,19 @@ export class GapFillSolver extends BaseSolver {
8587
8688 private initState ( input : GapFillSolverInput ) : GapFillState {
8789 const layerCount = input . simpleRouteJson . layerCount || 1
90+ const maxEdgeDistance = input . maxEdgeDistance ?? 2.0
8891
8992 const edges = this . extractEdges ( input . placedRects )
9093
9194 // Build spatial index for fast edge-to-edge queries
92- const edgeSpatialIndex = this . buildEdgeSpatialIndex ( edges )
95+ const edgeSpatialIndex = this . buildEdgeSpatialIndex ( edges , maxEdgeDistance )
9396
9497 return {
9598 srj : input . simpleRouteJson ,
9699 inputRects : input . placedRects ,
97100 obstaclesByLayer : input . obstaclesByLayer ,
98101 layerCount,
102+ maxEdgeDistance,
99103 edges,
100104 edgeSpatialIndex,
101105 phase : "SELECT_PRIMARY_EDGE" ,
@@ -109,16 +113,18 @@ export class GapFillSolver extends BaseSolver {
109113 }
110114 }
111115
112- private buildEdgeSpatialIndex ( edges : RectEdge [ ] ) : FlatbushIndex < RectEdge > {
116+ private buildEdgeSpatialIndex (
117+ edges : RectEdge [ ] ,
118+ maxEdgeDistance : number ,
119+ ) : FlatbushIndex < RectEdge > {
113120 const index = new FlatbushIndex < RectEdge > ( edges . length )
114121
115122 for ( const edge of edges ) {
116123 // Create bounding box for edge (padded by max search distance)
117- const padding = 2.0 // Max edge distance threshold
118- const minX = Math . min ( edge . x1 , edge . x2 ) - padding
119- const minY = Math . min ( edge . y1 , edge . y2 ) - padding
120- const maxX = Math . max ( edge . x1 , edge . x2 ) + padding
121- const maxY = Math . max ( edge . y1 , edge . y2 ) + padding
124+ const minX = Math . min ( edge . x1 , edge . x2 ) - maxEdgeDistance
125+ const minY = Math . min ( edge . y1 , edge . y2 ) - maxEdgeDistance
126+ const maxX = Math . max ( edge . x1 , edge . x2 ) + maxEdgeDistance
127+ const maxY = Math . max ( edge . y1 , edge . y2 ) + maxEdgeDistance
122128
123129 index . insert ( edge , minX , minY , maxX , maxY )
124130 }
@@ -241,7 +247,7 @@ export class GapFillSolver extends BaseSolver {
241247 const primaryEdge = this . state . currentPrimaryEdge !
242248
243249 // Query spatial index for candidate edges near this primary edge
244- const padding = 2.0 // Max distance threshold
250+ const padding = this . state . maxEdgeDistance
245251 const minX = Math . min ( primaryEdge . x1 , primaryEdge . x2 ) - padding
246252 const minY = Math . min ( primaryEdge . y1 , primaryEdge . y2 ) - padding
247253 const maxX = Math . max ( primaryEdge . x1 , primaryEdge . x2 ) + padding
@@ -435,7 +441,7 @@ export class GapFillSolver extends BaseSolver {
435441 if ( sharedLayers . length === 0 ) return false
436442
437443 const distance = this . distanceBetweenEdges ( primaryEdge , candidate )
438- if ( distance > 2.0 ) return false // TODO: Make this configurable
444+ if ( distance > this . state . maxEdgeDistance ) return false
439445
440446 return true
441447 }
0 commit comments