@retikz/core 0.3.0-alpha.5 → 0.3.0-beta.2

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 (439) hide show
  1. package/dist/es/arrows/define.d.ts +9 -0
  2. package/dist/es/arrows/define.d.ts.map +1 -0
  3. package/dist/es/arrows/define.js +10 -0
  4. package/dist/es/arrows/index.d.ts +3 -1
  5. package/dist/es/arrows/index.d.ts.map +1 -1
  6. package/dist/es/arrows/index.js +15 -2
  7. package/dist/es/arrows/types.d.ts +4 -2
  8. package/dist/es/arrows/types.d.ts.map +1 -1
  9. package/dist/es/compile/anchor-cache.d.ts +3 -3
  10. package/dist/es/compile/anchor-cache.d.ts.map +1 -1
  11. package/dist/es/compile/anchor-cache.js +18 -5
  12. package/dist/es/compile/compile.d.ts +5 -14
  13. package/dist/es/compile/compile.d.ts.map +1 -1
  14. package/dist/es/compile/compile.js +46 -43
  15. package/dist/es/compile/{lowerComposites.d.ts → composite.d.ts} +9 -2
  16. package/dist/es/compile/composite.d.ts.map +1 -0
  17. package/dist/es/compile/{lowerComposites.js → composite.js} +9 -1
  18. package/dist/es/compile/constant.d.ts +30 -0
  19. package/dist/es/compile/constant.d.ts.map +1 -0
  20. package/dist/es/compile/constant.js +21 -0
  21. package/dist/es/compile/direction.d.ts +27 -0
  22. package/dist/es/compile/direction.d.ts.map +1 -0
  23. package/dist/es/compile/direction.js +30 -0
  24. package/dist/es/compile/index.d.ts +3 -1
  25. package/dist/es/compile/index.d.ts.map +1 -1
  26. package/dist/es/compile/name-stack.d.ts +3 -1
  27. package/dist/es/compile/name-stack.d.ts.map +1 -1
  28. package/dist/es/compile/name-stack.js +5 -1
  29. package/dist/es/compile/node.d.ts +19 -8
  30. package/dist/es/compile/node.d.ts.map +1 -1
  31. package/dist/es/compile/node.js +56 -70
  32. package/dist/es/compile/paint.js +1 -1
  33. package/dist/es/compile/path/anchor.d.ts +4 -3
  34. package/dist/es/compile/path/anchor.d.ts.map +1 -1
  35. package/dist/es/compile/path/anchor.js +9 -12
  36. package/dist/es/compile/path/index.d.ts +6 -8
  37. package/dist/es/compile/path/index.d.ts.map +1 -1
  38. package/dist/es/compile/path/index.js +97 -44
  39. package/dist/es/compile/path/label.d.ts.map +1 -1
  40. package/dist/es/compile/path/label.js +8 -4
  41. package/dist/es/compile/path/relative.d.ts +1 -1
  42. package/dist/es/compile/path/relative.js +1 -1
  43. package/dist/es/compile/path/shrink.d.ts +3 -1
  44. package/dist/es/compile/path/shrink.d.ts.map +1 -1
  45. package/dist/es/compile/path/shrink.js +16 -11
  46. package/dist/es/compile/position.d.ts +2 -2
  47. package/dist/es/compile/position.d.ts.map +1 -1
  48. package/dist/es/compile/position.js +6 -19
  49. package/dist/es/compile/precision.d.ts +1 -1
  50. package/dist/es/compile/precision.d.ts.map +1 -1
  51. package/dist/es/compile/precision.js +2 -2
  52. package/dist/es/compile/scope.d.ts +7 -5
  53. package/dist/es/compile/scope.d.ts.map +1 -1
  54. package/dist/es/compile/scope.js +44 -16
  55. package/dist/es/compile/style.d.ts +2 -2
  56. package/dist/es/compile/style.d.ts.map +1 -1
  57. package/dist/es/compile/style.js +2 -2
  58. package/dist/es/compile/text-metrics.d.ts +1 -1
  59. package/dist/es/compile/text-metrics.js +2 -2
  60. package/dist/es/composites/define.d.ts +8 -0
  61. package/dist/es/composites/define.d.ts.map +1 -0
  62. package/dist/es/composites/{types.js → define.js} +2 -2
  63. package/dist/es/composites/index.d.ts +1 -1
  64. package/dist/es/composites/index.d.ts.map +1 -1
  65. package/dist/es/composites/types.d.ts +0 -6
  66. package/dist/es/composites/types.d.ts.map +1 -1
  67. package/dist/es/geometry/anchor.d.ts +33 -0
  68. package/dist/es/geometry/anchor.d.ts.map +1 -0
  69. package/dist/es/geometry/anchor.js +45 -0
  70. package/dist/es/geometry/bend.d.ts +1 -1
  71. package/dist/es/geometry/bend.js +3 -3
  72. package/dist/es/geometry/circle.d.ts +4 -4
  73. package/dist/es/geometry/circle.d.ts.map +1 -1
  74. package/dist/es/geometry/circle.js +3 -3
  75. package/dist/es/geometry/{roundedContour.d.ts → contour.d.ts} +9 -5
  76. package/dist/es/geometry/contour.d.ts.map +1 -0
  77. package/dist/es/geometry/{roundedContour.js → contour.js} +27 -37
  78. package/dist/es/geometry/diamond.d.ts +10 -4
  79. package/dist/es/geometry/diamond.d.ts.map +1 -1
  80. package/dist/es/geometry/diamond.js +11 -3
  81. package/dist/{lib/geometry/_edge.d.ts → es/geometry/edge.d.ts} +1 -1
  82. package/dist/es/geometry/edge.d.ts.map +1 -0
  83. package/dist/es/geometry/{_edge.js → edge.js} +1 -1
  84. package/dist/es/geometry/ellipse.d.ts +3 -3
  85. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  86. package/dist/es/geometry/ellipse.js +4 -2
  87. package/dist/es/geometry/index.d.ts +6 -1
  88. package/dist/es/geometry/index.d.ts.map +1 -1
  89. package/dist/es/geometry/point.d.ts +6 -0
  90. package/dist/es/geometry/point.d.ts.map +1 -1
  91. package/dist/es/geometry/point.js +17 -0
  92. package/dist/es/geometry/rect.d.ts +4 -17
  93. package/dist/es/geometry/rect.d.ts.map +1 -1
  94. package/dist/es/geometry/rect.js +4 -16
  95. package/dist/es/geometry/segment.d.ts +7 -0
  96. package/dist/es/geometry/segment.d.ts.map +1 -1
  97. package/dist/es/geometry/segment.js +48 -47
  98. package/dist/{lib/geometry/_transform.d.ts → es/geometry/transform.d.ts} +1 -1
  99. package/dist/es/geometry/transform.d.ts.map +1 -0
  100. package/dist/es/geometry/{_transform.js → transform.js} +1 -1
  101. package/dist/es/index.d.ts +13 -13
  102. package/dist/es/index.d.ts.map +1 -1
  103. package/dist/es/index.js +20 -16
  104. package/dist/es/ir/animation.d.ts +26 -125
  105. package/dist/es/ir/animation.d.ts.map +1 -1
  106. package/dist/es/ir/animation.js +6 -6
  107. package/dist/es/ir/boundary.d.ts +4 -10
  108. package/dist/es/ir/boundary.d.ts.map +1 -1
  109. package/dist/es/ir/clip.d.ts +6 -46
  110. package/dist/es/ir/clip.d.ts.map +1 -1
  111. package/dist/es/ir/composite.d.ts +2 -14
  112. package/dist/es/ir/composite.d.ts.map +1 -1
  113. package/dist/es/ir/coordinate.d.ts +14 -50
  114. package/dist/es/ir/coordinate.d.ts.map +1 -1
  115. package/dist/es/ir/coordinate.js +1 -1
  116. package/dist/es/ir/font.d.ts +10 -13
  117. package/dist/es/ir/font.d.ts.map +1 -1
  118. package/dist/es/ir/json.d.ts +1 -1
  119. package/dist/es/ir/json.d.ts.map +1 -1
  120. package/dist/es/ir/json.js +1 -1
  121. package/dist/es/ir/node.d.ts +175 -821
  122. package/dist/es/ir/node.d.ts.map +1 -1
  123. package/dist/es/ir/node.js +23 -23
  124. package/dist/es/ir/paint.d.ts +23 -100
  125. package/dist/es/ir/paint.d.ts.map +1 -1
  126. package/dist/es/ir/paint.js +10 -10
  127. package/dist/es/ir/path/arrow.d.ts +19 -131
  128. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  129. package/dist/es/ir/path/arrow.js +18 -16
  130. package/dist/es/ir/path/path.d.ts +519 -3065
  131. package/dist/es/ir/path/path.d.ts.map +1 -1
  132. package/dist/es/ir/path/path.js +3 -3
  133. package/dist/es/ir/path/step.d.ts +929 -3474
  134. package/dist/es/ir/path/step.d.ts.map +1 -1
  135. package/dist/es/ir/path/step.js +74 -23
  136. package/dist/es/ir/path/target.d.ts +40 -121
  137. package/dist/es/ir/path/target.d.ts.map +1 -1
  138. package/dist/es/ir/path/target.js +3 -3
  139. package/dist/es/ir/position/at-position.d.ts +20 -28
  140. package/dist/es/ir/position/at-position.d.ts.map +1 -1
  141. package/dist/es/ir/position/at-position.js +11 -11
  142. package/dist/es/ir/position/offset-position.d.ts +2 -8
  143. package/dist/es/ir/position/offset-position.d.ts.map +1 -1
  144. package/dist/es/ir/scene.d.ts +17 -181
  145. package/dist/es/ir/scene.d.ts.map +1 -1
  146. package/dist/es/ir/scope.d.ts +315 -7291
  147. package/dist/es/ir/scope.d.ts.map +1 -1
  148. package/dist/es/ir/scope.js +10 -7
  149. package/dist/es/ir/shape.d.ts +2 -8
  150. package/dist/es/ir/shape.d.ts.map +1 -1
  151. package/dist/es/ir/text.d.ts +24 -70
  152. package/dist/es/ir/text.d.ts.map +1 -1
  153. package/dist/es/ir/transform.d.ts +47 -144
  154. package/dist/es/ir/transform.d.ts.map +1 -1
  155. package/dist/es/ir/transform.js +12 -5
  156. package/dist/es/parsers/index.d.ts +3 -3
  157. package/dist/es/parsers/index.d.ts.map +1 -1
  158. package/dist/es/parsers/{parseNodeTarget.d.ts → node-target.d.ts} +1 -1
  159. package/dist/es/parsers/node-target.d.ts.map +1 -0
  160. package/dist/es/parsers/{parseNodeTarget.js → node-target.js} +10 -8
  161. package/dist/{lib/parsers/parseTargetSugar.d.ts → es/parsers/target-sugar.d.ts} +1 -1
  162. package/dist/es/parsers/target-sugar.d.ts.map +1 -0
  163. package/dist/es/parsers/{parseTargetSugar.js → target-sugar.js} +9 -4
  164. package/dist/{lib/parsers/parseWay.d.ts → es/parsers/way.d.ts} +2 -2
  165. package/dist/es/parsers/way.d.ts.map +1 -0
  166. package/dist/es/parsers/{parseWay.js → way.js} +10 -6
  167. package/dist/es/path-generators/define.d.ts.map +1 -0
  168. package/dist/es/{pathGenerators → path-generators}/define.js +1 -1
  169. package/dist/es/path-generators/index.d.ts.map +1 -0
  170. package/dist/es/path-generators/types.d.ts.map +1 -0
  171. package/dist/es/patterns/define.d.ts +9 -0
  172. package/dist/es/patterns/define.d.ts.map +1 -0
  173. package/dist/es/patterns/define.js +10 -0
  174. package/dist/es/patterns/index.d.ts +1 -0
  175. package/dist/es/patterns/index.d.ts.map +1 -1
  176. package/dist/es/patterns/index.js +42 -35
  177. package/dist/es/presets/animation.js +2 -2
  178. package/dist/es/primitive/marker.d.ts +7 -7
  179. package/dist/es/primitive/marker.d.ts.map +1 -1
  180. package/dist/es/primitive/paint.d.ts +1 -1
  181. package/dist/es/primitive/path.d.ts +1 -1
  182. package/dist/es/shapes/arc.d.ts.map +1 -1
  183. package/dist/es/shapes/arc.js +24 -5
  184. package/dist/{lib/shapes/_contour.d.ts → es/shapes/contour.d.ts} +6 -3
  185. package/dist/es/shapes/contour.d.ts.map +1 -0
  186. package/dist/es/shapes/{_contour.js → contour.js} +14 -2
  187. package/dist/es/shapes/ellipse.js +2 -2
  188. package/dist/es/shapes/index.d.ts +1 -1
  189. package/dist/es/shapes/index.d.ts.map +1 -1
  190. package/dist/es/shapes/index.js +1 -1
  191. package/dist/es/shapes/polygon.d.ts +1 -1
  192. package/dist/es/shapes/polygon.d.ts.map +1 -1
  193. package/dist/es/shapes/polygon.js +26 -21
  194. package/dist/es/shapes/rectangle.js +6 -6
  195. package/dist/es/shapes/sector.d.ts.map +1 -1
  196. package/dist/es/shapes/sector.js +30 -22
  197. package/dist/es/shapes/{_shared.d.ts → shared.d.ts} +7 -10
  198. package/dist/es/shapes/shared.d.ts.map +1 -0
  199. package/dist/es/shapes/{_shared.js → shared.js} +13 -15
  200. package/dist/es/shapes/star.d.ts.map +1 -1
  201. package/dist/es/shapes/star.js +6 -15
  202. package/dist/es/shapes/types.d.ts +10 -3
  203. package/dist/es/shapes/types.d.ts.map +1 -1
  204. package/dist/es/types.d.ts +1 -1
  205. package/dist/lib/arrows/define.cjs +10 -0
  206. package/dist/lib/arrows/define.d.ts +9 -0
  207. package/dist/lib/arrows/define.d.ts.map +1 -0
  208. package/dist/lib/arrows/index.cjs +15 -2
  209. package/dist/lib/arrows/index.d.ts +3 -1
  210. package/dist/lib/arrows/index.d.ts.map +1 -1
  211. package/dist/lib/arrows/types.d.ts +4 -2
  212. package/dist/lib/arrows/types.d.ts.map +1 -1
  213. package/dist/lib/compile/anchor-cache.cjs +17 -4
  214. package/dist/lib/compile/anchor-cache.d.ts +3 -3
  215. package/dist/lib/compile/anchor-cache.d.ts.map +1 -1
  216. package/dist/lib/compile/compile.cjs +44 -41
  217. package/dist/lib/compile/compile.d.ts +5 -14
  218. package/dist/lib/compile/compile.d.ts.map +1 -1
  219. package/dist/lib/compile/{lowerComposites.cjs → composite.cjs} +9 -1
  220. package/dist/lib/compile/{lowerComposites.d.ts → composite.d.ts} +9 -2
  221. package/dist/lib/compile/composite.d.ts.map +1 -0
  222. package/dist/lib/compile/constant.cjs +22 -0
  223. package/dist/lib/compile/constant.d.ts +30 -0
  224. package/dist/lib/compile/constant.d.ts.map +1 -0
  225. package/dist/lib/compile/direction.cjs +31 -0
  226. package/dist/lib/compile/direction.d.ts +27 -0
  227. package/dist/lib/compile/direction.d.ts.map +1 -0
  228. package/dist/lib/compile/index.d.ts +3 -1
  229. package/dist/lib/compile/index.d.ts.map +1 -1
  230. package/dist/lib/compile/name-stack.cjs +5 -1
  231. package/dist/lib/compile/name-stack.d.ts +3 -1
  232. package/dist/lib/compile/name-stack.d.ts.map +1 -1
  233. package/dist/lib/compile/node.cjs +56 -69
  234. package/dist/lib/compile/node.d.ts +19 -8
  235. package/dist/lib/compile/node.d.ts.map +1 -1
  236. package/dist/lib/compile/paint.cjs +1 -1
  237. package/dist/lib/compile/path/anchor.cjs +10 -12
  238. package/dist/lib/compile/path/anchor.d.ts +4 -3
  239. package/dist/lib/compile/path/anchor.d.ts.map +1 -1
  240. package/dist/lib/compile/path/index.cjs +95 -42
  241. package/dist/lib/compile/path/index.d.ts +6 -8
  242. package/dist/lib/compile/path/index.d.ts.map +1 -1
  243. package/dist/lib/compile/path/label.cjs +8 -4
  244. package/dist/lib/compile/path/label.d.ts.map +1 -1
  245. package/dist/lib/compile/path/relative.cjs +1 -1
  246. package/dist/lib/compile/path/relative.d.ts +1 -1
  247. package/dist/lib/compile/path/shrink.cjs +16 -11
  248. package/dist/lib/compile/path/shrink.d.ts +3 -1
  249. package/dist/lib/compile/path/shrink.d.ts.map +1 -1
  250. package/dist/lib/compile/position.cjs +6 -19
  251. package/dist/lib/compile/position.d.ts +2 -2
  252. package/dist/lib/compile/position.d.ts.map +1 -1
  253. package/dist/lib/compile/precision.cjs +2 -2
  254. package/dist/lib/compile/precision.d.ts +1 -1
  255. package/dist/lib/compile/precision.d.ts.map +1 -1
  256. package/dist/lib/compile/scope.cjs +44 -16
  257. package/dist/lib/compile/scope.d.ts +7 -5
  258. package/dist/lib/compile/scope.d.ts.map +1 -1
  259. package/dist/lib/compile/style.cjs +2 -2
  260. package/dist/lib/compile/style.d.ts +2 -2
  261. package/dist/lib/compile/style.d.ts.map +1 -1
  262. package/dist/lib/compile/text-metrics.cjs +2 -2
  263. package/dist/lib/compile/text-metrics.d.ts +1 -1
  264. package/dist/lib/composites/{types.cjs → define.cjs} +2 -2
  265. package/dist/lib/composites/define.d.ts +8 -0
  266. package/dist/lib/composites/define.d.ts.map +1 -0
  267. package/dist/lib/composites/index.d.ts +1 -1
  268. package/dist/lib/composites/index.d.ts.map +1 -1
  269. package/dist/lib/composites/types.d.ts +0 -6
  270. package/dist/lib/composites/types.d.ts.map +1 -1
  271. package/dist/lib/geometry/anchor.cjs +47 -0
  272. package/dist/lib/geometry/anchor.d.ts +33 -0
  273. package/dist/lib/geometry/anchor.d.ts.map +1 -0
  274. package/dist/lib/geometry/bend.cjs +3 -3
  275. package/dist/lib/geometry/bend.d.ts +1 -1
  276. package/dist/lib/geometry/circle.cjs +9 -9
  277. package/dist/lib/geometry/circle.d.ts +4 -4
  278. package/dist/lib/geometry/circle.d.ts.map +1 -1
  279. package/dist/lib/geometry/{roundedContour.cjs → contour.cjs} +26 -35
  280. package/dist/lib/geometry/{roundedContour.d.ts → contour.d.ts} +9 -5
  281. package/dist/lib/geometry/contour.d.ts.map +1 -0
  282. package/dist/lib/geometry/diamond.cjs +16 -8
  283. package/dist/lib/geometry/diamond.d.ts +10 -4
  284. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  285. package/dist/lib/geometry/{_edge.cjs → edge.cjs} +1 -1
  286. package/dist/{es/geometry/_edge.d.ts → lib/geometry/edge.d.ts} +1 -1
  287. package/dist/lib/geometry/edge.d.ts.map +1 -0
  288. package/dist/lib/geometry/ellipse.cjs +10 -8
  289. package/dist/lib/geometry/ellipse.d.ts +3 -3
  290. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  291. package/dist/lib/geometry/index.d.ts +6 -1
  292. package/dist/lib/geometry/index.d.ts.map +1 -1
  293. package/dist/lib/geometry/point.cjs +17 -0
  294. package/dist/lib/geometry/point.d.ts +6 -0
  295. package/dist/lib/geometry/point.d.ts.map +1 -1
  296. package/dist/lib/geometry/rect.cjs +9 -22
  297. package/dist/lib/geometry/rect.d.ts +4 -17
  298. package/dist/lib/geometry/rect.d.ts.map +1 -1
  299. package/dist/lib/geometry/segment.cjs +48 -46
  300. package/dist/lib/geometry/segment.d.ts +7 -0
  301. package/dist/lib/geometry/segment.d.ts.map +1 -1
  302. package/dist/lib/geometry/{_transform.cjs → transform.cjs} +1 -1
  303. package/dist/{es/geometry/_transform.d.ts → lib/geometry/transform.d.ts} +1 -1
  304. package/dist/lib/geometry/transform.d.ts.map +1 -0
  305. package/dist/lib/index.cjs +35 -22
  306. package/dist/lib/index.d.ts +13 -13
  307. package/dist/lib/index.d.ts.map +1 -1
  308. package/dist/lib/ir/animation.cjs +6 -6
  309. package/dist/lib/ir/animation.d.ts +26 -125
  310. package/dist/lib/ir/animation.d.ts.map +1 -1
  311. package/dist/lib/ir/boundary.d.ts +4 -10
  312. package/dist/lib/ir/boundary.d.ts.map +1 -1
  313. package/dist/lib/ir/clip.d.ts +6 -46
  314. package/dist/lib/ir/clip.d.ts.map +1 -1
  315. package/dist/lib/ir/composite.d.ts +2 -14
  316. package/dist/lib/ir/composite.d.ts.map +1 -1
  317. package/dist/lib/ir/coordinate.cjs +1 -1
  318. package/dist/lib/ir/coordinate.d.ts +14 -50
  319. package/dist/lib/ir/coordinate.d.ts.map +1 -1
  320. package/dist/lib/ir/font.d.ts +10 -13
  321. package/dist/lib/ir/font.d.ts.map +1 -1
  322. package/dist/lib/ir/json.cjs +1 -1
  323. package/dist/lib/ir/json.d.ts +1 -1
  324. package/dist/lib/ir/json.d.ts.map +1 -1
  325. package/dist/lib/ir/node.cjs +23 -23
  326. package/dist/lib/ir/node.d.ts +175 -821
  327. package/dist/lib/ir/node.d.ts.map +1 -1
  328. package/dist/lib/ir/paint.cjs +10 -10
  329. package/dist/lib/ir/paint.d.ts +23 -100
  330. package/dist/lib/ir/paint.d.ts.map +1 -1
  331. package/dist/lib/ir/path/arrow.cjs +18 -16
  332. package/dist/lib/ir/path/arrow.d.ts +19 -131
  333. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  334. package/dist/lib/ir/path/path.cjs +4 -2
  335. package/dist/lib/ir/path/path.d.ts +519 -3065
  336. package/dist/lib/ir/path/path.d.ts.map +1 -1
  337. package/dist/lib/ir/path/step.cjs +74 -22
  338. package/dist/lib/ir/path/step.d.ts +929 -3474
  339. package/dist/lib/ir/path/step.d.ts.map +1 -1
  340. package/dist/lib/ir/path/target.cjs +3 -3
  341. package/dist/lib/ir/path/target.d.ts +40 -121
  342. package/dist/lib/ir/path/target.d.ts.map +1 -1
  343. package/dist/lib/ir/position/at-position.cjs +11 -11
  344. package/dist/lib/ir/position/at-position.d.ts +20 -28
  345. package/dist/lib/ir/position/at-position.d.ts.map +1 -1
  346. package/dist/lib/ir/position/offset-position.d.ts +2 -8
  347. package/dist/lib/ir/position/offset-position.d.ts.map +1 -1
  348. package/dist/lib/ir/scene.d.ts +17 -181
  349. package/dist/lib/ir/scene.d.ts.map +1 -1
  350. package/dist/lib/ir/scope.cjs +10 -7
  351. package/dist/lib/ir/scope.d.ts +315 -7291
  352. package/dist/lib/ir/scope.d.ts.map +1 -1
  353. package/dist/lib/ir/shape.d.ts +2 -8
  354. package/dist/lib/ir/shape.d.ts.map +1 -1
  355. package/dist/lib/ir/text.d.ts +24 -70
  356. package/dist/lib/ir/text.d.ts.map +1 -1
  357. package/dist/lib/ir/transform.cjs +11 -4
  358. package/dist/lib/ir/transform.d.ts +47 -144
  359. package/dist/lib/ir/transform.d.ts.map +1 -1
  360. package/dist/lib/parsers/index.d.ts +3 -3
  361. package/dist/lib/parsers/index.d.ts.map +1 -1
  362. package/dist/lib/parsers/{parseNodeTarget.cjs → node-target.cjs} +10 -8
  363. package/dist/lib/parsers/{parseNodeTarget.d.ts → node-target.d.ts} +1 -1
  364. package/dist/lib/parsers/node-target.d.ts.map +1 -0
  365. package/dist/lib/parsers/{parseTargetSugar.cjs → target-sugar.cjs} +9 -4
  366. package/dist/{es/parsers/parseTargetSugar.d.ts → lib/parsers/target-sugar.d.ts} +1 -1
  367. package/dist/lib/parsers/target-sugar.d.ts.map +1 -0
  368. package/dist/lib/parsers/{parseWay.cjs → way.cjs} +13 -9
  369. package/dist/{es/parsers/parseWay.d.ts → lib/parsers/way.d.ts} +2 -2
  370. package/dist/lib/parsers/way.d.ts.map +1 -0
  371. package/dist/lib/{pathGenerators → path-generators}/define.cjs +1 -1
  372. package/dist/lib/path-generators/define.d.ts.map +1 -0
  373. package/dist/lib/path-generators/index.d.ts.map +1 -0
  374. package/dist/lib/path-generators/types.d.ts.map +1 -0
  375. package/dist/lib/patterns/define.cjs +10 -0
  376. package/dist/lib/patterns/define.d.ts +9 -0
  377. package/dist/lib/patterns/define.d.ts.map +1 -0
  378. package/dist/lib/patterns/index.cjs +42 -35
  379. package/dist/lib/patterns/index.d.ts +1 -0
  380. package/dist/lib/patterns/index.d.ts.map +1 -1
  381. package/dist/lib/presets/animation.cjs +2 -2
  382. package/dist/lib/primitive/marker.d.ts +7 -7
  383. package/dist/lib/primitive/marker.d.ts.map +1 -1
  384. package/dist/lib/primitive/paint.d.ts +1 -1
  385. package/dist/lib/primitive/path.d.ts +1 -1
  386. package/dist/lib/shapes/arc.cjs +26 -7
  387. package/dist/lib/shapes/arc.d.ts.map +1 -1
  388. package/dist/lib/shapes/{_contour.cjs → contour.cjs} +14 -1
  389. package/dist/{es/shapes/_contour.d.ts → lib/shapes/contour.d.ts} +6 -3
  390. package/dist/lib/shapes/contour.d.ts.map +1 -0
  391. package/dist/lib/shapes/ellipse.cjs +2 -2
  392. package/dist/lib/shapes/index.cjs +1 -1
  393. package/dist/lib/shapes/index.d.ts +1 -1
  394. package/dist/lib/shapes/index.d.ts.map +1 -1
  395. package/dist/lib/shapes/polygon.cjs +29 -24
  396. package/dist/lib/shapes/polygon.d.ts +1 -1
  397. package/dist/lib/shapes/polygon.d.ts.map +1 -1
  398. package/dist/lib/shapes/rectangle.cjs +12 -12
  399. package/dist/lib/shapes/sector.cjs +41 -33
  400. package/dist/lib/shapes/sector.d.ts.map +1 -1
  401. package/dist/lib/shapes/{_shared.cjs → shared.cjs} +12 -15
  402. package/dist/lib/shapes/{_shared.d.ts → shared.d.ts} +7 -10
  403. package/dist/lib/shapes/shared.d.ts.map +1 -0
  404. package/dist/lib/shapes/star.cjs +9 -18
  405. package/dist/lib/shapes/star.d.ts.map +1 -1
  406. package/dist/lib/shapes/types.d.ts +10 -3
  407. package/dist/lib/shapes/types.d.ts.map +1 -1
  408. package/dist/lib/types.d.ts +1 -1
  409. package/package.json +3 -4
  410. package/dist/es/compile/lowerComposites.d.ts.map +0 -1
  411. package/dist/es/geometry/_edge.d.ts.map +0 -1
  412. package/dist/es/geometry/_transform.d.ts.map +0 -1
  413. package/dist/es/geometry/roundedContour.d.ts.map +0 -1
  414. package/dist/es/parsers/parseNodeTarget.d.ts.map +0 -1
  415. package/dist/es/parsers/parseTargetSugar.d.ts.map +0 -1
  416. package/dist/es/parsers/parseWay.d.ts.map +0 -1
  417. package/dist/es/pathGenerators/define.d.ts.map +0 -1
  418. package/dist/es/pathGenerators/index.d.ts.map +0 -1
  419. package/dist/es/pathGenerators/types.d.ts.map +0 -1
  420. package/dist/es/shapes/_contour.d.ts.map +0 -1
  421. package/dist/es/shapes/_shared.d.ts.map +0 -1
  422. package/dist/lib/compile/lowerComposites.d.ts.map +0 -1
  423. package/dist/lib/geometry/_edge.d.ts.map +0 -1
  424. package/dist/lib/geometry/_transform.d.ts.map +0 -1
  425. package/dist/lib/geometry/roundedContour.d.ts.map +0 -1
  426. package/dist/lib/parsers/parseNodeTarget.d.ts.map +0 -1
  427. package/dist/lib/parsers/parseTargetSugar.d.ts.map +0 -1
  428. package/dist/lib/parsers/parseWay.d.ts.map +0 -1
  429. package/dist/lib/pathGenerators/define.d.ts.map +0 -1
  430. package/dist/lib/pathGenerators/index.d.ts.map +0 -1
  431. package/dist/lib/pathGenerators/types.d.ts.map +0 -1
  432. package/dist/lib/shapes/_contour.d.ts.map +0 -1
  433. package/dist/lib/shapes/_shared.d.ts.map +0 -1
  434. /package/dist/es/{pathGenerators → path-generators}/define.d.ts +0 -0
  435. /package/dist/es/{pathGenerators → path-generators}/index.d.ts +0 -0
  436. /package/dist/es/{pathGenerators → path-generators}/types.d.ts +0 -0
  437. /package/dist/lib/{pathGenerators → path-generators}/define.d.ts +0 -0
  438. /package/dist/lib/{pathGenerators → path-generators}/index.d.ts +0 -0
  439. /package/dist/lib/{pathGenerators → path-generators}/types.d.ts +0 -0
@@ -1,37 +1,25 @@
1
- import { arcAngleInRange, rayArc } from "./arc.js";
2
- //#region src/geometry/roundedContour.ts
1
+ import { arcAngleInRange, arcEndPoint, rayArc } from "./arc.js";
2
+ import { point } from "./point.js";
3
+ //#region src/geometry/contour.ts
3
4
  var DEG_TO_RAD = Math.PI / 180;
4
5
  var RAD_TO_DEG = 180 / Math.PI;
5
6
  var EPSILON = 1e-9;
6
- /** 向量长度 */
7
- var length = (v) => Math.hypot(v[0], v[1]);
8
- /** 归一化(零向量回退 [1, 0]) */
9
- var normalize = (v) => {
10
- const len = length(v);
11
- if (len < EPSILON) return [1, 0];
12
- return [v[0] / len, v[1] / len];
13
- };
14
7
  /** 二维叉积 a × b */
15
8
  var cross = (a, b) => a[0] * b[1] - a[1] * b[0];
16
- /** 点 + 角度(度)→ 圆周点 */
17
- var arcPoint = (center, radius, angleDeg) => {
18
- const rad = angleDeg * DEG_TO_RAD;
19
- return [center[0] + Math.cos(rad) * radius, center[1] + Math.sin(rad) * radius];
20
- };
21
9
  /** 段起点 */
22
- var segmentStart = (seg) => seg.kind === "line" ? seg.from : arcPoint(seg.center, seg.radius, seg.startAngle);
10
+ var segmentStart = (seg) => seg.kind === "line" ? seg.from : arcEndPoint(seg.center, seg.radius, seg.startAngle);
23
11
  /** 段终点 */
24
- var segmentEnd = (seg) => seg.kind === "line" ? seg.to : arcPoint(seg.center, seg.radius, seg.endAngle);
12
+ var segmentEnd = (seg) => seg.kind === "line" ? seg.to : arcEndPoint(seg.center, seg.radius, seg.endAngle);
25
13
  /**
26
14
  * 段在某端的「行进切线」单位向量
27
15
  * @description atStart=true 取起点处沿行进方向的切线,否则取终点处。line 两端切线相同;
28
16
  * arc 切线垂直于半径,方向随 counterClockwise 翻转(CW: (-sinθ, cosθ),CCW: (sinθ, -cosθ))。
29
17
  */
30
18
  var tangentAt = (seg, atStart) => {
31
- if (seg.kind === "line") return normalize([seg.to[0] - seg.from[0], seg.to[1] - seg.from[1]]);
19
+ if (seg.kind === "line") return point.normalize([seg.to[0] - seg.from[0], seg.to[1] - seg.from[1]]);
32
20
  const rad = (atStart ? seg.startAngle : seg.endAngle) * DEG_TO_RAD;
33
21
  const sign = seg.counterClockwise ? -1 : 1;
34
- return normalize([-Math.sin(rad) * sign, Math.cos(rad) * sign]);
22
+ return point.normalize([-Math.sin(rad) * sign, Math.cos(rad) * sign]);
35
23
  };
36
24
  /** arc 段的角跨度(带符号:CW 为正递增、CCW 为负),单位度 */
37
25
  var arcSpan = (seg) => seg.endAngle - seg.startAngle;
@@ -44,7 +32,7 @@ var fractionAlong = (seg, p, fromStart) => {
44
32
  const ex = seg.to[0] - seg.from[0];
45
33
  const ey = seg.to[1] - seg.from[1];
46
34
  const len2 = ex * ex + ey * ey;
47
- if (len2 < EPSILON) return 0;
35
+ if (len2 < EPSILON * EPSILON) return 0;
48
36
  const t = ((p[0] - seg.from[0]) * ex + (p[1] - seg.from[1]) * ey) / len2;
49
37
  return fromStart ? t : 1 - t;
50
38
  }
@@ -167,9 +155,10 @@ var solveFillet = (segA, segB, r) => {
167
155
  const tInPt = tangentPointOn(segA, cand, radius);
168
156
  const tOutPt = tangentPointOn(segB, cand, radius);
169
157
  if (!tInPt || !tOutPt) continue;
158
+ const tol = 1e-6 * Math.max(1, radius, Math.abs(corner[0]), Math.abs(corner[1]));
170
159
  const dA = distanceToAny(segA, cand);
171
160
  const dB = distanceToAny(segB, cand);
172
- if (Math.abs(dA - radius) > 1e-6 || Math.abs(dB - radius) > 1e-6) continue;
161
+ if (Math.abs(dA - radius) > tol || Math.abs(dB - radius) > tol) continue;
173
162
  const inFrac = fractionAlong(segA, tInPt, false);
174
163
  const outFrac = fractionAlong(segB, tOutPt, true);
175
164
  if (inFrac < -1e-7 || inFrac > .5000001 || outFrac < -1e-7 || outFrac > .5000001) continue;
@@ -264,7 +253,8 @@ var tangentPointOn = (seg, filletCenter, radius) => {
264
253
  best = cand;
265
254
  }
266
255
  }
267
- return bestErr <= 1e-6 ? best : void 0;
256
+ const tol = 1e-6 * Math.max(1, radius, Math.abs(filletCenter[0]), Math.abs(filletCenter[1]));
257
+ return bestErr <= tol ? best : void 0;
268
258
  };
269
259
  /**
270
260
  * 对闭合轮廓的每个接缝做 fillet,返回 fillet 解算列表(与接缝一一对应,下标 i = 段 i 终点接段 (i+1)%n 起点)
@@ -287,10 +277,9 @@ var filletContour = (segments, cornerRadius) => {
287
277
  * fillet 出点」走到「本接缝的 fillet 入点」(line 缩短 / arc 裁剪角度),接缝处插 fillet 弧。
288
278
  * 夹紧到 0 的角不插弧、按原尖角连接。
289
279
  */
290
- var contourCommands = (segments, cornerRadius) => {
280
+ var contourCommands = (segments, cornerRadius, fillets = filletContour(segments, cornerRadius)) => {
291
281
  const n = segments.length;
292
282
  if (n === 0) return [];
293
- const fillets = filletContour(segments, cornerRadius);
294
283
  if (fillets.length === 0) {
295
284
  const cmds = [];
296
285
  segments.forEach((seg, i) => {
@@ -348,17 +337,19 @@ var emitSegmentBody = (seg, start, end, cmds) => {
348
337
  };
349
338
  /** 调整 endAngle 使「start→end」沿给定扫描方向(ccw: 递减 / 否则递增),保持裁剪后弧方向不变 */
350
339
  var alignSweep = (start, end, ccw) => {
351
- let e = end;
352
- if (ccw) {
353
- while (e > start) e -= 360;
354
- while (e <= start - 360) e += 360;
355
- } else {
356
- while (e < start) e += 360;
357
- while (e >= start + 360) e -= 360;
358
- }
340
+ const sweep = end - start;
341
+ if (sweep === 0) return {
342
+ start,
343
+ end: start
344
+ };
345
+ if (Math.abs(sweep) === 360) return {
346
+ start,
347
+ end: start + (ccw ? -360 : 360)
348
+ };
349
+ const normalized = (sweep % 360 + 360) % 360;
359
350
  return {
360
351
  start,
361
- end: e
352
+ end: start + (ccw ? normalized === 0 ? -360 : normalized - 360 : normalized === 0 ? 360 : normalized)
362
353
  };
363
354
  };
364
355
  /**
@@ -367,13 +358,12 @@ var alignSweep = (start, end, ccw) => {
367
358
  * 遍历 fillet 后的有效段(缩短 line / 裁剪 arc / fillet arc),对每段求 ray∩段、取最小正参数命中点。
368
359
  * cornerRadius 省略 / ≤0 → 走原尖角轮廓。无命中返回 undefined(调用方兜底)。
369
360
  */
370
- var boundaryFromContour = (segments, cornerRadius, rayOrigin, toward) => {
361
+ var boundaryFromContour = (segments, cornerRadius, rayOrigin, toward, fillets = filletContour(segments, cornerRadius)) => {
371
362
  const dirRaw = [toward[0] - rayOrigin[0], toward[1] - rayOrigin[1]];
372
- const dl = length(dirRaw);
363
+ const dl = point.length(dirRaw);
373
364
  if (dl < 1e-12) return void 0;
374
365
  const dir = [dirRaw[0] / dl, dirRaw[1] / dl];
375
366
  const n = segments.length;
376
- const fillets = filletContour(segments, cornerRadius);
377
367
  let best = Infinity;
378
368
  const considerLine = (a, b) => {
379
369
  const ex = b[0] - a[0];
@@ -414,4 +404,4 @@ var boundaryFromContour = (segments, cornerRadius, rayOrigin, toward) => {
414
404
  return [rayOrigin[0] + dir[0] * best, rayOrigin[1] + dir[1] * best];
415
405
  };
416
406
  //#endregion
417
- export { boundaryFromContour, contourCommands };
407
+ export { boundaryFromContour, contourCommands, filletContour };
@@ -1,6 +1,6 @@
1
- import { Side } from './_edge';
1
+ import { Side } from './edge';
2
+ import { CompassAnchorValue } from './anchor';
2
3
  import { Position } from './point';
3
- import { RectAnchor } from './rect';
4
4
  /** 菱形:中心 + halfA/halfB 半轴长 + 可选旋转;顶点在 (±halfA,0) 与 (0,±halfB) */
5
5
  export type Diamond = {
6
6
  x: number;
@@ -12,14 +12,20 @@ export type Diamond = {
12
12
  /** 绕中心旋转弧度 */
13
13
  rotate?: number;
14
14
  };
15
- /** 菱形相关基础工具 */
15
+ /**
16
+ * 菱形相关基础工具(独立几何原语)
17
+ * @description 注意:这是一套独立的菱形几何工具,**与 Node 的 diamond shape 不是同一条路径**——
18
+ * 后者已被 compile 规范化为 `polygon` preset(`{ sides: 4 }`),其 compass anchor 走外接 AABB 角。
19
+ * 本工具的 NE/NW/SE/SW anchor 取斜边中点(落在真实菱形边上),语义与 polygon 路径不同;
20
+ * 作为通用几何 API 保留,勿假设它与 Node diamond shape 行为一致。
21
+ */
16
22
  export declare const diamond: {
17
23
  /** 中心 */
18
24
  center: (d: Diamond) => Position;
19
25
  /** 点是否在菱形内(含边界,含旋转);方程 |x|/halfA + |y|/halfB ≤ 1 */
20
26
  contains: (d: Diamond, p: Position) => boolean;
21
27
  /** 9 个 anchor:N/S/E/W=顶点,NE/NW/SE/SW=边中点,center=中心 */
22
- anchor: (d: Diamond, name: RectAnchor) => Position;
28
+ anchor: (d: Diamond, name: CompassAnchorValue) => Position;
23
29
  /**
24
30
  * 从中心向 toward 方向射线与菱形 4 边的交点
25
31
  * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
@@ -1 +1 @@
1
- {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAqB,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAUzC,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C,sDAAsD;gBAC1C,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAOvD,yDAAyD;mBAC1C,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CASzD,CAAC"}
1
+ {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAqB,MAAM,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUxC,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAK5C,sDAAsD;gBAC1C,OAAO,QAAQ,kBAAkB,KAAG,QAAQ;IAqC1D;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAQvD,yDAAyD;mBAC1C,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CASzD,CAAC"}
@@ -1,5 +1,5 @@
1
- import { localToWorld, worldToLocal } from "./_transform.js";
2
- import { polylineViaVertex } from "./_edge.js";
1
+ import { polylineViaVertex } from "./edge.js";
2
+ import { localToWorld, worldToLocal } from "./transform.js";
3
3
  //#region src/geometry/diamond.ts
4
4
  /** 每条 side 的过顶点折线三 anchor:[邻边中点, cardinal 顶点, 邻边中点](方向 north/south=西→东、east/west=北→南) */
5
5
  var DIAMOND_EDGE = {
@@ -24,12 +24,19 @@ var DIAMOND_EDGE = {
24
24
  "south-west"
25
25
  ]
26
26
  };
27
- /** 菱形相关基础工具 */
27
+ /**
28
+ * 菱形相关基础工具(独立几何原语)
29
+ * @description 注意:这是一套独立的菱形几何工具,**与 Node 的 diamond shape 不是同一条路径**——
30
+ * 后者已被 compile 规范化为 `polygon` preset(`{ sides: 4 }`),其 compass anchor 走外接 AABB 角。
31
+ * 本工具的 NE/NW/SE/SW anchor 取斜边中点(落在真实菱形边上),语义与 polygon 路径不同;
32
+ * 作为通用几何 API 保留,勿假设它与 Node diamond shape 行为一致。
33
+ */
28
34
  var diamond = {
29
35
  /** 中心 */
30
36
  center: (d) => [d.x, d.y],
31
37
  /** 点是否在菱形内(含边界,含旋转);方程 |x|/halfA + |y|/halfB ≤ 1 */
32
38
  contains: (d, p) => {
39
+ if (d.halfA === 0 || d.halfB === 0) return false;
33
40
  const [lx, ly] = worldToLocal(d, p);
34
41
  return Math.abs(lx) / d.halfA + Math.abs(ly) / d.halfB <= 1.000000001;
35
42
  },
@@ -75,6 +82,7 @@ var diamond = {
75
82
  * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
76
83
  */
77
84
  boundaryPoint: (d, toward) => {
85
+ if (d.halfA === 0 || d.halfB === 0) return [d.x, d.y];
78
86
  const [lx, ly] = worldToLocal(d, toward);
79
87
  const denom = Math.abs(lx) / d.halfA + Math.abs(ly) / d.halfB;
80
88
  if (denom === 0) return [d.x, d.y];
@@ -26,4 +26,4 @@ export declare const edgeAngleDeg: (side: Side, t: number) => number;
26
26
  * p0/p1 为相邻边中点 anchor、vertex 为 cardinal 顶点 anchor——全落真实斜边
27
27
  */
28
28
  export declare const polylineViaVertex: (p0: Position, vertex: Position, p1: Position, t: number) => Position;
29
- //# sourceMappingURL=_edge.d.ts.map
29
+ //# sourceMappingURL=edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../../src/geometry/edge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,0DAA0D;AAC1D,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;CAK8D,CAAC;AAErF,yBAAyB;AACzB,eAAO,MAAM,SAAS,GAAI,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,KAAG,QAG/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,IAAI,EAAE,GAAG,MAAM,KAAG,MAWpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,IAAI,QAAQ,EACZ,QAAQ,QAAQ,EAChB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,QAA4F,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/geometry/_edge.ts
1
+ //#region src/geometry/edge.ts
2
2
  /**
3
3
  * rect 四直边 t=0 / t=1 端点对应的角 anchor
4
4
  * @description 方向约定单一真源:north/south = 西→东(t=0 在 west 端),east/west = 北→南(t=0 在 north 端)。
@@ -1,6 +1,6 @@
1
- import { Side } from './_edge';
1
+ import { Side } from './edge';
2
+ import { CompassAnchorValue } from './anchor';
2
3
  import { Position } from './point';
3
- import { RectAnchor } from './rect';
4
4
  /** 椭圆:中心 + 半长轴 rx / 半短轴 ry + 可选旋转 */
5
5
  export type Ellipse = {
6
6
  x: number;
@@ -22,7 +22,7 @@ export declare const ellipse: {
22
22
  * 9 个 anchor 的世界坐标
23
23
  * @description 对角(NE/NW/SE/SW)取参数曲线 t=π/4 处 (rx/√2, ry/√2),与 TikZ 椭圆 anchor 参数等分约定一致
24
24
  */
25
- anchor: (e: Ellipse, name: RectAnchor) => Position;
25
+ anchor: (e: Ellipse, name: CompassAnchorValue) => Position;
26
26
  /**
27
27
  * 从中心向 toward 方向射线与椭圆交点
28
28
  * @description 椭圆方程 (x/rx)² + (y/ry)² = 1;沿 (lx,ly) 缩放 t 倍命中 t = 1 / √((lx/rx)² + (ly/ry)²)
@@ -1 +1 @@
1
- {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAgB,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIzC,qCAAqC;AACrC,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI9C;;;OAGG;gBACW,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAQvD,qDAAqD;mBACtC,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAIzD,CAAC"}
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAgB,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,qCAAqC;AACrC,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAK9C;;;OAGG;gBACW,OAAO,QAAQ,kBAAkB,KAAG,QAAQ;IAqC1D;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IASvD,qDAAqD;mBACtC,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAIzD,CAAC"}
@@ -1,5 +1,5 @@
1
- import { localToWorld, worldToLocal } from "./_transform.js";
2
- import { edgeAngleDeg } from "./_edge.js";
1
+ import { edgeAngleDeg } from "./edge.js";
2
+ import { localToWorld, worldToLocal } from "./transform.js";
3
3
  //#region src/geometry/ellipse.ts
4
4
  var DEG_TO_RAD = Math.PI / 180;
5
5
  var SQRT_HALF = Math.SQRT1_2;
@@ -9,6 +9,7 @@ var ellipse = {
9
9
  center: (e) => [e.x, e.y],
10
10
  /** 判断点是否在椭圆内(含边界,考虑旋转) */
11
11
  contains: (e, p) => {
12
+ if (e.rx === 0 || e.ry === 0) return false;
12
13
  const [lx, ly] = worldToLocal(e, p);
13
14
  return lx * lx / (e.rx * e.rx) + ly * ly / (e.ry * e.ry) <= 1;
14
15
  },
@@ -57,6 +58,7 @@ var ellipse = {
57
58
  * @description 椭圆方程 (x/rx)² + (y/ry)² = 1;沿 (lx,ly) 缩放 t 倍命中 t = 1 / √((lx/rx)² + (ly/ry)²)
58
59
  */
59
60
  boundaryPoint: (e, toward) => {
61
+ if (e.rx === 0 || e.ry === 0) return [e.x, e.y];
60
62
  const [lx, ly] = worldToLocal(e, toward);
61
63
  if (lx === 0 && ly === 0) return [e.x, e.y];
62
64
  const a = lx / e.rx;
@@ -1,4 +1,5 @@
1
1
  export * from './point';
2
+ export * from './anchor';
2
3
  export * from './rect';
3
4
  export * from './circle';
4
5
  export * from './ellipse';
@@ -7,5 +8,9 @@ export * from './polar';
7
8
  export * from './bend';
8
9
  export * from './arc';
9
10
  export * from './segment';
10
- export * from './roundedContour';
11
+ export * from './contour';
12
+ export { EDGE_ENDS, lerpPoint, edgeAngleDeg, polylineViaVertex } from './edge';
13
+ export type { Side } from './edge';
14
+ export { localToWorld, worldToLocal } from './transform';
15
+ export type { CenteredShape } from './transform';
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/geometry/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/geometry/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC/E,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -9,6 +9,12 @@ export declare const point: {
9
9
  sub: (a: Position, b: Position) => Position;
10
10
  /** 等比缩放 a * k */
11
11
  scale: (a: Position, k: number) => Position;
12
+ /** 向量长度 */
13
+ length: (a: Position) => number;
14
+ /** 归一化向量;零长度 / 极短向量回退到 fallback */
15
+ normalize: (a: Position, fallback?: Position, epsilon?: number) => Position;
16
+ /** 把点 p 沿 target 方向移动 dist */
17
+ shiftToward: (p: Position, target: Position, dist: number) => Position;
12
18
  /** 两点精确相等(不带容差) */
13
19
  equal: (a: Position, b: Position) => boolean;
14
20
  /** 笛卡尔 → 极坐标(angle ∈ (-180,180],origin 默认 [0,0]) */
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/geometry/point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAS,MAAM,SAAS,CAAC;AAEpD,oBAAoB;AACpB,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIxC,wBAAwB;AACxB,eAAO,MAAM,KAAK;IAChB,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,iBAAiB;eACN,QAAQ,KAAK,MAAM,KAAG,QAAQ;IACzC,mBAAmB;eACR,QAAQ,KAAK,QAAQ,KAAG,OAAO;IAC1C,oDAAoD;iBACvC,QAAQ,KAAG,aAAa;IAIrC;;;;;OAKG;oBAEE,QAAQ,GAAG,aAAa,KACxB,QAAQ,GAAG,aAAa,yBAE1B,OAAO;CASX,CAAC"}
1
+ {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/geometry/point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAS,MAAM,SAAS,CAAC;AAEpD,oBAAoB;AACpB,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAKxC,wBAAwB;AACxB,eAAO,MAAM,KAAK;IAChB,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,iBAAiB;eACN,QAAQ,KAAK,MAAM,KAAG,QAAQ;IACzC,WAAW;gBACC,QAAQ,KAAG,MAAM;IAC7B,mCAAmC;mBAE9B,QAAQ,aACD,QAAQ,uBAEjB,QAAQ;IAKX,8BAA8B;qBACb,QAAQ,UAAU,QAAQ,QAAQ,MAAM,KAAG,QAAQ;IAOpE,mBAAmB;eACR,QAAQ,KAAK,QAAQ,KAAG,OAAO;IAC1C,oDAAoD;iBACvC,QAAQ,KAAG,aAAa;IAIrC;;;;;OAKG;oBAEE,QAAQ,GAAG,aAAa,KACxB,QAAQ,GAAG,aAAa,yBAE1B,OAAO;CASX,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { polar } from "./polar.js";
2
2
  //#region src/geometry/point.ts
3
3
  var RAD_TO_DEG = 180 / Math.PI;
4
+ var DEFAULT_EPSILON = 1e-9;
4
5
  /** 二维向量 / 坐标的基础运算工具集 */
5
6
  var point = {
6
7
  /** 向量加 a + b */
@@ -9,6 +10,22 @@ var point = {
9
10
  sub: (a, b) => [a[0] - b[0], a[1] - b[1]],
10
11
  /** 等比缩放 a * k */
11
12
  scale: (a, k) => [a[0] * k, a[1] * k],
13
+ /** 向量长度 */
14
+ length: (a) => Math.hypot(a[0], a[1]),
15
+ /** 归一化向量;零长度 / 极短向量回退到 fallback */
16
+ normalize: (a, fallback = [1, 0], epsilon = DEFAULT_EPSILON) => {
17
+ const len = Math.hypot(a[0], a[1]);
18
+ if (len < epsilon) return fallback;
19
+ return [a[0] / len, a[1] / len];
20
+ },
21
+ /** 把点 p 沿 target 方向移动 dist */
22
+ shiftToward: (p, target, dist) => {
23
+ if (dist === 0) return p;
24
+ const delta = [target[0] - p[0], target[1] - p[1]];
25
+ const dir = point.normalize(delta, [0, 0]);
26
+ if (point.equal(dir, [0, 0])) return p;
27
+ return [p[0] + dir[0] * dist, p[1] + dir[1] * dist];
28
+ },
12
29
  /** 两点精确相等(不带容差) */
13
30
  equal: (a, b) => a[0] === b[0] && a[1] === b[1],
14
31
  /** 笛卡尔 → 极坐标(angle ∈ (-180,180],origin 默认 [0,0]) */
@@ -1,4 +1,5 @@
1
- import { Side } from './_edge';
1
+ import { Side } from './edge';
2
+ import { CompassAnchorValue } from './anchor';
2
3
  import { Position } from './point';
3
4
  /** 轴对齐矩形:几何中心 + 宽高 + 可选绕中心旋转 */
4
5
  export type Rect = {
@@ -9,27 +10,13 @@ export type Rect = {
9
10
  /** 绕中心旋转弧度 */
10
11
  rotate?: number;
11
12
  };
12
- /** 矩形 9 个标准 anchor 名常量(与 RectAnchor 配对,用 RECT_ANCHORS.NORTH 避免拼错) */
13
- export declare const RECT_ANCHORS: {
14
- readonly CENTER: "center";
15
- readonly NORTH: "north";
16
- readonly SOUTH: "south";
17
- readonly EAST: "east";
18
- readonly WEST: "west";
19
- readonly NORTH_EAST: "north-east";
20
- readonly NORTH_WEST: "north-west";
21
- readonly SOUTH_EAST: "south-east";
22
- readonly SOUTH_WEST: "south-west";
23
- };
24
- /** 矩形 anchor 名(与 TikZ 命名一致) */
25
- export type RectAnchor = (typeof RECT_ANCHORS)[keyof typeof RECT_ANCHORS];
26
13
  export declare const rect: {
27
14
  /** 几何中心 */
28
15
  center: (r: Rect) => Position;
29
16
  /** 点是否在矩形内(含边界,含旋转) */
30
17
  contains: (r: Rect, p: Position) => boolean;
31
- /** 9 anchor 之一的世界坐标(含旋转),TikZ 命名 */
32
- anchor: (r: Rect, name: RectAnchor) => Position;
18
+ /** 9 个标准方位 anchor 之一的世界坐标(含旋转),TikZ 命名 */
19
+ anchor: (r: Rect, name: CompassAnchorValue) => Position;
33
20
  /** 从中心向 toward 方向射线与矩形边界交点(含旋转),Path 端点贴 Node 边界用 */
34
21
  boundaryPoint: (r: Rect, toward: Position) => Position;
35
22
  /** 边上比例点:side 直边 t∈[0,1] 处(两角 anchor 线性插值,含旋转);方向见 EDGE_ENDS */
@@ -1 +1 @@
1
- {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/geometry/rect.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,IAAI,EAAa,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,gCAAgC;AAChC,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,YAAY;;;;;;;;;;CAUf,CAAC;AAEX,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE1E,eAAO,MAAM,IAAI;IACf,WAAW;gBACC,IAAI,KAAG,QAAQ;IAC3B,uBAAuB;kBACT,IAAI,KAAK,QAAQ,KAAG,OAAO;IAMzC,sCAAsC;gBAC1B,IAAI,QAAQ,UAAU,KAAG,QAAQ;IAuC7C,qDAAqD;uBAClC,IAAI,UAAU,QAAQ,KAAG,QAAQ;IAUpD,gEAAgE;mBACjD,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAItD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,eAAe,MAAM,KACpB,KAAK,CAAC,aAAa,CAgCrB,CAAC"}
1
+ {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/geometry/rect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,IAAI,EAAa,MAAM,QAAQ,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,gCAAgC;AAChC,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,IAAI;IACf,WAAW;gBACC,IAAI,KAAG,QAAQ;IAC3B,uBAAuB;kBACT,IAAI,KAAK,QAAQ,KAAG,OAAO;IAMzC,0CAA0C;gBAC9B,IAAI,QAAQ,kBAAkB,KAAG,QAAQ;IAuCrD,qDAAqD;uBAClC,IAAI,UAAU,QAAQ,KAAG,QAAQ;IAUpD,gEAAgE;mBACjD,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAItD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,eAAe,MAAM,KACpB,KAAK,CAAC,aAAa,CAgCrB,CAAC"}
@@ -1,18 +1,6 @@
1
- import { localToWorld, worldToLocal } from "./_transform.js";
2
- import { EDGE_ENDS, lerpPoint } from "./_edge.js";
1
+ import { EDGE_ENDS, lerpPoint } from "./edge.js";
2
+ import { localToWorld, worldToLocal } from "./transform.js";
3
3
  //#region src/geometry/rect.ts
4
- /** 矩形 9 个标准 anchor 名常量(与 RectAnchor 配对,用 RECT_ANCHORS.NORTH 避免拼错) */
5
- var RECT_ANCHORS = {
6
- CENTER: "center",
7
- NORTH: "north",
8
- SOUTH: "south",
9
- EAST: "east",
10
- WEST: "west",
11
- NORTH_EAST: "north-east",
12
- NORTH_WEST: "north-west",
13
- SOUTH_EAST: "south-east",
14
- SOUTH_WEST: "south-west"
15
- };
16
4
  var rect = {
17
5
  /** 几何中心 */
18
6
  center: (r) => [r.x, r.y],
@@ -23,7 +11,7 @@ var rect = {
23
11
  const halfH = r.height / 2;
24
12
  return lx >= -halfW && lx <= halfW && ly >= -halfH && ly <= halfH;
25
13
  },
26
- /** 9 anchor 之一的世界坐标(含旋转),TikZ 命名 */
14
+ /** 9 个标准方位 anchor 之一的世界坐标(含旋转),TikZ 命名 */
27
15
  anchor: (r, name) => {
28
16
  const halfW = r.width / 2;
29
17
  const halfH = r.height / 2;
@@ -163,4 +151,4 @@ var rectOutline = (from, to, cornerRadius) => {
163
151
  ];
164
152
  };
165
153
  //#endregion
166
- export { RECT_ANCHORS, rect, rectOutline };
154
+ export { rect, rectOutline };
@@ -34,4 +34,11 @@ export declare const ellipseArcSegmentSample: (center: Position, rx: number, ry:
34
34
  export declare const circleSegmentSample: (center: Position, radius: number, t: number) => SegmentSample;
35
35
  /** 整椭圆,参数化 (rx·cos(2πt), ry·sin(2πt)) */
36
36
  export declare const ellipseSegmentSample: (center: Position, rx: number, ry: number, t: number) => SegmentSample;
37
+ /**
38
+ * 矩形周长段:两对角 → 闭合周长上 t∈[0,1] 的点 / 切线
39
+ * @description 4 条边按 rectOutline 的顺时针绕向(y-down:左上→右上→右下→左下→闭合回左上)均分参数,
40
+ * 每条边占 1/4 t;切线 = 该边方向。忽略 cornerRadius(采尖角折线周长),mark 落在直边上精确、
41
+ * 贴近圆角处略偏轮廓——对中段 marking 足够。退化(零宽 / 零高)由 lineSegmentSample 的零切线回退兜底。
42
+ */
43
+ export declare const rectPerimeterSample: (from: Position, to: Position, t: number) => SegmentSample;
37
44
  //# sourceMappingURL=segment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"segment.d.ts","sourceRoot":"","sources":["../../../src/geometry/segment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAiBxC;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,wBAAwB;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;AAQF,oBAAoB;AACpB,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAGD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,SAAS,QAAQ,EACjB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aASF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,IAAI,QAAQ,EACZ,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAqBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,QAAQ,QAAQ,EAChB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAGF,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,GAAG,MAAM,KACR,aAUF,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,GAClC,QAAQ,QAAQ,EAChB,IAAI,MAAM,EACV,IAAI,MAAM,EACV,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,GAAG,MAAM,KACR,aAUF,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,GAAG,MAAM,KACR,aASF,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,QAAQ,EAChB,IAAI,MAAM,EACV,IAAI,MAAM,EACV,GAAG,MAAM,KACR,aASF,CAAC"}
1
+ {"version":3,"file":"segment.d.ts","sourceRoot":"","sources":["../../../src/geometry/segment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,SAAS,CAAC;AAiB3D;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,wBAAwB;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;AAqBF,oBAAoB;AACpB,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAGD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,SAAS,QAAQ,EACjB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aASF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,IAAI,QAAQ,EACZ,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAqBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,QAAQ,QAAQ,EAChB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAGF,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,GAAG,MAAM,KACR,aAAwF,CAAC;AAE5F,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,GAClC,QAAQ,QAAQ,EAChB,IAAI,MAAM,EACV,IAAI,MAAM,EACV,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,GAAG,MAAM,KACR,aAAgF,CAAC;AAEpF,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,GAAG,MAAM,KACR,aAAoE,CAAC;AAExE,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,QAAQ,EAChB,IAAI,MAAM,EACV,IAAI,MAAM,EACV,GAAG,MAAM,KACR,aAA4D,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,aAkBF,CAAC"}
@@ -1,14 +1,20 @@
1
+ import { point } from "./point.js";
1
2
  //#region src/geometry/segment.ts
2
3
  var DEG_TO_RAD = Math.PI / 180;
3
- var normalize = (v) => {
4
- const len = Math.hypot(v[0], v[1]);
5
- if (len === 0) return [1, 0];
6
- return [v[0] / len, v[1] / len];
4
+ var sampleEllipseArc = (center, rx, ry, startAngleDeg, endAngleDeg, t) => {
5
+ const rad = (startAngleDeg + t * (endAngleDeg - startAngleDeg)) * DEG_TO_RAD;
6
+ const cos = Math.cos(rad);
7
+ const sin = Math.sin(rad);
8
+ const sweepSign = endAngleDeg >= startAngleDeg ? 1 : -1;
9
+ return {
10
+ point: [center[0] + rx * cos, center[1] + ry * sin],
11
+ tangent: point.normalize([-rx * sin * sweepSign, ry * cos * sweepSign])
12
+ };
7
13
  };
8
14
  /** 直线段 from → to */
9
15
  var lineSegmentSample = (from, to, t) => ({
10
16
  point: [from[0] + (to[0] - from[0]) * t, from[1] + (to[1] - from[1]) * t],
11
- tangent: normalize([to[0] - from[0], to[1] - from[1]])
17
+ tangent: point.normalize([to[0] - from[0], to[1] - from[1]])
12
18
  });
13
19
  /**
14
20
  * 二次贝塞尔 from → control → to
@@ -16,9 +22,12 @@ var lineSegmentSample = (from, to, t) => ({
16
22
  */
17
23
  var quadSegmentSample = (from, control, to, t) => {
18
24
  const u = 1 - t;
25
+ const point$1 = [u * u * from[0] + 2 * u * t * control[0] + t * t * to[0], u * u * from[1] + 2 * u * t * control[1] + t * t * to[1]];
26
+ const tx = 2 * u * (control[0] - from[0]) + 2 * t * (to[0] - control[0]);
27
+ const ty = 2 * u * (control[1] - from[1]) + 2 * t * (to[1] - control[1]);
19
28
  return {
20
- point: [u * u * from[0] + 2 * u * t * control[0] + t * t * to[0], u * u * from[1] + 2 * u * t * control[1] + t * t * to[1]],
21
- tangent: normalize([2 * u * (control[0] - from[0]) + 2 * t * (to[0] - control[0]), 2 * u * (control[1] - from[1]) + 2 * t * (to[1] - control[1])])
29
+ point: point$1,
30
+ tangent: point.normalize([tx, ty])
22
31
  };
23
32
  };
24
33
  /**
@@ -27,9 +36,12 @@ var quadSegmentSample = (from, control, to, t) => {
27
36
  */
28
37
  var cubicSegmentSample = (from, c1, c2, to, t) => {
29
38
  const u = 1 - t;
39
+ const point$2 = [u * u * u * from[0] + 3 * u * u * t * c1[0] + 3 * u * t * t * c2[0] + t * t * t * to[0], u * u * u * from[1] + 3 * u * u * t * c1[1] + 3 * u * t * t * c2[1] + t * t * t * to[1]];
40
+ const tx = 3 * u * u * (c1[0] - from[0]) + 6 * u * t * (c2[0] - c1[0]) + 3 * t * t * (to[0] - c2[0]);
41
+ const ty = 3 * u * u * (c1[1] - from[1]) + 6 * u * t * (c2[1] - c1[1]) + 3 * t * t * (to[1] - c2[1]);
30
42
  return {
31
- point: [u * u * u * from[0] + 3 * u * u * t * c1[0] + 3 * u * t * t * c2[0] + t * t * t * to[0], u * u * u * from[1] + 3 * u * u * t * c1[1] + 3 * u * t * t * c2[1] + t * t * t * to[1]],
32
- tangent: normalize([3 * u * u * (c1[0] - from[0]) + 6 * u * t * (c2[0] - c1[0]) + 3 * t * t * (to[0] - c2[0]), 3 * u * u * (c1[1] - from[1]) + 6 * u * t * (c2[1] - c1[1]) + 3 * t * t * (to[1] - c2[1])])
43
+ point: point$2,
44
+ tangent: point.normalize([tx, ty])
33
45
  };
34
46
  };
35
47
  /**
@@ -41,46 +53,35 @@ var foldSegmentSample = (from, corner, to, t) => {
41
53
  return lineSegmentSample(corner, to, t * 2 - 1);
42
54
  };
43
55
  /** 弧段(角度度数,与 ir/path arc 同约定);切线沿扫描方向:endAngle ≥ start 取 (-sin,cos),否则反向 */
44
- var arcSegmentSample = (center, radius, startAngleDeg, endAngleDeg, t) => {
45
- const rad = (startAngleDeg + t * (endAngleDeg - startAngleDeg)) * DEG_TO_RAD;
46
- const cos = Math.cos(rad);
47
- const sin = Math.sin(rad);
48
- const sweepSign = endAngleDeg >= startAngleDeg ? 1 : -1;
49
- return {
50
- point: [center[0] + radius * cos, center[1] + radius * sin],
51
- tangent: normalize([-sin * sweepSign, cos * sweepSign])
52
- };
53
- };
56
+ var arcSegmentSample = (center, radius, startAngleDeg, endAngleDeg, t) => sampleEllipseArc(center, radius, radius, startAngleDeg, endAngleDeg, t);
54
57
  /** 椭圆弧段(参数角度数,与 ir/path arc 同约定);点用 (rx·cos, ry·sin),切线沿扫描方向 */
55
- var ellipseArcSegmentSample = (center, rx, ry, startAngleDeg, endAngleDeg, t) => {
56
- const rad = (startAngleDeg + t * (endAngleDeg - startAngleDeg)) * DEG_TO_RAD;
57
- const cos = Math.cos(rad);
58
- const sin = Math.sin(rad);
59
- const sweepSign = endAngleDeg >= startAngleDeg ? 1 : -1;
60
- return {
61
- point: [center[0] + rx * cos, center[1] + ry * sin],
62
- tangent: normalize([-rx * sin * sweepSign, ry * cos * sweepSign])
63
- };
64
- };
58
+ var ellipseArcSegmentSample = (center, rx, ry, startAngleDeg, endAngleDeg, t) => sampleEllipseArc(center, rx, ry, startAngleDeg, endAngleDeg, t);
65
59
  /** 整圆,从 0°(east) 开始,与 compile/path circlePath 输出方向(右→左→右,sweep=1)一致 */
66
- var circleSegmentSample = (center, radius, t) => {
67
- const rad = t * 360 * DEG_TO_RAD;
68
- const cos = Math.cos(rad);
69
- const sin = Math.sin(rad);
70
- return {
71
- point: [center[0] + radius * cos, center[1] + radius * sin],
72
- tangent: normalize([-sin, cos])
73
- };
74
- };
60
+ var circleSegmentSample = (center, radius, t) => sampleEllipseArc(center, radius, radius, 0, 360, t);
75
61
  /** 整椭圆,参数化 (rx·cos(2πt), ry·sin(2πt)) */
76
- var ellipseSegmentSample = (center, rx, ry, t) => {
77
- const rad = t * 360 * DEG_TO_RAD;
78
- const cos = Math.cos(rad);
79
- const sin = Math.sin(rad);
80
- return {
81
- point: [center[0] + rx * cos, center[1] + ry * sin],
82
- tangent: normalize([-rx * sin, ry * cos])
83
- };
62
+ var ellipseSegmentSample = (center, rx, ry, t) => sampleEllipseArc(center, rx, ry, 0, 360, t);
63
+ /**
64
+ * 矩形周长段:两对角 闭合周长上 t∈[0,1] 的点 / 切线
65
+ * @description 4 条边按 rectOutline 的顺时针绕向(y-down:左上→右上→右下→左下→闭合回左上)均分参数,
66
+ * 每条边占 1/4 t;切线 = 该边方向。忽略 cornerRadius(采尖角折线周长),mark 落在直边上精确、
67
+ * 贴近圆角处略偏轮廓——对中段 marking 足够。退化(零宽 / 零高)由 lineSegmentSample 的零切线回退兜底。
68
+ */
69
+ var rectPerimeterSample = (from, to, t) => {
70
+ const x0 = Math.min(from[0], to[0]);
71
+ const x1 = Math.max(from[0], to[0]);
72
+ const y0 = Math.min(from[1], to[1]);
73
+ const y1 = Math.max(from[1], to[1]);
74
+ const corners = [
75
+ [x0, y0],
76
+ [x1, y0],
77
+ [x1, y1],
78
+ [x0, y1],
79
+ [x0, y0]
80
+ ];
81
+ const scaled = (t <= 0 ? 0 : t >= 1 ? 1 : t) * 4;
82
+ const edge = Math.min(Math.floor(scaled), 3);
83
+ const localT = scaled - edge;
84
+ return lineSegmentSample(corners[edge], corners[edge + 1], localT);
84
85
  };
85
86
  //#endregion
86
- export { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample };
87
+ export { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample, rectPerimeterSample };
@@ -18,4 +18,4 @@ export declare const localToWorld: (s: CenteredShape, local: Position) => Positi
18
18
  * @description 先反平移到中心、再反旋转回本地基;旋转矩阵转置即逆
19
19
  */
20
20
  export declare const worldToLocal: (s: CenteredShape, world: Position) => Position;
21
- //# sourceMappingURL=_transform.d.ts.map
21
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,aAAa,EAAE,OAAO,QAAQ,KAAG,QAShE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,aAAa,EAAE,OAAO,QAAQ,KAAG,QAQhE,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/geometry/_transform.ts
1
+ //#region src/geometry/transform.ts
2
2
  /**
3
3
  * 本地坐标(以中心为原点)→ 世界坐标
4
4
  * @description rotate=0 / 缺省时退化为平移;非零时按右手系绕中心旋转后再平移