Skip to content

Commit 4ea3f52

Browse files
committed
add maxEdgeDistance param
1 parent 010fe66 commit 4ea3f52

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

lib/solvers/GapFillSolver.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)