@ccpc/math 0.1.0

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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist/constants/geom_type.d.ts +13 -0
  4. package/dist/constants/geom_type.d.ts.map +1 -0
  5. package/dist/constants/geom_type.js +17 -0
  6. package/dist/constants/math_const.d.ts +9 -0
  7. package/dist/constants/math_const.d.ts.map +1 -0
  8. package/dist/constants/math_const.js +12 -0
  9. package/dist/core/box2.d.ts +71 -0
  10. package/dist/core/box2.d.ts.map +1 -0
  11. package/dist/core/box2.js +243 -0
  12. package/dist/core/coord2d.d.ts +62 -0
  13. package/dist/core/coord2d.d.ts.map +1 -0
  14. package/dist/core/coord2d.js +155 -0
  15. package/dist/core/geom_base.d.ts +19 -0
  16. package/dist/core/geom_base.d.ts.map +1 -0
  17. package/dist/core/geom_base.js +18 -0
  18. package/dist/core/mat3.d.ts +101 -0
  19. package/dist/core/mat3.d.ts.map +1 -0
  20. package/dist/core/mat3.js +290 -0
  21. package/dist/core/vec2.d.ts +138 -0
  22. package/dist/core/vec2.d.ts.map +1 -0
  23. package/dist/core/vec2.js +297 -0
  24. package/dist/curves/arc2.d.ts +49 -0
  25. package/dist/curves/arc2.d.ts.map +1 -0
  26. package/dist/curves/arc2.js +265 -0
  27. package/dist/curves/bspline2.d.ts +150 -0
  28. package/dist/curves/bspline2.d.ts.map +1 -0
  29. package/dist/curves/bspline2.js +793 -0
  30. package/dist/curves/circle2.d.ts +42 -0
  31. package/dist/curves/circle2.d.ts.map +1 -0
  32. package/dist/curves/circle2.js +135 -0
  33. package/dist/curves/circle_curve2.d.ts +38 -0
  34. package/dist/curves/circle_curve2.d.ts.map +1 -0
  35. package/dist/curves/circle_curve2.js +112 -0
  36. package/dist/curves/curve2.d.ts +214 -0
  37. package/dist/curves/curve2.d.ts.map +1 -0
  38. package/dist/curves/curve2.js +238 -0
  39. package/dist/curves/ellipse2.d.ts +42 -0
  40. package/dist/curves/ellipse2.d.ts.map +1 -0
  41. package/dist/curves/ellipse2.js +125 -0
  42. package/dist/curves/ellipse_arc2.d.ts +49 -0
  43. package/dist/curves/ellipse_arc2.d.ts.map +1 -0
  44. package/dist/curves/ellipse_arc2.js +184 -0
  45. package/dist/curves/ellipse_curve2.d.ts +56 -0
  46. package/dist/curves/ellipse_curve2.d.ts.map +1 -0
  47. package/dist/curves/ellipse_curve2.js +262 -0
  48. package/dist/curves/interval.d.ts +112 -0
  49. package/dist/curves/interval.d.ts.map +1 -0
  50. package/dist/curves/interval.js +200 -0
  51. package/dist/curves/line2.d.ts +64 -0
  52. package/dist/curves/line2.d.ts.map +1 -0
  53. package/dist/curves/line2.js +193 -0
  54. package/dist/curves/period_interval.d.ts +129 -0
  55. package/dist/curves/period_interval.d.ts.map +1 -0
  56. package/dist/curves/period_interval.js +240 -0
  57. package/dist/discretize/discretize_defaults.d.ts +12 -0
  58. package/dist/discretize/discretize_defaults.d.ts.map +1 -0
  59. package/dist/discretize/discretize_defaults.js +12 -0
  60. package/dist/discretize/discretize_engine.d.ts +33 -0
  61. package/dist/discretize/discretize_engine.d.ts.map +1 -0
  62. package/dist/discretize/discretize_engine.js +347 -0
  63. package/dist/discretize/discretize_errors.d.ts +15 -0
  64. package/dist/discretize/discretize_errors.d.ts.map +1 -0
  65. package/dist/discretize/discretize_errors.js +30 -0
  66. package/dist/discretize/discretize_options.d.ts +18 -0
  67. package/dist/discretize/discretize_options.d.ts.map +1 -0
  68. package/dist/discretize/discretize_options.js +19 -0
  69. package/dist/discretize/discretize_types.d.ts +36 -0
  70. package/dist/discretize/discretize_types.d.ts.map +1 -0
  71. package/dist/discretize/discretize_types.js +1 -0
  72. package/dist/discretize/internal/curve_guards.d.ts +35 -0
  73. package/dist/discretize/internal/curve_guards.d.ts.map +1 -0
  74. package/dist/discretize/internal/curve_guards.js +62 -0
  75. package/dist/discretize/internal/postprocess.d.ts +5 -0
  76. package/dist/discretize/internal/postprocess.d.ts.map +1 -0
  77. package/dist/discretize/internal/postprocess.js +109 -0
  78. package/dist/discretize/internal/sampling_utils.d.ts +8 -0
  79. package/dist/discretize/internal/sampling_utils.d.ts.map +1 -0
  80. package/dist/discretize/internal/sampling_utils.js +36 -0
  81. package/dist/discretize/register_builtin_strategies.d.ts +3 -0
  82. package/dist/discretize/register_builtin_strategies.d.ts.map +1 -0
  83. package/dist/discretize/register_builtin_strategies.js +10 -0
  84. package/dist/discretize/strategies/bspline_strategy.d.ts +4 -0
  85. package/dist/discretize/strategies/bspline_strategy.d.ts.map +1 -0
  86. package/dist/discretize/strategies/bspline_strategy.js +115 -0
  87. package/dist/discretize/strategies/circle_strategy.d.ts +7 -0
  88. package/dist/discretize/strategies/circle_strategy.d.ts.map +1 -0
  89. package/dist/discretize/strategies/circle_strategy.js +55 -0
  90. package/dist/discretize/strategies/ellipse_strategy.d.ts +7 -0
  91. package/dist/discretize/strategies/ellipse_strategy.d.ts.map +1 -0
  92. package/dist/discretize/strategies/ellipse_strategy.js +86 -0
  93. package/dist/discretize/strategies/line_strategy.d.ts +4 -0
  94. package/dist/discretize/strategies/line_strategy.d.ts.map +1 -0
  95. package/dist/discretize/strategies/line_strategy.js +40 -0
  96. package/dist/discretize/strategy_registry.d.ts +9 -0
  97. package/dist/discretize/strategy_registry.d.ts.map +1 -0
  98. package/dist/discretize/strategy_registry.js +34 -0
  99. package/dist/index.d.ts +30 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +24 -0
  102. package/dist/intersections/analytic_x_algorithm.d.ts +10 -0
  103. package/dist/intersections/analytic_x_algorithm.d.ts.map +1 -0
  104. package/dist/intersections/analytic_x_algorithm.js +83 -0
  105. package/dist/intersections/curve_x_engine.d.ts +9 -0
  106. package/dist/intersections/curve_x_engine.d.ts.map +1 -0
  107. package/dist/intersections/curve_x_engine.js +27 -0
  108. package/dist/intersections/index.d.ts +5 -0
  109. package/dist/intersections/index.d.ts.map +1 -0
  110. package/dist/intersections/index.js +11 -0
  111. package/dist/intersections/internal/certification.d.ts +34 -0
  112. package/dist/intersections/internal/certification.d.ts.map +1 -0
  113. package/dist/intersections/internal/certification.js +238 -0
  114. package/dist/intersections/internal/interval_clipping.d.ts +29 -0
  115. package/dist/intersections/internal/interval_clipping.d.ts.map +1 -0
  116. package/dist/intersections/internal/interval_clipping.js +123 -0
  117. package/dist/intersections/internal/kind.d.ts +4 -0
  118. package/dist/intersections/internal/kind.d.ts.map +1 -0
  119. package/dist/intersections/internal/kind.js +16 -0
  120. package/dist/intersections/internal/pair.d.ts +9 -0
  121. package/dist/intersections/internal/pair.d.ts.map +1 -0
  122. package/dist/intersections/internal/pair.js +14 -0
  123. package/dist/intersections/internal/result.d.ts +20 -0
  124. package/dist/intersections/internal/result.d.ts.map +1 -0
  125. package/dist/intersections/internal/result.js +125 -0
  126. package/dist/intersections/internal/sampling.d.ts +15 -0
  127. package/dist/intersections/internal/sampling.d.ts.map +1 -0
  128. package/dist/intersections/internal/sampling.js +131 -0
  129. package/dist/intersections/internal/segment.d.ts +32 -0
  130. package/dist/intersections/internal/segment.d.ts.map +1 -0
  131. package/dist/intersections/internal/segment.js +137 -0
  132. package/dist/intersections/internal/tolerance.d.ts +10 -0
  133. package/dist/intersections/internal/tolerance.d.ts.map +1 -0
  134. package/dist/intersections/internal/tolerance.js +20 -0
  135. package/dist/intersections/intersector.d.ts +6 -0
  136. package/dist/intersections/intersector.d.ts.map +1 -0
  137. package/dist/intersections/intersector.js +1 -0
  138. package/dist/intersections/numeric_x_algorithm.d.ts +10 -0
  139. package/dist/intersections/numeric_x_algorithm.d.ts.map +1 -0
  140. package/dist/intersections/numeric_x_algorithm.js +73 -0
  141. package/dist/intersections/solvers/bspline_self_solver.d.ts +7 -0
  142. package/dist/intersections/solvers/bspline_self_solver.d.ts.map +1 -0
  143. package/dist/intersections/solvers/bspline_self_solver.js +308 -0
  144. package/dist/intersections/solvers/line_line_pair_solver.d.ts +7 -0
  145. package/dist/intersections/solvers/line_line_pair_solver.d.ts.map +1 -0
  146. package/dist/intersections/solvers/line_line_pair_solver.js +35 -0
  147. package/dist/intersections/solvers/pair_solvers.d.ts +94 -0
  148. package/dist/intersections/solvers/pair_solvers.d.ts.map +1 -0
  149. package/dist/intersections/solvers/pair_solvers.js +1078 -0
  150. package/dist/intersections/solvers/polyline_pair_intersector.d.ts +51 -0
  151. package/dist/intersections/solvers/polyline_pair_intersector.d.ts.map +1 -0
  152. package/dist/intersections/solvers/polyline_pair_intersector.js +731 -0
  153. package/dist/intersections/types.d.ts +11 -0
  154. package/dist/intersections/types.d.ts.map +1 -0
  155. package/dist/intersections/types.js +1 -0
  156. package/dist/serialize/dump_types.d.ts +101 -0
  157. package/dist/serialize/dump_types.d.ts.map +1 -0
  158. package/dist/serialize/dump_types.js +5 -0
  159. package/dist/serialize/geom_mgr.d.ts +24 -0
  160. package/dist/serialize/geom_mgr.d.ts.map +1 -0
  161. package/dist/serialize/geom_mgr.js +30 -0
  162. package/dist/types/type_define.d.ts +29 -0
  163. package/dist/types/type_define.d.ts.map +1 -0
  164. package/dist/types/type_define.js +10 -0
  165. package/dist/types/type_guard.d.ts +46 -0
  166. package/dist/types/type_guard.d.ts.map +1 -0
  167. package/dist/types/type_guard.js +5 -0
  168. package/dist/utils/math_error.d.ts +16 -0
  169. package/dist/utils/math_error.d.ts.map +1 -0
  170. package/dist/utils/math_error.js +35 -0
  171. package/dist/utils/math_utils.d.ts +9 -0
  172. package/dist/utils/math_utils.d.ts.map +1 -0
  173. package/dist/utils/math_utils.js +25 -0
  174. package/dist/utils/precision.d.ts +29 -0
  175. package/dist/utils/precision.d.ts.map +1 -0
  176. package/dist/utils/precision.js +44 -0
  177. package/package.json +38 -0
@@ -0,0 +1,297 @@
1
+ /*
2
+ * Linea Math - Core
3
+ * Vec2:二维向量,采用不可变设计,支持链式调用。
4
+ */
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+ var Vec2_1;
12
+ import { GeomBase } from './geom_base';
13
+ import { EN_GEO_TYPE } from '../constants/geom_type';
14
+ import { RegisterGeom } from '../serialize/geom_mgr';
15
+ import { Precision } from '../utils/precision';
16
+ let Vec2 = Vec2_1 = class Vec2 extends GeomBase {
17
+ constructor(xOrObj = 0, y = 0) {
18
+ super();
19
+ if (typeof xOrObj === 'number') {
20
+ this.x = xOrObj;
21
+ this.y = y;
22
+ }
23
+ else {
24
+ this.x = xOrObj.x;
25
+ this.y = xOrObj.y;
26
+ }
27
+ }
28
+ /** 零向量 */
29
+ static zero() {
30
+ return new Vec2_1(0, 0);
31
+ }
32
+ /** 单位向量 X */
33
+ static unitX() {
34
+ return new Vec2_1(1, 0);
35
+ }
36
+ /** 单位向量 Y */
37
+ static unitY() {
38
+ return new Vec2_1(0, 1);
39
+ }
40
+ /** 克隆当前向量 */
41
+ clone() {
42
+ return new Vec2_1(this.x, this.y);
43
+ }
44
+ /** 返回替换 X 分量的新向量 */
45
+ withX(x) {
46
+ return new Vec2_1(x, this.y);
47
+ }
48
+ /** 返回替换 Y 分量的新向量 */
49
+ withY(y) {
50
+ return new Vec2_1(this.x, y);
51
+ }
52
+ /** 设置 X 分量(就地修改) */
53
+ setX(x) {
54
+ this.x = x;
55
+ return this;
56
+ }
57
+ /** 设置 Y 分量(就地修改) */
58
+ setY(y) {
59
+ this.y = y;
60
+ return this;
61
+ }
62
+ /** 向量相加(就地修改) */
63
+ add(v) {
64
+ this.x += v.x;
65
+ this.y += v.y;
66
+ return this;
67
+ }
68
+ /** 向量相加(返回新对象) */
69
+ added(v) {
70
+ return this.clone().add(v);
71
+ }
72
+ /** 向量相减(就地修改) */
73
+ subtract(v) {
74
+ this.x -= v.x;
75
+ this.y -= v.y;
76
+ return this;
77
+ }
78
+ /** 向量相减(返回新对象) */
79
+ subtracted(v) {
80
+ return this.clone().subtract(v);
81
+ }
82
+ /**
83
+ * 向量线性叠加:this + v * s
84
+ * - 常用于积分、插值、偏移等计算
85
+ */
86
+ addScaled(v, s) {
87
+ this.x += v.x * s;
88
+ this.y += v.y * s;
89
+ return this;
90
+ }
91
+ /** 向量线性叠加(返回新对象) */
92
+ addScaleded(v, s) {
93
+ return this.clone().addScaled(v, s);
94
+ }
95
+ /** 反向量(取相反方向) */
96
+ negate() {
97
+ this.x = -this.x;
98
+ this.y = -this.y;
99
+ return this;
100
+ }
101
+ /** 反向量(返回新对象) */
102
+ negated() {
103
+ return this.clone().negate();
104
+ }
105
+ /**
106
+ * 绕原点旋转(弧度)
107
+ * - 逆时针为正方向
108
+ */
109
+ rotate(rad) {
110
+ const c = Math.cos(rad);
111
+ const s = Math.sin(rad);
112
+ const x = this.x * c - this.y * s;
113
+ const y = this.x * s + this.y * c;
114
+ this.x = x;
115
+ this.y = y;
116
+ return this;
117
+ }
118
+ /** 绕原点旋转(返回新对象) */
119
+ rotated(rad) {
120
+ return this.clone().rotate(rad);
121
+ }
122
+ /**
123
+ * 绕指定点旋转(弧度)
124
+ * - 先平移到原点旋转,再平移回去
125
+ */
126
+ rotateAround(center, rad) {
127
+ const x = this.x - center.x;
128
+ const y = this.y - center.y;
129
+ const c = Math.cos(rad);
130
+ const s = Math.sin(rad);
131
+ this.x = x * c - y * s + center.x;
132
+ this.y = x * s + y * c + center.y;
133
+ return this;
134
+ }
135
+ /**
136
+ * 垂直向量(默认逆时针 90°)
137
+ * - (x, y) -> (-y, x)
138
+ * - 若需顺时针方向,可对结果取反
139
+ */
140
+ perp() {
141
+ const x = -this.y;
142
+ const y = this.x;
143
+ this.x = x;
144
+ this.y = y;
145
+ return this;
146
+ }
147
+ /** 垂直向量(返回新对象) */
148
+ perped() {
149
+ return this.clone().perp();
150
+ }
151
+ /** 标量缩放 */
152
+ scale(s) {
153
+ this.x *= s;
154
+ this.y *= s;
155
+ return this;
156
+ }
157
+ /** 标量缩放(返回新对象) */
158
+ scaled(s) {
159
+ return this.clone().scale(s);
160
+ }
161
+ /** 点积 */
162
+ dot(v) {
163
+ return this.x * v.x + this.y * v.y;
164
+ }
165
+ /** 叉积(返回标量) */
166
+ cross(v) {
167
+ return this.x * v.y - this.y * v.x;
168
+ }
169
+ /** 长度平方 */
170
+ lenSq() {
171
+ return this.x * this.x + this.y * this.y;
172
+ }
173
+ /** 向量长度 */
174
+ len() {
175
+ return Math.hypot(this.x, this.y);
176
+ }
177
+ /**
178
+ * 设置向量长度(保持方向)
179
+ * - 零向量返回零向量
180
+ */
181
+ setLength(len, eps = Precision.LEN_EPS) {
182
+ const l = this.len();
183
+ if (l < eps) {
184
+ this.x = 0;
185
+ this.y = 0;
186
+ return this;
187
+ }
188
+ return this.scale(len / l);
189
+ }
190
+ /** 设置向量长度(返回新对象) */
191
+ setLengthed(len, eps = Precision.LEN_EPS) {
192
+ return this.clone().setLength(len, eps);
193
+ }
194
+ /** 归一化,极短向量返回零向量 */
195
+ normalize(eps = Precision.LEN_EPS) {
196
+ const l = this.len();
197
+ if (l < eps) {
198
+ this.x = 0;
199
+ this.y = 0;
200
+ return this;
201
+ }
202
+ return this.scale(1 / l);
203
+ }
204
+ /** 归一化(返回新对象) */
205
+ normalized(eps = Precision.LEN_EPS) {
206
+ return this.clone().normalize(eps);
207
+ }
208
+ /**
209
+ * 应用 Mat3 变换(就地修改)
210
+ */
211
+ applyMat3(m) {
212
+ return m.transformPoint(this);
213
+ }
214
+ /** 应用 Mat3 变换(返回新对象) */
215
+ appliedMat3(m) {
216
+ return this.clone().applyMat3(m);
217
+ }
218
+ /** 到目标向量的距离 */
219
+ distanceTo(v) {
220
+ return Math.hypot(this.x - v.x, this.y - v.y);
221
+ }
222
+ /** 到目标向量的距离平方(避免开方,更高效) */
223
+ distanceToSq(v) {
224
+ const dx = this.x - v.x;
225
+ const dy = this.y - v.y;
226
+ return dx * dx + dy * dy;
227
+ }
228
+ /**
229
+ * 向量投影(投影到目标向量上)
230
+ * - 若目标向量为零向量,则返回零向量
231
+ * - 结果与目标向量共线
232
+ */
233
+ project(on, eps = Precision.LEN_EPS) {
234
+ const denom = on.lenSq();
235
+ if (Precision.nearlyZeroSq(denom, eps)) {
236
+ this.x = 0;
237
+ this.y = 0;
238
+ return this;
239
+ }
240
+ const scale = this.dot(on) / denom;
241
+ this.x = on.x * scale;
242
+ this.y = on.y * scale;
243
+ return this;
244
+ }
245
+ /** 向量投影(返回新对象) */
246
+ projected(on, eps = Precision.LEN_EPS) {
247
+ return this.clone().project(on, eps);
248
+ }
249
+ /**
250
+ * 返回向量的方向角(弧度)
251
+ * - 相对于 +X 轴的角度
252
+ * - 结果范围为 [-PI, PI]
253
+ */
254
+ angle() {
255
+ return Math.atan2(this.y, this.x);
256
+ }
257
+ /** 线性插值 */
258
+ lerp(v, t) {
259
+ return new Vec2_1(this.x + (v.x - this.x) * t, this.y + (v.y - this.y) * t);
260
+ }
261
+ /**
262
+ * 计算当前向量到目标向量的夹角(弧度)
263
+ * - 结果范围为 [-PI, PI]
264
+ * - 使用 atan2(cross, dot),保留方向(顺时针/逆时针)
265
+ */
266
+ angleTo(v) {
267
+ const dot = this.dot(v);
268
+ const det = this.cross(v);
269
+ return Math.atan2(det, dot);
270
+ }
271
+ /** 判断分量是否为有限数 */
272
+ isFinite() {
273
+ return Number.isFinite(this.x) && Number.isFinite(this.y);
274
+ }
275
+ /** 判断是否近似相等 */
276
+ equals(v, eps = Precision.EPS) {
277
+ return Precision.equal(this.x, v.x, eps) && Precision.equal(this.y, v.y, eps);
278
+ }
279
+ /** 转为元组 */
280
+ toArray() {
281
+ return [this.x, this.y];
282
+ }
283
+ /** 序列化为结构对象 */
284
+ dump() {
285
+ return { type: Vec2_1.type, x: this.x, y: this.y };
286
+ }
287
+ /** 从结构对象反序列化 */
288
+ static load(data) {
289
+ return new Vec2_1(data.x, data.y);
290
+ }
291
+ };
292
+ /** 序列化类型标识 */
293
+ Vec2.type = EN_GEO_TYPE.Vec2;
294
+ Vec2 = Vec2_1 = __decorate([
295
+ RegisterGeom
296
+ ], Vec2);
297
+ export { Vec2 };
@@ -0,0 +1,49 @@
1
+ import { EN_GEO_TYPE } from '../constants/geom_type';
2
+ import { Box2 } from '../core/box2';
3
+ import { Mat3 } from '../core/mat3';
4
+ import { Vec2 } from '../core/vec2';
5
+ import type { IDBArc2 } from '../serialize/dump_types';
6
+ import type { IClosestPointResult } from '../types/type_define';
7
+ import { CircleCurve2 } from './circle_curve2';
8
+ import { Interval } from './interval';
9
+ export declare class Arc2 extends CircleCurve2 {
10
+ static readonly type = EN_GEO_TYPE.Arc2;
11
+ private _clockwise;
12
+ constructor(center: Vec2, radius: number, startAngle: number, endAngle: number, clockwise?: boolean);
13
+ get clockwise(): boolean;
14
+ get startAngle(): number;
15
+ get endAngle(): number;
16
+ pointAt(u: number): Vec2;
17
+ tangentAt(u: number): Vec2;
18
+ derivatives(u: number, n: number): Vec2[];
19
+ curvatureAt(u: number): number;
20
+ length(range?: Interval): number;
21
+ lengthAtParam(u: number): number;
22
+ paramAtLength(s: number, tol?: number): number;
23
+ split(u: number): Arc2[];
24
+ trim(range: Interval): Arc2[];
25
+ reverse(): this;
26
+ transform(m: Mat3): this;
27
+ transformed(m: Mat3): this;
28
+ closestPoint(p: Vec2): IClosestPointResult;
29
+ boundingBox(): Box2;
30
+ isValid(eps?: number): boolean;
31
+ isClosed(): boolean;
32
+ isArc(): this is Arc2;
33
+ /**
34
+ * 结构等价判断(字段级)。
35
+ * @param other 对比圆弧。
36
+ * @param eps 数值容差。
37
+ * @returns 圆心、半径、方向和起终角参数近似相等时返回 `true`。
38
+ */
39
+ equals(other: Arc2, eps?: number): boolean;
40
+ clone(): this;
41
+ dump(): IDBArc2;
42
+ static load(data: IDBArc2): Arc2;
43
+ private angleAtParam;
44
+ private paramFromAngle;
45
+ private resetAngles;
46
+ private normalizeAngle;
47
+ private positiveMod;
48
+ }
49
+ //# sourceMappingURL=arc2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arc2.d.ts","sourceRoot":"","sources":["../../src/curves/arc2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,qBACa,IAAK,SAAQ,YAAY;IAClC,gBAAuB,IAAI,oBAAmB;IAE9C,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,UAAQ;IAOjG,IAAW,SAAS,YAEnB;IAED,IAAW,UAAU,WAEpB;IAED,IAAW,QAAQ,WAMlB;IAEe,OAAO,CAAC,CAAC,EAAE,MAAM;IAIjB,SAAS,CAAC,CAAC,EAAE,MAAM;IAMnB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAYhC,WAAW,CAAC,CAAC,EAAE,MAAM;IAKrB,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ;IAMvB,aAAa,CAAC,CAAC,EAAE,MAAM;IAKvB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAA6B;IAQzD,KAAK,CAAC,CAAC,EAAE,MAAM;IAUf,IAAI,CAAC,KAAK,EAAE,QAAQ;IAUpB,OAAO;IAOP,SAAS,CAAC,CAAC,EAAE,IAAI;IAiCjB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI;IAI1B,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,mBAAmB;IAgD1C,WAAW;IAiBX,OAAO,CAAC,GAAG,SAA6B;IAIxC,QAAQ,IAAI,OAAO;IAInB,KAAK,IAAI,IAAI,IAAI,IAAI;IAIrC;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,SAAgB;IAQ9B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,OAAO;WAWjB,IAAI,CAAC,IAAI,EAAE,OAAO;IAUhC,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;CAItB"}
@@ -0,0 +1,265 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var Arc2_1;
8
+ import { EN_GEO_TYPE } from '../constants/geom_type';
9
+ import { MathConst } from '../constants/math_const';
10
+ import { Box2 } from '../core/box2';
11
+ import { Vec2 } from '../core/vec2';
12
+ import { RegisterGeom } from '../serialize/geom_mgr';
13
+ import { MathError } from '../utils/math_error';
14
+ import { Precision } from '../utils/precision';
15
+ import { CircleCurve2 } from './circle_curve2';
16
+ import { PeriodInterval } from './period_interval';
17
+ let Arc2 = Arc2_1 = class Arc2 extends CircleCurve2 {
18
+ constructor(center, radius, startAngle, endAngle, clockwise = false) {
19
+ super(center, radius);
20
+ MathError.assert(Number.isFinite(startAngle) && Number.isFinite(endAngle), 'Arc2: startAngle/endAngle must be finite');
21
+ this._clockwise = clockwise;
22
+ this.resetAngles(startAngle, endAngle, clockwise);
23
+ }
24
+ get clockwise() {
25
+ return this._clockwise;
26
+ }
27
+ get startAngle() {
28
+ return this.normalizeAngle(this._range.start);
29
+ }
30
+ get endAngle() {
31
+ const sweep = this._range.length();
32
+ const end = this._clockwise
33
+ ? this._range.start - sweep
34
+ : this._range.start + sweep;
35
+ return this.normalizeAngle(end);
36
+ }
37
+ pointAt(u) {
38
+ return this.pointAtAngle(this.angleAtParam(u));
39
+ }
40
+ tangentAt(u) {
41
+ const theta = this.angleAtParam(u);
42
+ const sign = this._clockwise ? -1 : 1;
43
+ return this.derivativeAtAngle(theta, 1, sign);
44
+ }
45
+ derivatives(u, n) {
46
+ MathError.assert(Number.isInteger(n) && n >= 0, 'Arc2.derivatives: n must be a non-negative integer');
47
+ const theta = this.angleAtParam(u);
48
+ const sign = this._clockwise ? -1 : 1;
49
+ const ret = [this.pointAtAngle(theta)];
50
+ for (let i = 1; i <= n; i++) {
51
+ ret.push(this.derivativeAtAngle(theta, i, sign));
52
+ }
53
+ return ret;
54
+ }
55
+ curvatureAt(u) {
56
+ this.angleAtParam(u);
57
+ return 1 / this._radius;
58
+ }
59
+ length(range) {
60
+ if (!range)
61
+ return this._range.length() * this._radius;
62
+ this._range.assertContainsRange(range, Precision.CURVE_PARAM_EPS);
63
+ return range.length() * this._radius;
64
+ }
65
+ lengthAtParam(u) {
66
+ const uu = this.normalizeParamForEval(u);
67
+ return (uu - this._range.start) * this._radius;
68
+ }
69
+ paramAtLength(s, tol = Precision.CURVE_LENGTH_EPS) {
70
+ const total = this.length();
71
+ MathError.assert(Number.isFinite(tol) && tol > 0, 'Arc2.paramAtLength: tol must be > 0');
72
+ MathError.assert(s >= -tol && s <= total + tol, `Arc2.paramAtLength: s out of range [0, ${total}]`);
73
+ const clamped = Math.min(total, Math.max(0, s));
74
+ return this._range.start + clamped / this._radius;
75
+ }
76
+ split(u) {
77
+ const pieces = this._range.split(u, Precision.CURVE_PARAM_EPS);
78
+ if (pieces.length === 0)
79
+ return [];
80
+ const theta = this.angleAtParam(u);
81
+ const left = new Arc2_1(this._center, this._radius, this.startAngle, theta, this._clockwise);
82
+ const right = new Arc2_1(this._center, this._radius, theta, this.endAngle, this._clockwise);
83
+ return [left, right].filter((arc) => arc.length() > Precision.CURVE_LENGTH_EPS);
84
+ }
85
+ trim(range) {
86
+ this._range.assertContainsRange(range, Precision.CURVE_PARAM_EPS);
87
+ if (range.length() <= Precision.CURVE_PARAM_EPS)
88
+ return [];
89
+ const s = this.angleAtParam(range.start);
90
+ const e = this.angleAtParam(range.end);
91
+ const arc = new Arc2_1(this._center, this._radius, s, e, this._clockwise);
92
+ return arc.length() <= Precision.CURVE_LENGTH_EPS ? [] : [arc];
93
+ }
94
+ reverse() {
95
+ const s = this.startAngle;
96
+ const e = this.endAngle;
97
+ this.resetAngles(e, s, !this._clockwise);
98
+ return this;
99
+ }
100
+ transform(m) {
101
+ MathError.assert(m.isSimilarity2D(Precision.CURVE_PARAM_EPS), 'Arc2.transform: matrix must be a 2D similarity transform');
102
+ const oldSweep = this._range.length();
103
+ const oldClockwise = this._clockwise;
104
+ const startPoint = this.pointAt(this._range.start);
105
+ const endPoint = this.pointAt(this._range.end);
106
+ const nextCenter = m.transformedPoint(this._center);
107
+ const nextStartPoint = m.transformedPoint(startPoint);
108
+ const nextEndPoint = m.transformedPoint(endPoint);
109
+ const nextRadius = this._radius * m.getSimilarityScale2D(Precision.CURVE_PARAM_EPS);
110
+ MathError.assert(nextRadius > Precision.CURVE_LENGTH_EPS, 'Arc2.transform: degenerate radius after transform');
111
+ const det = m.determinant();
112
+ const mirrored = det < 0;
113
+ const nextClockwise = mirrored ? !oldClockwise : oldClockwise;
114
+ const startAngle = Math.atan2(nextStartPoint.y - nextCenter.y, nextStartPoint.x - nextCenter.x);
115
+ let endAngle = Math.atan2(nextEndPoint.y - nextCenter.y, nextEndPoint.x - nextCenter.x);
116
+ if (Math.abs(oldSweep - MathConst.PI2) <= Precision.CURVE_PARAM_EPS) {
117
+ endAngle = startAngle + (nextClockwise ? -MathConst.PI2 : MathConst.PI2);
118
+ }
119
+ this._center = nextCenter;
120
+ this._radius = nextRadius;
121
+ this.resetAngles(startAngle, endAngle, nextClockwise);
122
+ MathError.assert(this.length() > Precision.CURVE_LENGTH_EPS || Math.abs(oldSweep) <= Precision.CURVE_PARAM_EPS, 'Arc2.transform: invalid transformed arc');
123
+ return this;
124
+ }
125
+ transformed(m) {
126
+ return this.clone().transform(m);
127
+ }
128
+ closestPoint(p) {
129
+ const range = this._range;
130
+ const v = p.subtracted(this._center);
131
+ let candidateU = this._range.start;
132
+ if (v.len() > Precision.CURVE_NEWTON_EPS) {
133
+ const theta = Math.atan2(v.y, v.x);
134
+ candidateU = this.paramFromAngle(theta);
135
+ }
136
+ const candidates = [];
137
+ if (this.containsParam(candidateU)) {
138
+ candidates.push(candidateU);
139
+ }
140
+ candidates.push(this._range.start, this._range.end);
141
+ let bestU = candidates[0];
142
+ let bestP = this.pointAt(bestU);
143
+ let bestD = bestP.distanceTo(p);
144
+ for (let i = 1; i < candidates.length; i++) {
145
+ const u = candidates[i];
146
+ const q = this.pointAt(u);
147
+ const d = q.distanceTo(p);
148
+ if (d < bestD - Precision.CURVE_LENGTH_EPS) {
149
+ bestU = u;
150
+ bestP = q;
151
+ bestD = d;
152
+ continue;
153
+ }
154
+ if (Math.abs(d - bestD) <= Precision.CURVE_LENGTH_EPS) {
155
+ const uu = range.normalizeInPeriod(u, range.start);
156
+ const bb = range.normalizeInPeriod(bestU, range.start);
157
+ if (uu < bb) {
158
+ bestU = u;
159
+ bestP = q;
160
+ bestD = d;
161
+ }
162
+ }
163
+ }
164
+ return {
165
+ point: bestP,
166
+ param: bestU,
167
+ distance: bestD,
168
+ };
169
+ }
170
+ boundingBox() {
171
+ const points = [
172
+ this.pointAt(this._range.start),
173
+ this.pointAt(this._range.end),
174
+ ];
175
+ const axes = [0, Math.PI * 0.5, Math.PI, Math.PI * 1.5];
176
+ for (const theta of axes) {
177
+ const u = this.paramFromAngle(theta);
178
+ if (this.containsParam(u)) {
179
+ points.push(this.pointAt(u));
180
+ }
181
+ }
182
+ return Box2.fromPoints(points);
183
+ }
184
+ isValid(eps = Precision.CURVE_LENGTH_EPS) {
185
+ return this.isCircleStructValid(eps) && this._range.length() >= 0 && this._range.length() <= MathConst.PI2 + Precision.CURVE_PARAM_EPS;
186
+ }
187
+ isClosed() {
188
+ return Precision.equal(this._range.length(), MathConst.PI2, Precision.CURVE_PARAM_EPS);
189
+ }
190
+ isArc() {
191
+ return true;
192
+ }
193
+ /**
194
+ * 结构等价判断(字段级)。
195
+ * @param other 对比圆弧。
196
+ * @param eps 数值容差。
197
+ * @returns 圆心、半径、方向和起终角参数近似相等时返回 `true`。
198
+ */
199
+ equals(other, eps = Precision.EPS) {
200
+ return this._clockwise === other._clockwise &&
201
+ this._center.equals(other._center, eps) &&
202
+ Precision.equal(this._radius, other._radius, eps) &&
203
+ Precision.equal(this.startAngle, other.startAngle, eps) &&
204
+ Precision.equal(this.endAngle, other.endAngle, eps);
205
+ }
206
+ clone() {
207
+ return new Arc2_1(this._center, this._radius, this.startAngle, this.endAngle, this._clockwise);
208
+ }
209
+ dump() {
210
+ return {
211
+ type: Arc2_1.type,
212
+ center: { x: this._center.x, y: this._center.y },
213
+ radius: this._radius,
214
+ startAngle: this.startAngle,
215
+ endAngle: this.endAngle,
216
+ clockwise: this._clockwise,
217
+ };
218
+ }
219
+ static load(data) {
220
+ return new Arc2_1(new Vec2(data.center.x, data.center.y), data.radius, data.startAngle, data.endAngle, data.clockwise);
221
+ }
222
+ angleAtParam(u) {
223
+ const uu = this.normalizeParamForEval(u);
224
+ // 内部参数域总是递增;顺时针时通过镜像映射回几何角度。
225
+ if (!this._clockwise)
226
+ return uu;
227
+ return this._range.start - (uu - this._range.start);
228
+ }
229
+ paramFromAngle(theta) {
230
+ const range = this._range;
231
+ if (!this._clockwise) {
232
+ return range.normalizeInPeriod(theta, range.start);
233
+ }
234
+ // 反向参数化:关于 start 角做镜像。
235
+ const reflected = 2 * range.start - theta;
236
+ return range.normalizeInPeriod(reflected, range.start);
237
+ }
238
+ resetAngles(startAngle, endAngle, clockwise) {
239
+ const s = this.normalizeAngle(startAngle);
240
+ const startEqEnd = Precision.equal(startAngle, endAngle, Precision.CURVE_PARAM_EPS);
241
+ let sweep = 0;
242
+ if (!startEqEnd) {
243
+ const raw = clockwise ? (startAngle - endAngle) : (endAngle - startAngle);
244
+ sweep = this.positiveMod(raw);
245
+ if (Precision.equal(sweep, 0, Precision.CURVE_PARAM_EPS)) {
246
+ sweep = MathConst.PI2;
247
+ }
248
+ }
249
+ this._clockwise = clockwise;
250
+ this.setRange(new PeriodInterval(s, s + sweep, MathConst.PI2));
251
+ }
252
+ normalizeAngle(a) {
253
+ const r = a % MathConst.PI2;
254
+ return r < 0 ? r + MathConst.PI2 : r;
255
+ }
256
+ positiveMod(x) {
257
+ const r = x % MathConst.PI2;
258
+ return r < 0 ? r + MathConst.PI2 : r;
259
+ }
260
+ };
261
+ Arc2.type = EN_GEO_TYPE.Arc2;
262
+ Arc2 = Arc2_1 = __decorate([
263
+ RegisterGeom
264
+ ], Arc2);
265
+ export { Arc2 };