@tscircuit/curvy-trace-solver 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -1
- package/dist/index.js +24 -21
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,8 @@ interface CurvyTraceProblem {
|
|
|
16
16
|
bounds: Bounds;
|
|
17
17
|
waypointPairs: WaypointPair[];
|
|
18
18
|
obstacles: Obstacle[];
|
|
19
|
-
|
|
19
|
+
preferredTraceToTraceSpacing: number;
|
|
20
|
+
preferredObstacleToTraceSpacing: number;
|
|
20
21
|
}
|
|
21
22
|
interface OutputTrace {
|
|
22
23
|
waypointPair: WaypointPair;
|
package/dist/index.js
CHANGED
|
@@ -871,7 +871,8 @@ var visualizeCurvyTraceProblem = (problem, outputTraces = []) => {
|
|
|
871
871
|
width: obstacle.maxX - obstacle.minX,
|
|
872
872
|
height: obstacle.maxY - obstacle.minY,
|
|
873
873
|
fill: "rgba(128, 128, 128, 0.3)",
|
|
874
|
-
stroke: "rgba(128, 128, 128, 0.8)"
|
|
874
|
+
stroke: "rgba(128, 128, 128, 0.8)",
|
|
875
|
+
label: `netId: ${obstacle.networkId}`
|
|
875
876
|
});
|
|
876
877
|
}
|
|
877
878
|
for (const trace of outputTraces) {
|
|
@@ -1200,7 +1201,7 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1200
1201
|
}
|
|
1201
1202
|
// Determine which trace pairs could possibly collide based on bounding boxes
|
|
1202
1203
|
updateCollisionPairs() {
|
|
1203
|
-
const { preferredSpacing } = this.problem;
|
|
1204
|
+
const { preferredTraceToTraceSpacing: preferredSpacing } = this.problem;
|
|
1204
1205
|
this.collisionPairs = [];
|
|
1205
1206
|
for (let i = 0; i < this.traces.length; i++) {
|
|
1206
1207
|
for (let j = i + 1; j < this.traces.length; j++) {
|
|
@@ -1215,8 +1216,9 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1215
1216
|
}
|
|
1216
1217
|
}
|
|
1217
1218
|
computeTotalCost() {
|
|
1218
|
-
const {
|
|
1219
|
-
const
|
|
1219
|
+
const { preferredTraceToTraceSpacing, preferredObstacleToTraceSpacing } = this.problem;
|
|
1220
|
+
const traceSpacingSq = preferredTraceToTraceSpacing ** 2;
|
|
1221
|
+
const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;
|
|
1220
1222
|
let cost = 0;
|
|
1221
1223
|
for (const [i, j] of this.collisionPairs) {
|
|
1222
1224
|
const pi = this.sampledPoints[i], pj = this.sampledPoints[j];
|
|
@@ -1227,10 +1229,10 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1227
1229
|
const b1x = pj[b * 2], b1y = pj[b * 2 + 1];
|
|
1228
1230
|
const b2x = pj[(b + 1) * 2], b2y = pj[(b + 1) * 2 + 1];
|
|
1229
1231
|
const distSq = segmentDistSq(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);
|
|
1230
|
-
if (distSq <
|
|
1232
|
+
if (distSq < traceSpacingSq) {
|
|
1231
1233
|
const dist = Math.sqrt(distSq);
|
|
1232
|
-
cost += (
|
|
1233
|
-
if (distSq < 1e-18) cost += 20 *
|
|
1234
|
+
cost += (preferredTraceToTraceSpacing - dist) ** 2;
|
|
1235
|
+
if (distSq < 1e-18) cost += 20 * traceSpacingSq;
|
|
1234
1236
|
}
|
|
1235
1237
|
}
|
|
1236
1238
|
}
|
|
@@ -1249,16 +1251,16 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1249
1251
|
const oy2 = this.obstacleSegments[obsBase + 3];
|
|
1250
1252
|
const obsMinX = Math.min(ox1, ox2), obsMaxX = Math.max(ox1, ox2);
|
|
1251
1253
|
const obsMinY = Math.min(oy1, oy2), obsMaxY = Math.max(oy1, oy2);
|
|
1252
|
-
if (bi.maxX +
|
|
1254
|
+
if (bi.maxX + preferredObstacleToTraceSpacing < obsMinX || obsMaxX + preferredObstacleToTraceSpacing < bi.minX || bi.maxY + preferredObstacleToTraceSpacing < obsMinY || obsMaxY + preferredObstacleToTraceSpacing < bi.minY)
|
|
1253
1255
|
continue;
|
|
1254
1256
|
for (let a = 0; a < OPT_SAMPLES; a++) {
|
|
1255
1257
|
const a1x = pi[a * 2], a1y = pi[a * 2 + 1];
|
|
1256
1258
|
const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];
|
|
1257
1259
|
const distSq = segmentDistSq(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);
|
|
1258
|
-
if (distSq <
|
|
1260
|
+
if (distSq < obstacleSpacingSq) {
|
|
1259
1261
|
const dist = Math.sqrt(distSq);
|
|
1260
|
-
cost += (
|
|
1261
|
-
if (distSq < 1e-18) cost += 20 *
|
|
1262
|
+
cost += (preferredObstacleToTraceSpacing - dist) ** 2;
|
|
1263
|
+
if (distSq < 1e-18) cost += 20 * obstacleSpacingSq;
|
|
1262
1264
|
}
|
|
1263
1265
|
}
|
|
1264
1266
|
}
|
|
@@ -1266,8 +1268,9 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1266
1268
|
return cost;
|
|
1267
1269
|
}
|
|
1268
1270
|
computeCostForTrace(traceIdx) {
|
|
1269
|
-
const {
|
|
1270
|
-
const
|
|
1271
|
+
const { preferredTraceToTraceSpacing, preferredObstacleToTraceSpacing } = this.problem;
|
|
1272
|
+
const traceSpacingSq = preferredTraceToTraceSpacing ** 2;
|
|
1273
|
+
const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;
|
|
1271
1274
|
const trace = this.traces[traceIdx];
|
|
1272
1275
|
const pi = this.sampledPoints[traceIdx];
|
|
1273
1276
|
const bi = this.traceBounds[traceIdx];
|
|
@@ -1278,7 +1281,7 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1278
1281
|
if (trace.networkId && other.networkId && trace.networkId === other.networkId)
|
|
1279
1282
|
continue;
|
|
1280
1283
|
const bj = this.traceBounds[j];
|
|
1281
|
-
if (bi.maxX +
|
|
1284
|
+
if (bi.maxX + preferredTraceToTraceSpacing < bj.minX || bj.maxX + preferredTraceToTraceSpacing < bi.minX || bi.maxY + preferredTraceToTraceSpacing < bj.minY || bj.maxY + preferredTraceToTraceSpacing < bi.minY)
|
|
1282
1285
|
continue;
|
|
1283
1286
|
const pj = this.sampledPoints[j];
|
|
1284
1287
|
for (let a = 0; a < OPT_SAMPLES; a++) {
|
|
@@ -1288,10 +1291,10 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1288
1291
|
const b1x = pj[b * 2], b1y = pj[b * 2 + 1];
|
|
1289
1292
|
const b2x = pj[(b + 1) * 2], b2y = pj[(b + 1) * 2 + 1];
|
|
1290
1293
|
const distSq = segmentDistSq(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);
|
|
1291
|
-
if (distSq <
|
|
1294
|
+
if (distSq < traceSpacingSq) {
|
|
1292
1295
|
const dist = Math.sqrt(distSq);
|
|
1293
|
-
cost += (
|
|
1294
|
-
if (distSq < 1e-18) cost += 20 *
|
|
1296
|
+
cost += (preferredTraceToTraceSpacing - dist) ** 2;
|
|
1297
|
+
if (distSq < 1e-18) cost += 20 * traceSpacingSq;
|
|
1295
1298
|
}
|
|
1296
1299
|
}
|
|
1297
1300
|
}
|
|
@@ -1306,16 +1309,16 @@ var CurvyTraceSolver = class extends BaseSolver {
|
|
|
1306
1309
|
const oy2 = this.obstacleSegments[obsBase + 3];
|
|
1307
1310
|
const obsMinX = Math.min(ox1, ox2), obsMaxX = Math.max(ox1, ox2);
|
|
1308
1311
|
const obsMinY = Math.min(oy1, oy2), obsMaxY = Math.max(oy1, oy2);
|
|
1309
|
-
if (bi.maxX +
|
|
1312
|
+
if (bi.maxX + preferredObstacleToTraceSpacing < obsMinX || obsMaxX + preferredObstacleToTraceSpacing < bi.minX || bi.maxY + preferredObstacleToTraceSpacing < obsMinY || obsMaxY + preferredObstacleToTraceSpacing < bi.minY)
|
|
1310
1313
|
continue;
|
|
1311
1314
|
for (let a = 0; a < OPT_SAMPLES; a++) {
|
|
1312
1315
|
const a1x = pi[a * 2], a1y = pi[a * 2 + 1];
|
|
1313
1316
|
const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];
|
|
1314
1317
|
const distSq = segmentDistSq(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);
|
|
1315
|
-
if (distSq <
|
|
1318
|
+
if (distSq < obstacleSpacingSq) {
|
|
1316
1319
|
const dist = Math.sqrt(distSq);
|
|
1317
|
-
cost += (
|
|
1318
|
-
if (distSq < 1e-18) cost += 20 *
|
|
1320
|
+
cost += (preferredObstacleToTraceSpacing - dist) ** 2;
|
|
1321
|
+
if (distSq < 1e-18) cost += 20 * obstacleSpacingSq;
|
|
1319
1322
|
}
|
|
1320
1323
|
}
|
|
1321
1324
|
}
|