@tscircuit/schematic-trace-solver 0.0.45 → 0.0.47

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.
Files changed (27) hide show
  1. package/.github/workflows/bun-formatcheck.yml +1 -1
  2. package/.github/workflows/bun-pver-release.yml +1 -1
  3. package/.github/workflows/bun-test.yml +1 -1
  4. package/.github/workflows/bun-typecheck.yml +1 -1
  5. package/dist/index.d.ts +35 -9
  6. package/dist/index.js +543 -186
  7. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.ts +92 -50
  8. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/detectTraceLabelOverlap.ts +26 -11
  9. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/rerouteCollidingTrace.ts +16 -5
  10. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/LabelMergingSolver.ts +95 -75
  11. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/filterLabelsAtTraceEdges.ts +74 -0
  12. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/groupLabelsByChipAndOrientation.ts +45 -0
  13. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/mergeLabelGroup.ts +71 -0
  14. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/OverlapAvoidanceStepSolver.ts +162 -28
  15. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/doesTraceStartOrEndInLabel.ts +58 -0
  16. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/isPointInsideLabel.ts +23 -0
  17. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/visualizeDecomposition.ts +54 -0
  18. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/SingleOverlapSolver/SingleOverlapSolver.ts +13 -1
  19. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/tryFourPointDetour.ts +110 -60
  20. package/package.json +1 -1
  21. package/site/examples/example27.page.tsx +4 -0
  22. package/tests/assets/example27.json +168 -0
  23. package/tests/examples/__snapshots__/example03.snap.svg +67 -67
  24. package/tests/examples/__snapshots__/example16.snap.svg +3 -3
  25. package/tests/examples/__snapshots__/example30.snap.svg +258 -0
  26. package/tests/examples/example30.test.ts +12 -0
  27. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +4 -1
@@ -2,216 +2,216 @@
2
2
  <rect width="100%" height="100%" fill="white" />
3
3
  <g>
4
4
  <circle data-type="point" data-label="PIN1_PIN2.1
5
- x-" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.55755929219254" cy="217.7151979959293" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
5
+ x-" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.9568626609827" cy="216.42097033915468" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
6
6
  </g>
7
7
  <g>
8
8
  <circle data-type="point" data-label="PIN1_PIN2.2
9
- x-" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.55755929219254" cy="217.7151979959293" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
9
+ x-" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.9568626609827" cy="216.42097033915468" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
10
10
  </g>
11
11
  <g>
12
12
  <circle data-type="point" data-label="PIN1_PIN2.3
13
- x+" data-x="-2.4994231089999994" data-y="1.4485175000000003" cx="141.6107074874649" cy="217.7459158862381" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
13
+ x+" data-x="-2.4994231089999994" data-y="1.4485175000000003" cx="142.8964057073185" cy="216.4520769083524" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
14
14
  </g>
15
15
  <g>
16
16
  <circle data-type="point" data-label="PIN1_PIN2.4
17
- x+" data-x="-2.4994231089999994" data-y="1.4485175000000003" cx="141.6107074874649" cy="217.7459158862381" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
17
+ x+" data-x="-2.4994231089999994" data-y="1.4485175000000003" cx="142.8964057073185" cy="216.4520769083524" r="3" fill="hsl(328, 100%, 50%, 0.8)" />
18
18
  </g>
19
19
  <g>
20
20
  <circle data-type="point" data-label="PIN1_PIN3.1
21
- x-" data-x="-0.5005768910000006" data-y="1.4489565000000004" cx="281.47480513826264" cy="217.7151979959293" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
21
+ x-" data-x="-0.5005768910000006" data-y="1.4489565000000004" cx="284.5302284768321" cy="216.42097033915468" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
22
22
  </g>
23
23
  <g>
24
24
  <circle data-type="point" data-label="PIN1_PIN3.2
25
- x-" data-x="-0.5005768910000006" data-y="1.4489565000000004" cx="281.47480513826264" cy="217.7151979959293" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
25
+ x-" data-x="-0.5005768910000006" data-y="1.4489565000000004" cx="284.5302284768321" cy="216.42097033915468" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
26
26
  </g>
27
27
  <g>
28
28
  <circle data-type="point" data-label="PIN1_PIN3.3
29
- x+" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="351.527953333535" cy="217.7459158862381" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
29
+ x+" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="355.4697715231679" cy="216.4520769083524" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
30
30
  </g>
31
31
  <g>
32
32
  <circle data-type="point" data-label="PIN1_PIN3.4
33
- x+" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="351.527953333535" cy="217.7459158862381" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
33
+ x+" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="355.4697715231679" cy="216.4520769083524" r="3" fill="hsl(208, 100%, 50%, 0.8)" />
34
34
  </g>
35
35
  <g>
36
36
  <circle data-type="point" data-label="PIN1_PIN4.1
37
- x-" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="491.39205098433274" cy="217.7151979959293" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
37
+ x-" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="497.10359429268146" cy="216.42097033915468" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
38
38
  </g>
39
39
  <g>
40
40
  <circle data-type="point" data-label="PIN1_PIN4.2
41
- x-" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="491.39205098433274" cy="217.7151979959293" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
41
+ x-" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="497.10359429268146" cy="216.42097033915468" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
42
42
  </g>
43
43
  <g>
44
44
  <circle data-type="point" data-label="PIN1_PIN4.3
45
- x+" data-x="3.5005768910000006" data-y="1.4485175000000003" cx="561.4451991796051" cy="217.7459158862381" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
45
+ x+" data-x="3.5005768910000006" data-y="1.4485175000000003" cx="568.0431373390173" cy="216.4520769083524" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
46
46
  </g>
47
47
  <g>
48
48
  <circle data-type="point" data-label="PIN1_PIN4.4
49
- x+" data-x="3.5005768910000006" data-y="1.4485175000000003" cx="561.4451991796051" cy="217.7459158862381" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
49
+ x+" data-x="3.5005768910000006" data-y="1.4485175000000003" cx="568.0431373390173" cy="216.4520769083524" r="3" fill="hsl(88, 100%, 50%, 0.8)" />
50
50
  </g>
51
51
  <g>
52
52
  <circle data-type="point" data-label="PIN2_PIN3.1
53
- x-" data-x="-3.5005768910000006" data-y="-1.5510434999999996" cx="71.55755929219254" cy="427.63244384199936" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
53
+ x-" data-x="-3.5005768910000006" data-y="-1.5510434999999996" cx="71.9568626609827" cy="428.9943361550041" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
54
54
  </g>
55
55
  <g>
56
56
  <circle data-type="point" data-label="PIN2_PIN3.2
57
- x-" data-x="-3.5005768910000006" data-y="-1.5510434999999996" cx="71.55755929219254" cy="427.63244384199936" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
57
+ x-" data-x="-3.5005768910000006" data-y="-1.5510434999999996" cx="71.9568626609827" cy="428.9943361550041" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
58
58
  </g>
59
59
  <g>
60
60
  <circle data-type="point" data-label="PIN2_PIN3.3
61
- x+" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="141.6107074874649" cy="427.6631617323082" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
61
+ x+" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="142.8964057073185" cy="429.0254427242018" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
62
62
  </g>
63
63
  <g>
64
64
  <circle data-type="point" data-label="PIN2_PIN3.4
65
- x+" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="141.6107074874649" cy="427.6631617323082" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
65
+ x+" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="142.8964057073185" cy="429.0254427242018" r="3" fill="hsl(240, 100%, 50%, 0.8)" />
66
66
  </g>
67
67
  <g>
68
68
  <circle data-type="point" data-label="PIN2_PIN4.1
69
- x-" data-x="-0.5005768910000006" data-y="-1.5510434999999996" cx="281.47480513826264" cy="427.63244384199936" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
69
+ x-" data-x="-0.5005768910000006" data-y="-1.5510434999999996" cx="284.5302284768321" cy="428.9943361550041" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
70
70
  </g>
71
71
  <g>
72
72
  <circle data-type="point" data-label="PIN2_PIN4.2
73
- x-" data-x="-0.5005768910000006" data-y="-1.5510434999999996" cx="281.47480513826264" cy="427.63244384199936" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
73
+ x-" data-x="-0.5005768910000006" data-y="-1.5510434999999996" cx="284.5302284768321" cy="428.9943361550041" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
74
74
  </g>
75
75
  <g>
76
76
  <circle data-type="point" data-label="PIN2_PIN4.3
77
- x+" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="351.527953333535" cy="427.6631617323082" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
77
+ x+" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="355.4697715231679" cy="429.0254427242018" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
78
78
  </g>
79
79
  <g>
80
80
  <circle data-type="point" data-label="PIN2_PIN4.4
81
- x+" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="351.527953333535" cy="427.6631617323082" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
81
+ x+" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="355.4697715231679" cy="429.0254427242018" r="3" fill="hsl(120, 100%, 50%, 0.8)" />
82
82
  </g>
83
83
  <g>
84
84
  <circle data-type="point" data-label="PIN3_PIN4.1
85
- x-" data-x="2.4994231089999994" data-y="-1.5510434999999996" cx="491.39205098433274" cy="427.63244384199936" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
85
+ x-" data-x="2.4994231089999994" data-y="-1.5510434999999996" cx="497.10359429268146" cy="428.9943361550041" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
86
86
  </g>
87
87
  <g>
88
88
  <circle data-type="point" data-label="PIN3_PIN4.2
89
- x-" data-x="2.4994231089999994" data-y="-1.5510434999999996" cx="491.39205098433274" cy="427.63244384199936" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
89
+ x-" data-x="2.4994231089999994" data-y="-1.5510434999999996" cx="497.10359429268146" cy="428.9943361550041" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
90
90
  </g>
91
91
  <g>
92
92
  <circle data-type="point" data-label="PIN3_PIN4.3
93
- x+" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="561.4451991796051" cy="427.6631617323082" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
93
+ x+" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="568.0431373390173" cy="429.0254427242018" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
94
94
  </g>
95
95
  <g>
96
96
  <circle data-type="point" data-label="PIN3_PIN4.4
97
- x+" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="561.4451991796051" cy="427.6631617323082" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
97
+ x+" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="568.0431373390173" cy="429.0254427242018" r="3" fill="hsl(152, 100%, 50%, 0.8)" />
98
98
  </g>
99
99
  <g>
100
- <circle data-type="point" data-label="" data-x="-3.7005768910000008" data-y="1.4489565000000004" cx="57.56307623578783" cy="217.7151979959293" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
100
+ <circle data-type="point" data-label="" data-x="-3.7005768910000008" data-y="1.4489565000000004" cx="57.78530493992605" cy="216.42097033915468" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
101
101
  </g>
102
102
  <g>
103
- <circle data-type="point" data-label="" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="491.39205098433274" cy="217.7151979959293" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
103
+ <circle data-type="point" data-label="" data-x="2.4994231089999994" data-y="1.4489565000000004" cx="497.10359429268146" cy="216.42097033915468" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
104
104
  </g>
105
105
  <g>
106
- <circle data-type="point" data-label="" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.55755929219254" cy="217.7151979959293" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
106
+ <circle data-type="point" data-label="" data-x="-3.5005768910000006" data-y="1.4489565000000004" cx="71.9568626609827" cy="216.42097033915468" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
107
107
  </g>
108
108
  <g>
109
- <circle data-type="point" data-label="" data-x="-3.7005768910000008" data-y="-1.5510434999999996" cx="57.56307623578783" cy="427.63244384199936" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
109
+ <circle data-type="point" data-label="" data-x="-3.7005768910000008" data-y="-1.5510434999999996" cx="57.78530493992605" cy="428.9943361550041" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
110
110
  </g>
111
111
  <g>
112
- <circle data-type="point" data-label="" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="351.527953333535" cy="217.7459158862381" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
112
+ <circle data-type="point" data-label="" data-x="0.5005768910000006" data-y="1.4485175000000003" cx="355.4697715231679" cy="216.4520769083524" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
113
113
  </g>
114
114
  <g>
115
- <circle data-type="point" data-label="" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="141.6107074874649" cy="427.6631617323082" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
115
+ <circle data-type="point" data-label="" data-x="-2.4994231089999994" data-y="-1.5514824999999997" cx="142.8964057073185" cy="429.0254427242018" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
116
116
  </g>
117
117
  <g>
118
- <circle data-type="point" data-label="" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="561.4451991796051" cy="427.6631617323082" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
118
+ <circle data-type="point" data-label="" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="568.0431373390173" cy="429.0254427242018" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
119
119
  </g>
120
120
  <g>
121
- <circle data-type="point" data-label="" data-x="3.7760768910000007" data-y="1.4485175000000003" cx="580.7225995898025" cy="217.7459158862381" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
121
+ <circle data-type="point" data-label="" data-x="3.7005768910000008" data-y="1.4485175000000003" cx="582.214695060074" cy="216.4520769083524" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
122
122
  </g>
123
123
  <g>
124
- <circle data-type="point" data-label="" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="351.527953333535" cy="427.6631617323082" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
124
+ <circle data-type="point" data-label="" data-x="0.5005768910000006" data-y="-1.5514824999999997" cx="355.4697715231679" cy="429.0254427242018" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
125
125
  </g>
126
126
  <g>
127
- <polyline data-points="-3.5005768910000006,1.4489565000000004 -0.5005768910000006,1.4489565000000004" data-type="line" data-label="" points="71.55755929219254,217.7151979959293 281.47480513826264,217.7151979959293" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
127
+ <polyline data-points="-3.5005768910000006,1.4489565000000004 -0.5005768910000006,1.4489565000000004" data-type="line" data-label="" points="71.9568626609827,216.42097033915468 284.5302284768321,216.42097033915468" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
128
128
  </g>
129
129
  <g>
130
- <polyline data-points="-3.5005768910000006,1.4489565000000004 2.4994231089999994,1.4489565000000004" data-type="line" data-label="" points="71.55755929219254,217.7151979959293 491.39205098433274,217.7151979959293" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
130
+ <polyline data-points="-3.5005768910000006,1.4489565000000004 2.4994231089999994,1.4489565000000004" data-type="line" data-label="" points="71.9568626609827,216.42097033915468 497.10359429268146,216.42097033915468" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
131
131
  </g>
132
132
  <g>
133
- <polyline data-points="-0.5005768910000006,1.4489565000000004 2.4994231089999994,1.4489565000000004" data-type="line" data-label="" points="281.47480513826264,217.7151979959293 491.39205098433274,217.7151979959293" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
133
+ <polyline data-points="-0.5005768910000006,1.4489565000000004 2.4994231089999994,1.4489565000000004" data-type="line" data-label="" points="284.5302284768321,216.42097033915468 497.10359429268146,216.42097033915468" fill="none" stroke="hsl(340, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
134
134
  </g>
135
135
  <g>
136
- <polyline data-points="-3.5005768910000006,1.4489565000000004 -3.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.55755929219254,217.7151979959293 71.55755929219254,427.63244384199936" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
136
+ <polyline data-points="-3.5005768910000006,1.4489565000000004 -3.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.9568626609827,216.42097033915468 71.9568626609827,428.9943361550041" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
137
137
  </g>
138
138
  <g>
139
- <polyline data-points="-3.5005768910000006,1.4489565000000004 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.55755929219254,217.7151979959293 281.47480513826264,427.63244384199936" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
139
+ <polyline data-points="-3.5005768910000006,1.4489565000000004 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.9568626609827,216.42097033915468 284.5302284768321,428.9943361550041" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
140
140
  </g>
141
141
  <g>
142
- <polyline data-points="-3.5005768910000006,-1.5510434999999996 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.55755929219254,427.63244384199936 281.47480513826264,427.63244384199936" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
142
+ <polyline data-points="-3.5005768910000006,-1.5510434999999996 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.9568626609827,428.9943361550041 284.5302284768321,428.9943361550041" fill="none" stroke="hsl(341, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
143
143
  </g>
144
144
  <g>
145
- <polyline data-points="0.5005768910000006,1.4485175000000003 -2.4994231089999994,-1.5514824999999997" data-type="line" data-label="" points="351.527953333535,217.7459158862381 141.6107074874649,427.6631617323082" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
145
+ <polyline data-points="0.5005768910000006,1.4485175000000003 -2.4994231089999994,-1.5514824999999997" data-type="line" data-label="" points="355.4697715231679,216.4520769083524 142.8964057073185,429.0254427242018" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
146
146
  </g>
147
147
  <g>
148
- <polyline data-points="0.5005768910000006,1.4485175000000003 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="351.527953333535,217.7459158862381 561.4451991796051,427.6631617323082" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
148
+ <polyline data-points="0.5005768910000006,1.4485175000000003 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="355.4697715231679,216.4520769083524 568.0431373390173,429.0254427242018" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
149
149
  </g>
150
150
  <g>
151
- <polyline data-points="-2.4994231089999994,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="141.6107074874649,427.6631617323082 561.4451991796051,427.6631617323082" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
151
+ <polyline data-points="-2.4994231089999994,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="142.8964057073185,429.0254427242018 568.0431373390173,429.0254427242018" fill="none" stroke="hsl(342, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
152
152
  </g>
153
153
  <g>
154
- <polyline data-points="3.5005768910000006,1.4485175000000003 0.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="561.4451991796051,217.7459158862381 351.527953333535,427.6631617323082" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
154
+ <polyline data-points="3.5005768910000006,1.4485175000000003 0.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="568.0431373390173,216.4520769083524 355.4697715231679,429.0254427242018" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
155
155
  </g>
156
156
  <g>
157
- <polyline data-points="3.5005768910000006,1.4485175000000003 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="561.4451991796051,217.7459158862381 561.4451991796051,427.6631617323082" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
157
+ <polyline data-points="3.5005768910000006,1.4485175000000003 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="568.0431373390173,216.4520769083524 568.0431373390173,429.0254427242018" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
158
158
  </g>
159
159
  <g>
160
- <polyline data-points="0.5005768910000006,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="351.527953333535,427.6631617323082 561.4451991796051,427.6631617323082" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
160
+ <polyline data-points="0.5005768910000006,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="355.4697715231679,429.0254427242018 568.0431373390173,429.0254427242018" fill="none" stroke="hsl(343, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
161
161
  </g>
162
162
  <g>
163
- <polyline data-points="-3.5005768910000006,1.4489565000000004 -3.7005768910000008,1.4489565000000004 -3.7005768910000008,1.0753815000000009 -0.7005768910000008,1.0753815000000009 -0.7005768910000008,1.4489565000000004 -0.5005768910000006,1.4489565000000004" data-type="line" data-label="" points="71.55755929219254,217.7151979959293 57.56307623578783,217.7151979959293 57.56307623578783,243.85514303491112 267.48032208185793,243.85514303491112 267.48032208185793,217.7151979959293 281.47480513826264,217.7151979959293" fill="none" stroke="purple" stroke-width="1" />
163
+ <polyline data-points="-3.5005768910000006,1.4489565000000004 -3.7005768910000008,1.4489565000000004 -3.7005768910000008,1.0753815000000009 -0.7005768910000008,1.0753815000000009 -0.7005768910000008,1.4489565000000004 -0.5005768910000006,1.4489565000000004" data-type="line" data-label="" points="71.9568626609827,216.42097033915468 57.78530493992605,216.42097033915468 57.78530493992605,242.8916687173733 270.35867075577545,242.8916687173733 270.35867075577545,216.42097033915468 284.5302284768321,216.42097033915468" fill="none" stroke="purple" stroke-width="1" />
164
164
  </g>
165
165
  <g>
166
- <polyline data-points="-3.5005768910000006,-1.5510434999999996 -3.7005768910000008,-1.5510434999999996 -3.7005768910000008,-1.9246184999999991 -0.7005768910000008,-1.9246184999999991 -0.7005768910000008,-1.5510434999999996 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.55755929219254,427.63244384199936 57.56307623578783,427.63244384199936 57.56307623578783,453.7723888809812 267.48032208185793,453.7723888809812 267.48032208185793,427.63244384199936 281.47480513826264,427.63244384199936" fill="none" stroke="purple" stroke-width="1" />
166
+ <polyline data-points="-3.5005768910000006,-1.5510434999999996 -3.7005768910000008,-1.5510434999999996 -3.7005768910000008,-1.9246184999999991 -0.7005768910000008,-1.9246184999999991 -0.7005768910000008,-1.5510434999999996 -0.5005768910000006,-1.5510434999999996" data-type="line" data-label="" points="71.9568626609827,428.9943361550041 57.78530493992605,428.9943361550041 57.78530493992605,455.4650345332227 270.35867075577545,455.4650345332227 270.35867075577545,428.9943361550041 284.5302284768321,428.9943361550041" fill="none" stroke="purple" stroke-width="1" />
167
167
  </g>
168
168
  <g>
169
- <polyline data-points="3.5005768910000006,1.4485175000000003 4.051576891000001,1.4485175000000003 4.051576891000001,-1.7514824999999998 3.7005768910000008,-1.7514824999999998 3.7005768910000008,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="561.4451991796051,217.7459158862381 600,217.7459158862381 600,441.6576447887129 575.4396822360097,441.6576447887129 575.4396822360097,427.6631617323082 561.4451991796051,427.6631617323082" fill="none" stroke="purple" stroke-width="1" />
169
+ <polyline data-points="3.5005768910000006,1.4485175000000003 3.7005768910000008,1.4485175000000003 3.7005768910000008,-1.5514824999999997 3.5005768910000006,-1.5514824999999997" data-type="line" data-label="" points="568.0431373390173,216.4520769083524 582.214695060074,216.4520769083524 582.214695060074,429.0254427242018 568.0431373390173,429.0254427242018" fill="none" stroke="purple" stroke-width="1" />
170
170
  </g>
171
171
  <g>
172
- <rect data-type="rect" data-label="schematic_component_0" data-x="-3" data-y="1.5" x="71.55755929219254" y="198.42646205445624" width="70.05314819527237" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
172
+ <rect data-type="rect" data-label="schematic_component_0" data-x="-3" data-y="1.5" x="71.9568626609827" y="196.8881706166452" width="70.93954304633581" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
173
173
  </g>
174
174
  <g>
175
- <rect data-type="rect" data-label="schematic_component_1" data-x="0" data-y="1.5" x="281.47480513826264" y="198.42646205445624" width="70.05314819527234" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
175
+ <rect data-type="rect" data-label="schematic_component_1" data-x="0" data-y="1.5" x="284.5302284768321" y="196.8881706166452" width="70.93954304633576" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
176
176
  </g>
177
177
  <g>
178
- <rect data-type="rect" data-label="schematic_component_2" data-x="3" data-y="1.5" x="491.39205098433274" y="198.42646205445624" width="70.05314819527234" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
178
+ <rect data-type="rect" data-label="schematic_component_2" data-x="3" data-y="1.5" x="497.10359429268146" y="196.8881706166452" width="70.93954304633587" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
179
179
  </g>
180
180
  <g>
181
- <rect data-type="rect" data-label="schematic_component_3" data-x="-3" data-y="-1.5" x="71.55755929219254" y="408.34370790052634" width="70.05314819527237" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
181
+ <rect data-type="rect" data-label="schematic_component_3" data-x="-3" data-y="-1.5" x="71.9568626609827" y="409.4615364324946" width="70.93954304633581" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
182
182
  </g>
183
183
  <g>
184
- <rect data-type="rect" data-label="schematic_component_4" data-x="0" data-y="-1.5" x="281.47480513826264" y="408.34370790052634" width="70.05314819527234" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
184
+ <rect data-type="rect" data-label="schematic_component_4" data-x="0" data-y="-1.5" x="284.5302284768321" y="409.4615364324946" width="70.93954304633576" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
185
185
  </g>
186
186
  <g>
187
- <rect data-type="rect" data-label="schematic_component_5" data-x="3" data-y="-1.5" x="491.39205098433274" y="408.34370790052634" width="70.05314819527234" height="31.43419792405024" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014291346039285717" />
187
+ <rect data-type="rect" data-label="schematic_component_5" data-x="3" data-y="-1.5" x="497.10359429268146" y="409.4615364324946" width="70.93954304633587" height="31.831940379671494" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.014112774610714288" />
188
188
  </g>
189
189
  <g>
190
- <rect data-type="rect" data-label="" data-x="-3.7005768910000008" data-y="1.6739565000000005" x="50.56583470758551" y="186.22761111901877" width="13.994483056404675" height="31.487586876910513" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
190
+ <rect data-type="rect" data-label="" data-x="-3.7005768910000008" data-y="1.6739565000000005" x="50.69952607939774" y="184.53496546677727" width="14.171557721056644" height="31.886004872377413" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
191
191
  </g>
192
192
  <g>
193
- <rect data-type="rect" data-label="" data-x="2.2734231089999994" data-y="1.4489565000000004" x="459.8344916921402" y="210.71795646772694" width="31.487586876910484" height="13.994483056404704" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
193
+ <rect data-type="rect" data-label="" data-x="2.2734231089999994" data-y="1.4489565000000004" x="465.1467316316988" y="209.33519147862637" width="31.88600487237744" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
194
194
  </g>
195
195
  <g>
196
- <rect data-type="rect" data-label="" data-x="-3.7265768910000006" data-y="1.4489565000000004" x="40" y="210.71795646772694" width="31.487586876910513" height="13.994483056404704" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
196
+ <rect data-type="rect" data-label="" data-x="-3.7265768910000006" data-y="1.4489565000000004" x="40" y="209.33519147862637" width="31.88600487237744" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
197
197
  </g>
198
198
  <g>
199
- <rect data-type="rect" data-label="" data-x="-3.7005768910000008" data-y="-1.3260434999999995" x="50.56583470758551" y="396.1448569650889" width="13.994483056404675" height="31.487586876910484" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
199
+ <rect data-type="rect" data-label="" data-x="-3.7005768910000008" data-y="-1.3260434999999995" x="50.69952607939774" y="397.10833128262664" width="14.171557721056644" height="31.88600487237744" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
200
200
  </g>
201
201
  <g>
202
- <rect data-type="rect" data-label="" data-x="0.7265768910000006" data-y="1.4485175000000003" x="351.59792574881703" y="210.74867435803577" width="31.487586876910484" height="13.994483056404675" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
202
+ <rect data-type="rect" data-label="" data-x="0.7265768910000006" data-y="1.4485175000000003" x="355.54062931177316" y="209.3662980478241" width="31.88600487237744" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
203
203
  </g>
204
204
  <g>
205
- <rect data-type="rect" data-label="" data-x="-2.2734231089999994" data-y="-1.5514824999999997" x="141.68067990274693" y="420.6659202041059" width="31.487586876910513" height="13.994483056404647" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
205
+ <rect data-type="rect" data-label="" data-x="-2.2734231089999994" data-y="-1.5514824999999997" x="142.96726349592376" y="421.9396638636735" width="31.88600487237744" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
206
206
  </g>
207
207
  <g>
208
- <rect data-type="rect" data-label="" data-x="3.7265768910000006" data-y="-1.5514824999999997" x="561.5151715948871" y="420.6659202041059" width="31.48758687691054" height="13.994483056404647" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
208
+ <rect data-type="rect" data-label="" data-x="3.7265768910000006" data-y="-1.5514824999999997" x="568.1139951276225" y="421.9396638636735" width="31.886004872377498" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
209
209
  </g>
210
210
  <g>
211
- <rect data-type="rect" data-label="" data-x="3.7760768910000007" data-y="1.6735175000000004" x="573.7253580616002" y="186.25832900932758" width="13.994483056404647" height="31.487586876910513" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
211
+ <rect data-type="rect" data-label="" data-x="3.7005768910000008" data-y="1.6735175000000004" x="575.1289161995456" y="184.566072035975" width="14.171557721056615" height="31.886004872377413" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
212
212
  </g>
213
213
  <g>
214
- <rect data-type="rect" data-label="" data-x="0.7265768910000006" data-y="-1.5514824999999997" x="351.59792574881703" y="420.6659202041059" width="31.487586876910484" height="13.994483056404647" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014291346039285717" />
214
+ <rect data-type="rect" data-label="" data-x="0.7265768910000006" data-y="-1.5514824999999997" x="355.54062931177316" y="421.9396638636735" width="31.88600487237744" height="14.171557721056615" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.014112774610714288" />
215
215
  </g>
216
216
  <g id="crosshair" style="display: none">
217
217
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -241,12 +241,12 @@ x+" data-x="3.5005768910000006" data-y="-1.5514824999999997" cx="561.44519917960
241
241
 
242
242
  // Calculate real coordinates using inverse transformation
243
243
  const matrix = {
244
- "a": 69.97241528202336,
244
+ "a": 70.85778860528313,
245
245
  "c": 0,
246
- "e": 316.5013792358988,
246
+ "e": 320,
247
247
  "b": 0,
248
- "d": -69.97241528202336,
249
- "f": 319.1021839395164
248
+ "d": -70.85778860528313,
249
+ "f": 319.09082371440564
250
250
  };
251
251
  // Manually invert and apply the affine transform
252
252
  // Since we only use translate and scale, we can directly compute:
@@ -54,7 +54,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
54
54
  <circle data-type="point" data-label="" data-x="1.3" data-y="0.09999999999999998" cx="320" cy="423.88000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
55
55
  </g>
56
56
  <g>
57
- <circle data-type="point" data-label="" data-x="0.9490000000000001" data-y="2.105" cx="280.68800000000005" cy="199.32000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
57
+ <circle data-type="point" data-label="" data-x="0.749" data-y="2.105" cx="258.288" cy="199.32000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
58
58
  </g>
59
59
  <g>
60
60
  <polyline data-points="1.2000000000000002,-0.30000000000000004 1.6,1.7049999999999998" data-type="line" data-label="" points="308.80000000000007,468.68000000000006 353.6,244.12000000000006" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
@@ -69,7 +69,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
69
69
  <polyline data-points="1.2000000000000002,0.09999999999999998 1.3,0.09999999999999998 1.3,1.5049999999999997 1.049,1.5049999999999997 1.049,1.905 1.6,1.9049999999999998" data-type="line" data-label="" points="308.80000000000007,423.88000000000005 320,423.88000000000005 320,266.5200000000001 291.88800000000003,266.5200000000001 291.88800000000003,221.72000000000003 353.6,221.72000000000006" fill="none" stroke="purple" stroke-width="1" />
70
70
  </g>
71
71
  <g>
72
- <polyline data-points="1.2000000000000002,0.30000000000000004 1.5000000000000002,0.30000000000000004 1.5000000000000002,1.4049999999999998 0.9490000000000001,1.4049999999999998 0.9490000000000001,2.105 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 342.4000000000001,401.48 342.4000000000001,277.72 280.68800000000005,277.72 280.68800000000005,199.32000000000005 353.6,199.32000000000005" fill="none" stroke="purple" stroke-width="1" />
72
+ <polyline data-points="1.2000000000000002,0.30000000000000004 1.5000000000000002,0.30000000000000004 1.5000000000000002,1.2049999999999996 0.749,1.2049999999999996 0.749,2.105 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 342.4000000000001,401.48 342.4000000000001,300.1200000000001 258.288,300.1200000000001 258.288,199.32000000000005 353.6,199.32000000000005" fill="none" stroke="purple" stroke-width="1" />
73
73
  </g>
74
74
  <g>
75
75
  <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="379.08000000000004" width="268.80000000000007" height="112" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008928571428571428" />
@@ -87,7 +87,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
87
87
  <rect data-type="rect" data-label="" data-x="1.5250000000000001" data-y="0.09999999999999998" x="320" y="412.68000000000006" width="50.40000000000009" height="22.399999999999977" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
88
88
  </g>
89
89
  <g>
90
- <rect data-type="rect" data-label="" data-x="0.9490000000000001" data-y="2.33" x="269.48800000000006" y="148.92000000000002" width="22.399999999999977" height="50.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
90
+ <rect data-type="rect" data-label="" data-x="0.749" data-y="2.33" x="247.08800000000002" y="148.92000000000002" width="22.400000000000034" height="50.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
91
91
  </g>
92
92
  <g id="crosshair" style="display: none">
93
93
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />