@jbrowse/plugin-circular-view 1.7.10 → 2.0.1

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 (98) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +2 -7
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +18 -48
  3. package/dist/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  4. package/dist/BaseChordDisplay/components/DisplayError.d.ts +9 -4
  5. package/dist/BaseChordDisplay/components/DisplayError.js +24 -67
  6. package/dist/BaseChordDisplay/components/DisplayError.js.map +1 -0
  7. package/dist/BaseChordDisplay/components/Loading.d.ts +2 -3
  8. package/dist/BaseChordDisplay/components/Loading.js +98 -112
  9. package/dist/BaseChordDisplay/components/Loading.js.map +1 -0
  10. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +3 -3
  11. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +80 -91
  12. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  13. package/dist/BaseChordDisplay/index.d.ts +1 -1
  14. package/dist/BaseChordDisplay/index.js +12 -30
  15. package/dist/BaseChordDisplay/index.js.map +1 -0
  16. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +10 -10
  17. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +204 -232
  18. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  19. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +12 -18
  20. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  21. package/dist/BaseChordDisplay/models/renderReaction.js +115 -138
  22. package/dist/BaseChordDisplay/models/renderReaction.js.map +1 -0
  23. package/dist/CircularView/components/CircularView.js +111 -185
  24. package/dist/CircularView/components/CircularView.js.map +1 -0
  25. package/dist/CircularView/components/ImportForm.js +77 -92
  26. package/dist/CircularView/components/ImportForm.js.map +1 -0
  27. package/dist/CircularView/components/Ruler.js +148 -194
  28. package/dist/CircularView/components/Ruler.js.map +1 -0
  29. package/dist/CircularView/models/CircularView.d.ts +3 -3
  30. package/dist/CircularView/models/CircularView.js +346 -409
  31. package/dist/CircularView/models/CircularView.js.map +1 -0
  32. package/dist/CircularView/models/slices.js +90 -104
  33. package/dist/CircularView/models/slices.js.map +1 -0
  34. package/dist/CircularView/models/viewportVisibleRegion.js +229 -264
  35. package/dist/CircularView/models/viewportVisibleRegion.js.map +1 -0
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.js +147 -176
  38. package/dist/index.js.map +1 -0
  39. package/esm/BaseChordDisplay/components/BaseChordDisplay.d.ts +4 -0
  40. package/esm/BaseChordDisplay/components/BaseChordDisplay.js +17 -0
  41. package/esm/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  42. package/esm/BaseChordDisplay/components/DisplayError.d.ts +9 -0
  43. package/esm/BaseChordDisplay/components/DisplayError.js +21 -0
  44. package/esm/BaseChordDisplay/components/DisplayError.js.map +1 -0
  45. package/esm/BaseChordDisplay/components/Loading.d.ts +9 -0
  46. package/esm/BaseChordDisplay/components/Loading.js +66 -0
  47. package/esm/BaseChordDisplay/components/Loading.js.map +1 -0
  48. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -0
  49. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js +48 -0
  50. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  51. package/esm/BaseChordDisplay/index.d.ts +3 -0
  52. package/esm/BaseChordDisplay/index.js +4 -0
  53. package/esm/BaseChordDisplay/index.js.map +1 -0
  54. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -0
  55. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js +181 -0
  56. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  57. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -0
  58. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js +11 -0
  59. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  60. package/esm/BaseChordDisplay/models/renderReaction.d.ts +30 -0
  61. package/esm/BaseChordDisplay/models/renderReaction.js +52 -0
  62. package/esm/BaseChordDisplay/models/renderReaction.js.map +1 -0
  63. package/esm/CircularView/components/CircularView.d.ts +4 -0
  64. package/esm/CircularView/components/CircularView.js +121 -0
  65. package/esm/CircularView/components/CircularView.js.map +1 -0
  66. package/esm/CircularView/components/ImportForm.d.ts +5 -0
  67. package/esm/CircularView/components/ImportForm.js +40 -0
  68. package/esm/CircularView/components/ImportForm.js.map +1 -0
  69. package/esm/CircularView/components/Ruler.d.ts +5 -0
  70. package/esm/CircularView/components/Ruler.js +126 -0
  71. package/esm/CircularView/components/Ruler.js.map +1 -0
  72. package/esm/CircularView/models/CircularView.d.ts +97 -0
  73. package/esm/CircularView/models/CircularView.js +317 -0
  74. package/esm/CircularView/models/CircularView.js.map +1 -0
  75. package/esm/CircularView/models/slices.d.ts +27 -0
  76. package/esm/CircularView/models/slices.js +53 -0
  77. package/esm/CircularView/models/slices.js.map +1 -0
  78. package/esm/CircularView/models/viewportVisibleRegion.d.ts +6 -0
  79. package/esm/CircularView/models/viewportVisibleRegion.js +223 -0
  80. package/esm/CircularView/models/viewportVisibleRegion.js.map +1 -0
  81. package/esm/index.d.ts +10 -0
  82. package/esm/index.js +49 -0
  83. package/esm/index.js.map +1 -0
  84. package/package.json +20 -12
  85. package/src/BaseChordDisplay/components/BaseChordDisplay.tsx +13 -25
  86. package/src/BaseChordDisplay/components/DisplayError.js +64 -66
  87. package/src/BaseChordDisplay/components/Loading.tsx +104 -107
  88. package/src/BaseChordDisplay/components/RpcRenderedSvgGroup.js +44 -51
  89. package/src/BaseChordDisplay/index.ts +1 -1
  90. package/src/BaseChordDisplay/models/BaseChordDisplayModel.ts +2 -1
  91. package/src/CircularView/components/CircularView.js +17 -16
  92. package/src/CircularView/components/ImportForm.tsx +5 -5
  93. package/src/CircularView/components/Ruler.js +4 -3
  94. package/src/CircularView/models/CircularView.ts +29 -42
  95. package/src/CircularView/models/slices.ts +2 -7
  96. package/src/index.ts +5 -2
  97. package/dist/CircularView/models/slices.test.js +0 -83
  98. package/dist/CircularView/models/viewportVisibleRegion.test.js +0 -130
@@ -1,280 +1,245 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.cartesianToPolar = cartesianToPolar;
9
- exports.thetaRangesOverlap = thetaRangesOverlap;
10
- exports.viewportVisibleSection = viewportVisibleSection;
11
-
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.viewportVisibleSection = exports.thetaRangesOverlap = exports.cartesianToPolar = void 0;
14
20
  function findCircleIntersectionX(y, cx, cy, r, resultArray) {
15
- var d = Math.abs(y - cy);
16
-
17
- if (d > r) {
18
- return;
19
- }
20
-
21
- if (d === r) {
22
- resultArray.push([cx, y]);
23
- }
24
-
25
- var solution = Math.sqrt(r * r - d * d);
26
- resultArray.push([cx - solution, y]);
27
- resultArray.push([cx + solution, y]);
21
+ var d = Math.abs(y - cy);
22
+ if (d > r) {
23
+ return;
24
+ }
25
+ if (d === r) {
26
+ resultArray.push([cx, y]);
27
+ }
28
+ var solution = Math.sqrt(r * r - d * d);
29
+ resultArray.push([cx - solution, y]);
30
+ resultArray.push([cx + solution, y]);
28
31
  }
29
-
30
32
  function findCircleIntersectionY(x, cx, cy, r, resultArray) {
31
- var d = Math.abs(x - cx);
32
-
33
- if (d > r) {
34
- return;
35
- }
36
-
37
- if (d === r) {
38
- resultArray.push([x, cy]);
39
- }
40
-
41
- var solution = Math.sqrt(r * r - d * d);
42
- resultArray.push([x, cy - solution]);
43
- resultArray.push([x, cy + solution]);
33
+ var d = Math.abs(x - cx);
34
+ if (d > r) {
35
+ return;
36
+ }
37
+ if (d === r) {
38
+ resultArray.push([x, cy]);
39
+ }
40
+ var solution = Math.sqrt(r * r - d * d);
41
+ resultArray.push([x, cy - solution]);
42
+ resultArray.push([x, cy + solution]);
44
43
  }
45
-
46
44
  function cartesianToTheta(x, y) {
47
- var theta = (Math.atan(y / x) + 2 * Math.PI) % (2 * Math.PI);
48
-
49
- if (x < 0) {
50
- if (y <= 0) {
51
- theta += Math.PI;
52
- } else {
53
- theta -= Math.PI;
45
+ var theta = (Math.atan(y / x) + 2 * Math.PI) % (2 * Math.PI);
46
+ if (x < 0) {
47
+ if (y <= 0) {
48
+ theta += Math.PI;
49
+ }
50
+ else {
51
+ theta -= Math.PI;
52
+ }
54
53
  }
55
- }
56
-
57
- return theta;
54
+ return theta;
58
55
  }
59
-
60
56
  function cartesianToPolar(x, y) {
61
- var rho = Math.sqrt(x * x + y * y);
62
-
63
- if (rho === 0) {
64
- return [0, 0];
65
- }
66
-
67
- var theta = cartesianToTheta(x, y);
68
- return [rho, theta];
57
+ var rho = Math.sqrt(x * x + y * y);
58
+ if (rho === 0) {
59
+ return [0, 0];
60
+ }
61
+ var theta = cartesianToTheta(x, y);
62
+ return [rho, theta];
69
63
  }
70
-
64
+ exports.cartesianToPolar = cartesianToPolar;
71
65
  var twoPi = 2 * Math.PI;
72
-
73
66
  function thetaRangesOverlap(r1start, r1length, r2start, r2length) {
74
- if (r1length <= 0 || r2length <= 0) {
75
- return false;
76
- }
77
-
78
- if (r1length + 0.0001 >= twoPi || r2length + 0.0001 >= twoPi) {
79
- return true;
80
- } // put both range starts between 2π and 4π
81
-
82
-
83
- r1start = (r1start % twoPi + twoPi) % twoPi + twoPi;
84
- r2start = (r2start % twoPi + twoPi) % twoPi + twoPi;
85
-
86
- if (r1start < r2start + r2length && r1start + r1length > r2start) {
87
- return true;
88
- } // move r2 2π to the left and check
89
-
90
-
91
- r2start -= twoPi;
92
-
93
- if (r1start < r2start + r2length && r1start + r1length > r2start) {
94
- return true;
95
- } // move it 2π to the right and check
96
-
97
-
98
- r2start += twoPi + twoPi;
99
- return r1start < r2start + r2length && r1start + r1length > r2start;
100
- } // return which arc range has any part of the circle visible in the viewport
101
-
102
-
103
- function viewportVisibleSection(viewSides, circleCenter, circleRadius) {
104
- var _viewSides = (0, _slicedToArray2.default)(viewSides, 4),
105
- viewL = _viewSides[0],
106
- viewR = _viewSides[1],
107
- viewT = _viewSides[2],
108
- viewB = _viewSides[3];
109
-
110
- var _circleCenter = (0, _slicedToArray2.default)(circleCenter, 2),
111
- cx = _circleCenter[0],
112
- cy = _circleCenter[1]; // transform coordinate system to center of circle
113
-
114
-
115
- viewL -= cx;
116
- viewR -= cx;
117
- viewT -= cy;
118
- viewB -= cy;
119
- var centerIsInsideViewport = viewL < 0 && viewR > 0 && viewT < 0 && viewB > 0;
120
-
121
- if (centerIsInsideViewport) {
122
- var _vertices = [[viewL, viewT], [viewR, viewT], [viewL, viewB], [viewR, viewB]];
123
- var maxRho = -Infinity;
124
-
125
- for (var i = 0; i < _vertices.length; i += 1) {
126
- var _vertices$i = (0, _slicedToArray2.default)(_vertices[i], 2),
127
- x = _vertices$i[0],
128
- y = _vertices$i[1];
129
-
130
- var rho = Math.sqrt(x * x + y * y);
131
-
132
- if (rho > maxRho) {
133
- maxRho = rho;
134
- }
67
+ if (r1length <= 0 || r2length <= 0) {
68
+ return false;
135
69
  }
136
-
137
- return {
138
- rho: [0, Math.min(circleRadius, maxRho)],
139
- theta: [0, 2 * Math.PI]
140
- };
141
- } // const viewportCompletelyContainsCircle =
142
- // circleCenter[0] - viewL >= circleRadius &&
143
- // viewR - circleCenter[0] >= circleRadius &&
144
- // circleCenter[1] - viewT >= circleRadius &&
145
- // viewB - circleCenter[1] >= circleRadius
146
- // if (viewportCompletelyContainsCircle) {
147
- // return [0, 2 * Math.PI]
148
- // }
149
- // const distToCenterSquared = ([x, y]) => {
150
- // const [cx, cy] = circleCenter
151
- // const sq = n => n * n
152
- // return sq(x - cx) + sq(y - cy)
153
- // }
154
- // const circleRadiusSquared = circleRadius * circleRadius
155
- // const tlInside = distToCenterSquared([viewL, viewT]) <= circleRadiusSquared
156
- // const trInside = distToCenterSquared([viewR, viewT]) <= circleRadiusSquared
157
- // const blInside = distToCenterSquared([viewL, viewB]) <= circleRadiusSquared
158
- // const brInside = distToCenterSquared([viewR, viewB]) <= circleRadiusSquared
159
- // const noIntersection = !tlInside && !trInside && !blInside && !brInside
160
- // if (noIntersection) return undefined
161
- // const circleCompletelyContainsViewport =
162
- // tlInside && trInside && blInside && brInside
163
- // if (circleCompletelyContainsViewport) {
164
- // // viewport is in the circle, but the center is not in it, so take max
165
- // // and min of thetas to the center
166
- // const thetas = [
167
- // Math.atan(viewT / viewL),
168
- // Math.atan(viewT / viewR),
169
- // Math.atan(viewB / viewL),
170
- // Math.atan(viewB / viewR),
171
- // ]
172
- // return [Math.min(...thetas), Math.max(...thetas)]
173
- // }
174
- // if we get here, the viewport is partly in, partly out of the circle
175
- // const viewLIntersects = Math.abs(viewL - circleCenter[0]) <= circleRadius
176
- // const viewRIntersects = Math.abs(viewR - circleCenter[0]) <= circleRadius
177
- // const viewTIntersects = Math.abs(viewT - circleCenter[1]) <= circleRadius
178
- // const viewBIntersects = Math.abs(viewB - circleCenter[1]) <= circleRadius
179
- // const numIntersectingSides =
180
- // Number(viewLIntersects) +
181
- // Number(viewRIntersects) +
182
- // Number(viewTIntersects) +
183
- // Number(viewBIntersects)
184
- // if (numIntersectingSides === 4) return [0, 2 * Math.PI]
185
- // if (numIntersectingSides === 3) {
186
- // // TODO calculate the thetas of the
187
- // } else if (numIntersectingSides === 2) {
188
- // // TODO calculate the thetas of the 2 intersection points
189
- // } else if (numIntersectingSides === 1) {
190
- // // TODO calculate the thetas of the 1-2 intersection points of the line, and the angle between
191
- // }
192
- // make a list of vertices-of-interest that lie inside both shapes to examine
193
- // to determine the range covered by their intersection
194
- // transform coordinates to have the circle as the origin and find the intersections
195
- // of the circle and the view rectangle
196
-
197
-
198
- var vertices = [[viewL, viewT], [viewR, viewT], [viewL, viewB], [viewR, viewB]];
199
- findCircleIntersectionY(viewL, 0, 0, circleRadius, vertices);
200
- findCircleIntersectionY(viewR, 0, 0, circleRadius, vertices);
201
- findCircleIntersectionX(viewT, 0, 0, circleRadius, vertices);
202
- findCircleIntersectionX(viewB, 0, 0, circleRadius, vertices); // for each edge, also look at the closest point to center if it is inside the circle
203
-
204
- if (-viewL < circleRadius) {
205
- vertices.push([viewL, 0]);
206
- }
207
-
208
- if (viewR < circleRadius) {
209
- vertices.push([viewR, 0]);
210
- }
211
-
212
- if (-viewT < circleRadius) {
213
- vertices.push([0, viewT]);
214
- }
215
-
216
- if (viewB < circleRadius) {
217
- vertices.push([0, viewB]);
218
- } // const verticesOriginal = vertices.map(([x, y]) => [x + cx, y + cy])
219
- // now convert them all to polar and take the max and min of rho and theta
220
- // const viewportCenterTheta = cartesianToTheta(viewR + viewL, viewT + viewB)
221
-
222
-
223
- var reflect = viewL >= 0 ? -1 : 1; // viewportCenterTheta < Math.PI / 2 || viewportCenterTheta > 1.5 * Math.PI
224
- // ? -1
225
- // : 1
226
-
227
- var rhoMin = Infinity;
228
- var rhoMax = -Infinity;
229
- var thetaMin = Infinity;
230
- var thetaMax = -Infinity;
231
-
232
- for (var _i = 0; _i < vertices.length; _i += 1) {
233
- // ignore vertex if outside the viewport
234
- var _vertices$_i = (0, _slicedToArray2.default)(vertices[_i], 2),
235
- vx = _vertices$_i[0],
236
- vy = _vertices$_i[1];
237
-
238
- if (vx >= viewL && vx <= viewR && vy >= viewT && vy <= viewB) {
239
- var _cartesianToPolar = cartesianToPolar(vx * reflect, vy * reflect),
240
- _cartesianToPolar2 = (0, _slicedToArray2.default)(_cartesianToPolar, 2),
241
- _rho = _cartesianToPolar2[0],
242
- theta = _cartesianToPolar2[1]; // ignore vertex if outside the circle
243
-
244
-
245
- if (_rho <= circleRadius + 0.001) {
246
- // ignore theta if rho is 0
247
- if (theta < thetaMin && _rho > 0.0001) {
248
- thetaMin = theta;
249
- }
250
-
251
- if (theta > thetaMax && _rho > 0.0001) {
252
- thetaMax = theta;
253
- }
254
-
255
- if (_rho < rhoMin) {
256
- rhoMin = _rho;
70
+ if (r1length + 0.0001 >= twoPi || r2length + 0.0001 >= twoPi) {
71
+ return true;
72
+ }
73
+ // put both range starts between 2π and
74
+ r1start = (((r1start % twoPi) + twoPi) % twoPi) + twoPi;
75
+ r2start = (((r2start % twoPi) + twoPi) % twoPi) + twoPi;
76
+ if (r1start < r2start + r2length && r1start + r1length > r2start) {
77
+ return true;
78
+ }
79
+ // move r2 to the left and check
80
+ r2start -= twoPi;
81
+ if (r1start < r2start + r2length && r1start + r1length > r2start) {
82
+ return true;
83
+ }
84
+ // move it to the right and check
85
+ r2start += twoPi + twoPi;
86
+ return r1start < r2start + r2length && r1start + r1length > r2start;
87
+ }
88
+ exports.thetaRangesOverlap = thetaRangesOverlap;
89
+ // return which arc range has any part of the circle visible in the viewport
90
+ function viewportVisibleSection(viewSides, circleCenter, circleRadius) {
91
+ var _a = __read(viewSides, 4), viewL = _a[0], viewR = _a[1], viewT = _a[2], viewB = _a[3];
92
+ var _b = __read(circleCenter, 2), cx = _b[0], cy = _b[1];
93
+ // transform coordinate system to center of circle
94
+ viewL -= cx;
95
+ viewR -= cx;
96
+ viewT -= cy;
97
+ viewB -= cy;
98
+ var centerIsInsideViewport = viewL < 0 && viewR > 0 && viewT < 0 && viewB > 0;
99
+ if (centerIsInsideViewport) {
100
+ var vertices_1 = [
101
+ [viewL, viewT],
102
+ [viewR, viewT],
103
+ [viewL, viewB],
104
+ [viewR, viewB],
105
+ ];
106
+ var maxRho = -Infinity;
107
+ for (var i = 0; i < vertices_1.length; i += 1) {
108
+ var _c = __read(vertices_1[i], 2), x = _c[0], y = _c[1];
109
+ var rho = Math.sqrt(x * x + y * y);
110
+ if (rho > maxRho) {
111
+ maxRho = rho;
112
+ }
257
113
  }
258
-
259
- if (_rho > rhoMax) {
260
- rhoMax = _rho;
114
+ return {
115
+ rho: [0, Math.min(circleRadius, maxRho)],
116
+ theta: [0, 2 * Math.PI],
117
+ };
118
+ }
119
+ // const viewportCompletelyContainsCircle =
120
+ // circleCenter[0] - viewL >= circleRadius &&
121
+ // viewR - circleCenter[0] >= circleRadius &&
122
+ // circleCenter[1] - viewT >= circleRadius &&
123
+ // viewB - circleCenter[1] >= circleRadius
124
+ // if (viewportCompletelyContainsCircle) {
125
+ // return [0, 2 * Math.PI]
126
+ // }
127
+ // const distToCenterSquared = ([x, y]) => {
128
+ // const [cx, cy] = circleCenter
129
+ // const sq = n => n * n
130
+ // return sq(x - cx) + sq(y - cy)
131
+ // }
132
+ // const circleRadiusSquared = circleRadius * circleRadius
133
+ // const tlInside = distToCenterSquared([viewL, viewT]) <= circleRadiusSquared
134
+ // const trInside = distToCenterSquared([viewR, viewT]) <= circleRadiusSquared
135
+ // const blInside = distToCenterSquared([viewL, viewB]) <= circleRadiusSquared
136
+ // const brInside = distToCenterSquared([viewR, viewB]) <= circleRadiusSquared
137
+ // const noIntersection = !tlInside && !trInside && !blInside && !brInside
138
+ // if (noIntersection) return undefined
139
+ // const circleCompletelyContainsViewport =
140
+ // tlInside && trInside && blInside && brInside
141
+ // if (circleCompletelyContainsViewport) {
142
+ // // viewport is in the circle, but the center is not in it, so take max
143
+ // // and min of thetas to the center
144
+ // const thetas = [
145
+ // Math.atan(viewT / viewL),
146
+ // Math.atan(viewT / viewR),
147
+ // Math.atan(viewB / viewL),
148
+ // Math.atan(viewB / viewR),
149
+ // ]
150
+ // return [Math.min(...thetas), Math.max(...thetas)]
151
+ // }
152
+ // if we get here, the viewport is partly in, partly out of the circle
153
+ // const viewLIntersects = Math.abs(viewL - circleCenter[0]) <= circleRadius
154
+ // const viewRIntersects = Math.abs(viewR - circleCenter[0]) <= circleRadius
155
+ // const viewTIntersects = Math.abs(viewT - circleCenter[1]) <= circleRadius
156
+ // const viewBIntersects = Math.abs(viewB - circleCenter[1]) <= circleRadius
157
+ // const numIntersectingSides =
158
+ // Number(viewLIntersects) +
159
+ // Number(viewRIntersects) +
160
+ // Number(viewTIntersects) +
161
+ // Number(viewBIntersects)
162
+ // if (numIntersectingSides === 4) return [0, 2 * Math.PI]
163
+ // if (numIntersectingSides === 3) {
164
+ // // TODO calculate the thetas of the
165
+ // } else if (numIntersectingSides === 2) {
166
+ // // TODO calculate the thetas of the 2 intersection points
167
+ // } else if (numIntersectingSides === 1) {
168
+ // // TODO calculate the thetas of the 1-2 intersection points of the line, and the angle between
169
+ // }
170
+ // make a list of vertices-of-interest that lie inside both shapes to examine
171
+ // to determine the range covered by their intersection
172
+ // transform coordinates to have the circle as the origin and find the intersections
173
+ // of the circle and the view rectangle
174
+ var vertices = [
175
+ [viewL, viewT],
176
+ [viewR, viewT],
177
+ [viewL, viewB],
178
+ [viewR, viewB],
179
+ ];
180
+ findCircleIntersectionY(viewL, 0, 0, circleRadius, vertices);
181
+ findCircleIntersectionY(viewR, 0, 0, circleRadius, vertices);
182
+ findCircleIntersectionX(viewT, 0, 0, circleRadius, vertices);
183
+ findCircleIntersectionX(viewB, 0, 0, circleRadius, vertices);
184
+ // for each edge, also look at the closest point to center if it is inside the circle
185
+ if (-viewL < circleRadius) {
186
+ vertices.push([viewL, 0]);
187
+ }
188
+ if (viewR < circleRadius) {
189
+ vertices.push([viewR, 0]);
190
+ }
191
+ if (-viewT < circleRadius) {
192
+ vertices.push([0, viewT]);
193
+ }
194
+ if (viewB < circleRadius) {
195
+ vertices.push([0, viewB]);
196
+ }
197
+ // const verticesOriginal = vertices.map(([x, y]) => [x + cx, y + cy])
198
+ // now convert them all to polar and take the max and min of rho and theta
199
+ // const viewportCenterTheta = cartesianToTheta(viewR + viewL, viewT + viewB)
200
+ var reflect = viewL >= 0 ? -1 : 1;
201
+ // viewportCenterTheta < Math.PI / 2 || viewportCenterTheta > 1.5 * Math.PI
202
+ // ? -1
203
+ // : 1
204
+ var rhoMin = Infinity;
205
+ var rhoMax = -Infinity;
206
+ var thetaMin = Infinity;
207
+ var thetaMax = -Infinity;
208
+ for (var i = 0; i < vertices.length; i += 1) {
209
+ // ignore vertex if outside the viewport
210
+ var _d = __read(vertices[i], 2), vx = _d[0], vy = _d[1];
211
+ if (vx >= viewL && vx <= viewR && vy >= viewT && vy <= viewB) {
212
+ var _e = __read(cartesianToPolar(vx * reflect, vy * reflect), 2), rho = _e[0], theta = _e[1];
213
+ // ignore vertex if outside the circle
214
+ if (rho <= circleRadius + 0.001) {
215
+ // ignore theta if rho is 0
216
+ if (theta < thetaMin && rho > 0.0001) {
217
+ thetaMin = theta;
218
+ }
219
+ if (theta > thetaMax && rho > 0.0001) {
220
+ thetaMax = theta;
221
+ }
222
+ if (rho < rhoMin) {
223
+ rhoMin = rho;
224
+ }
225
+ if (rho > rhoMax) {
226
+ rhoMax = rho;
227
+ }
228
+ }
261
229
  }
262
- }
263
230
  }
264
- }
265
-
266
- if (reflect === -1) {
267
- thetaMin += Math.PI;
268
- thetaMax += Math.PI;
269
- }
270
-
271
- if (thetaMin > 2 * Math.PI && thetaMax > 2 * Math.PI) {
272
- thetaMin -= 2 * Math.PI;
273
- thetaMax -= 2 * Math.PI;
274
- }
275
-
276
- return {
277
- rho: [rhoMin, Math.min(circleRadius, rhoMax)],
278
- theta: [thetaMin, thetaMax]
279
- };
280
- }
231
+ if (reflect === -1) {
232
+ thetaMin += Math.PI;
233
+ thetaMax += Math.PI;
234
+ }
235
+ if (thetaMin > 2 * Math.PI && thetaMax > 2 * Math.PI) {
236
+ thetaMin -= 2 * Math.PI;
237
+ thetaMax -= 2 * Math.PI;
238
+ }
239
+ return {
240
+ rho: [rhoMin, Math.min(circleRadius, rhoMax)],
241
+ theta: [thetaMin, thetaMax],
242
+ };
243
+ }
244
+ exports.viewportVisibleSection = viewportVisibleSection;
245
+ //# sourceMappingURL=viewportVisibleRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewportVisibleRegion.js","sourceRoot":"","sources":["../../../src/CircularView/models/viewportVisibleRegion.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import PluginManager from '@jbrowse/core/PluginManager';
2
2
  import Plugin from '@jbrowse/core/Plugin';
3
+ import { CircularViewModel, CircularViewStateModel } from './CircularView/models/CircularView';
3
4
  export default class CircularViewPlugin extends Plugin {
4
5
  name: string;
5
6
  install(pluginManager: PluginManager): void;
6
7
  configure(pluginManager: PluginManager): void;
7
8
  }
8
- export { BaseChordDisplayModel, baseChordDisplayConfig, BaseChordDisplayComponentFactory, } from './BaseChordDisplay';
9
+ export { BaseChordDisplayModel, baseChordDisplayConfig, BaseChordDisplayComponent, } from './BaseChordDisplay';
10
+ export type { CircularViewModel, CircularViewStateModel };