@meta2d/core 1.0.56 → 1.0.57

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 (299) hide show
  1. package/{index.ts → index.d.ts} +9 -9
  2. package/index.js +10 -0
  3. package/index.js.map +1 -0
  4. package/package.json +38 -39
  5. package/src/canvas/canvas.d.ts +456 -0
  6. package/src/canvas/canvas.js +7584 -0
  7. package/src/canvas/canvas.js.map +1 -0
  8. package/src/canvas/canvasImage.d.ts +27 -0
  9. package/src/canvas/canvasImage.js +441 -0
  10. package/src/canvas/canvasImage.js.map +1 -0
  11. package/src/canvas/canvasTemplate.d.ts +18 -0
  12. package/src/canvas/canvasTemplate.js +209 -0
  13. package/src/canvas/canvasTemplate.js.map +1 -0
  14. package/src/canvas/{index.ts → index.d.ts} +2 -2
  15. package/src/canvas/index.js +3 -0
  16. package/src/canvas/index.js.map +1 -0
  17. package/src/canvas/magnifierCanvas.d.ts +19 -0
  18. package/src/canvas/magnifierCanvas.js +102 -0
  19. package/src/canvas/magnifierCanvas.js.map +1 -0
  20. package/src/canvas/offscreen.d.ts +1 -0
  21. package/src/canvas/offscreen.js +14 -0
  22. package/src/canvas/offscreen.js.map +1 -0
  23. package/src/core.d.ts +479 -0
  24. package/src/core.js +4590 -0
  25. package/src/core.js.map +1 -0
  26. package/src/data.d.ts +34 -0
  27. package/src/data.js +85 -0
  28. package/src/data.js.map +1 -0
  29. package/src/diagrams/arrow.d.ts +4 -0
  30. package/src/diagrams/arrow.js +47 -0
  31. package/src/diagrams/arrow.js.map +1 -0
  32. package/src/diagrams/circle.d.ts +2 -0
  33. package/src/diagrams/circle.js +9 -0
  34. package/src/diagrams/circle.js.map +1 -0
  35. package/src/diagrams/cloud.d.ts +2 -0
  36. package/src/diagrams/cloud.js +12 -0
  37. package/src/diagrams/cloud.js.map +1 -0
  38. package/src/diagrams/cube.d.ts +2 -0
  39. package/src/diagrams/cube.js +68 -0
  40. package/src/diagrams/cube.js.map +1 -0
  41. package/src/diagrams/diamond.d.ts +2 -0
  42. package/src/diagrams/diamond.js +13 -0
  43. package/src/diagrams/diamond.js.map +1 -0
  44. package/src/diagrams/file.d.ts +2 -0
  45. package/src/diagrams/file.js +18 -0
  46. package/src/diagrams/file.js.map +1 -0
  47. package/src/diagrams/gif.d.ts +5 -0
  48. package/src/diagrams/gif.js +89 -0
  49. package/src/diagrams/gif.js.map +1 -0
  50. package/src/diagrams/hexagon.d.ts +2 -0
  51. package/src/diagrams/{hexagon.ts → hexagon.js} +55 -60
  52. package/src/diagrams/hexagon.js.map +1 -0
  53. package/src/diagrams/iframe.d.ts +2 -0
  54. package/src/diagrams/iframe.js +338 -0
  55. package/src/diagrams/iframe.js.map +1 -0
  56. package/src/diagrams/index.d.ts +71 -0
  57. package/src/diagrams/{index.ts → index.js} +77 -79
  58. package/src/diagrams/index.js.map +1 -0
  59. package/src/diagrams/line/arrow.d.ts +2 -0
  60. package/src/diagrams/line/arrow.js +128 -0
  61. package/src/diagrams/line/arrow.js.map +1 -0
  62. package/src/diagrams/line/curve.d.ts +16 -0
  63. package/src/diagrams/line/curve.js +227 -0
  64. package/src/diagrams/line/curve.js.map +1 -0
  65. package/src/diagrams/line/{index.ts → index.d.ts} +5 -5
  66. package/src/diagrams/line/index.js +6 -0
  67. package/src/diagrams/line/index.js.map +1 -0
  68. package/src/diagrams/line/line.d.ts +42 -0
  69. package/src/diagrams/line/line.js +370 -0
  70. package/src/diagrams/line/line.js.map +1 -0
  71. package/src/diagrams/line/polyline.d.ts +10 -0
  72. package/src/diagrams/line/polyline.js +627 -0
  73. package/src/diagrams/line/polyline.js.map +1 -0
  74. package/src/diagrams/line/smooth.d.ts +3 -0
  75. package/src/diagrams/line/smooth.js +136 -0
  76. package/src/diagrams/line/smooth.js.map +1 -0
  77. package/src/diagrams/message.d.ts +2 -0
  78. package/src/diagrams/message.js +15 -0
  79. package/src/diagrams/message.js.map +1 -0
  80. package/src/diagrams/mindLine.d.ts +3 -0
  81. package/src/diagrams/mindLine.js +30 -0
  82. package/src/diagrams/mindLine.js.map +1 -0
  83. package/src/diagrams/mindNode.d.ts +3 -0
  84. package/src/diagrams/mindNode.js +161 -0
  85. package/src/diagrams/mindNode.js.map +1 -0
  86. package/src/diagrams/panel.d.ts +2 -0
  87. package/src/diagrams/panel.js +131 -0
  88. package/src/diagrams/panel.js.map +1 -0
  89. package/src/diagrams/pentagon.d.ts +3 -0
  90. package/src/diagrams/pentagon.js +45 -0
  91. package/src/diagrams/pentagon.js.map +1 -0
  92. package/src/diagrams/pentagram.d.ts +3 -0
  93. package/src/diagrams/pentagram.js +51 -0
  94. package/src/diagrams/pentagram.js.map +1 -0
  95. package/src/diagrams/people.d.ts +2 -0
  96. package/src/diagrams/people.js +19 -0
  97. package/src/diagrams/people.js.map +1 -0
  98. package/src/diagrams/rectangle.d.ts +3 -0
  99. package/src/diagrams/rectangle.js +26 -0
  100. package/src/diagrams/rectangle.js.map +1 -0
  101. package/src/diagrams/svg/parse.d.ts +15 -0
  102. package/src/diagrams/svg/parse.js +279 -0
  103. package/src/diagrams/svg/parse.js.map +1 -0
  104. package/src/diagrams/svgPath.d.ts +2 -0
  105. package/src/diagrams/svgPath.js +29 -0
  106. package/src/diagrams/svgPath.js.map +1 -0
  107. package/src/diagrams/triangle.d.ts +3 -0
  108. package/src/diagrams/triangle.js +40 -0
  109. package/src/diagrams/triangle.js.map +1 -0
  110. package/src/diagrams/video.d.ts +5 -0
  111. package/src/diagrams/video.js +184 -0
  112. package/src/diagrams/video.js.map +1 -0
  113. package/src/dialog/dialog.d.ts +21 -0
  114. package/src/dialog/dialog.js +157 -0
  115. package/src/dialog/dialog.js.map +1 -0
  116. package/src/dialog/{index.ts → index.d.ts} +1 -1
  117. package/src/dialog/index.js +2 -0
  118. package/src/dialog/index.js.map +1 -0
  119. package/src/event/event.d.ts +102 -0
  120. package/src/event/event.js +22 -0
  121. package/src/event/event.js.map +1 -0
  122. package/src/event/{index.ts → index.d.ts} +1 -1
  123. package/src/event/index.js +2 -0
  124. package/src/event/index.js.map +1 -0
  125. package/src/map/{index.ts → index.d.ts} +1 -1
  126. package/src/map/index.js +2 -0
  127. package/src/map/index.js.map +1 -0
  128. package/src/map/map.d.ts +21 -0
  129. package/src/map/map.js +212 -0
  130. package/src/map/map.js.map +1 -0
  131. package/src/options.d.ts +130 -0
  132. package/src/options.js +80 -0
  133. package/src/options.js.map +1 -0
  134. package/src/pen/arrow.d.ts +4 -0
  135. package/src/pen/arrow.js +188 -0
  136. package/src/pen/arrow.js.map +1 -0
  137. package/src/pen/{index.ts → index.d.ts} +6 -6
  138. package/src/pen/index.js +7 -0
  139. package/src/pen/index.js.map +1 -0
  140. package/src/pen/math.d.ts +28 -0
  141. package/src/pen/math.js +213 -0
  142. package/src/pen/math.js.map +1 -0
  143. package/src/pen/model.d.ts +514 -0
  144. package/src/pen/model.js +210 -0
  145. package/src/pen/model.js.map +1 -0
  146. package/src/pen/plugin.d.ts +5 -0
  147. package/src/pen/plugin.js +58 -0
  148. package/src/pen/plugin.js.map +1 -0
  149. package/src/pen/render.d.ts +146 -0
  150. package/src/pen/render.js +3234 -0
  151. package/src/pen/render.js.map +1 -0
  152. package/src/pen/text.d.ts +8 -0
  153. package/src/pen/text.js +316 -0
  154. package/src/pen/text.js.map +1 -0
  155. package/src/pen/utils.d.ts +2 -0
  156. package/src/pen/utils.js +19 -0
  157. package/src/pen/utils.js.map +1 -0
  158. package/src/point/{index.ts → index.d.ts} +1 -1
  159. package/src/point/index.js +2 -0
  160. package/src/point/index.js.map +1 -0
  161. package/src/point/point.d.ts +65 -0
  162. package/src/point/point.js +178 -0
  163. package/src/point/point.js.map +1 -0
  164. package/src/rect/{index.ts → index.d.ts} +1 -1
  165. package/src/rect/index.js +2 -0
  166. package/src/rect/index.js.map +1 -0
  167. package/src/rect/rect.d.ts +52 -0
  168. package/src/rect/rect.js +427 -0
  169. package/src/rect/rect.js.map +1 -0
  170. package/src/rect/triangle.d.ts +2 -0
  171. package/src/rect/triangle.js +10 -0
  172. package/src/rect/triangle.js.map +1 -0
  173. package/src/scroll/{index.ts → index.d.ts} +1 -1
  174. package/src/scroll/index.js +2 -0
  175. package/src/scroll/index.js.map +1 -0
  176. package/src/scroll/scroll.d.ts +35 -0
  177. package/src/scroll/scroll.js +234 -0
  178. package/src/scroll/scroll.js.map +1 -0
  179. package/src/store/global.d.ts +25 -0
  180. package/src/store/global.js +18 -0
  181. package/src/store/global.js.map +1 -0
  182. package/src/store/{index.ts → index.d.ts} +2 -2
  183. package/src/store/index.js +3 -0
  184. package/src/store/index.js.map +1 -0
  185. package/src/store/store.d.ts +228 -0
  186. package/src/store/store.js +87 -0
  187. package/src/store/store.js.map +1 -0
  188. package/src/theme.d.ts +13 -0
  189. package/src/theme.js +23 -0
  190. package/src/theme.js.map +1 -0
  191. package/src/title/{index.ts → index.d.ts} +1 -1
  192. package/src/title/index.js +2 -0
  193. package/src/title/index.js.map +1 -0
  194. package/src/title/title.d.ts +30 -0
  195. package/src/title/title.js +99 -0
  196. package/src/title/title.js.map +1 -0
  197. package/src/tooltip/{index.ts → index.d.ts} +1 -1
  198. package/src/tooltip/index.js +2 -0
  199. package/src/tooltip/index.js.map +1 -0
  200. package/src/tooltip/tooltip.d.ts +40 -0
  201. package/src/tooltip/tooltip.js +172 -0
  202. package/src/tooltip/tooltip.js.map +1 -0
  203. package/src/utils/clone.d.ts +8 -0
  204. package/src/utils/clone.js +84 -0
  205. package/src/utils/clone.js.map +1 -0
  206. package/src/utils/color.d.ts +3 -0
  207. package/src/utils/color.js +110 -0
  208. package/src/utils/color.js.map +1 -0
  209. package/src/utils/error.d.ts +2 -0
  210. package/src/utils/error.js +6 -0
  211. package/src/utils/error.js.map +1 -0
  212. package/src/utils/file.d.ts +3 -0
  213. package/src/utils/file.js +40 -0
  214. package/src/utils/file.js.map +1 -0
  215. package/src/utils/{index.ts → index.d.ts} +9 -9
  216. package/src/utils/index.js +10 -0
  217. package/src/utils/index.js.map +1 -0
  218. package/src/utils/math.d.ts +18 -0
  219. package/src/utils/math.js +114 -0
  220. package/src/utils/math.js.map +1 -0
  221. package/src/utils/object.d.ts +2 -0
  222. package/src/utils/object.js +21 -0
  223. package/src/utils/object.js.map +1 -0
  224. package/src/utils/padding.d.ts +7 -0
  225. package/src/utils/padding.js +47 -0
  226. package/src/utils/padding.js.map +1 -0
  227. package/src/utils/time.d.ts +1 -0
  228. package/src/utils/time.js +17 -0
  229. package/src/utils/time.js.map +1 -0
  230. package/src/utils/url.d.ts +4 -0
  231. package/src/utils/url.js +27 -0
  232. package/src/utils/url.js.map +1 -0
  233. package/src/utils/uuid.d.ts +4 -0
  234. package/src/utils/uuid.js +13 -0
  235. package/src/utils/uuid.js.map +1 -0
  236. package/README.md +0 -13
  237. package/package.build.json +0 -39
  238. package/src/canvas/canvas.ts +0 -8639
  239. package/src/canvas/canvasImage.ts +0 -525
  240. package/src/canvas/canvasTemplate.ts +0 -257
  241. package/src/canvas/magnifierCanvas.ts +0 -142
  242. package/src/canvas/offscreen.ts +0 -14
  243. package/src/core.ts +0 -5128
  244. package/src/data.ts +0 -86
  245. package/src/diagrams/arrow.ts +0 -50
  246. package/src/diagrams/circle.ts +0 -19
  247. package/src/diagrams/cloud.ts +0 -34
  248. package/src/diagrams/cube.ts +0 -94
  249. package/src/diagrams/diamond.ts +0 -14
  250. package/src/diagrams/file.ts +0 -19
  251. package/src/diagrams/gif.ts +0 -105
  252. package/src/diagrams/iframe.ts +0 -365
  253. package/src/diagrams/line/arrow.ts +0 -175
  254. package/src/diagrams/line/curve.ts +0 -260
  255. package/src/diagrams/line/line.ts +0 -409
  256. package/src/diagrams/line/polyline.ts +0 -676
  257. package/src/diagrams/line/smooth.ts +0 -133
  258. package/src/diagrams/message.ts +0 -17
  259. package/src/diagrams/mindLine.ts +0 -31
  260. package/src/diagrams/mindNode.ts +0 -177
  261. package/src/diagrams/panel.ts +0 -149
  262. package/src/diagrams/pentagon.ts +0 -48
  263. package/src/diagrams/pentagram.ts +0 -63
  264. package/src/diagrams/people.ts +0 -23
  265. package/src/diagrams/rectangle.ts +0 -29
  266. package/src/diagrams/svg/parse.ts +0 -319
  267. package/src/diagrams/svgPath.ts +0 -53
  268. package/src/diagrams/triangle.ts +0 -43
  269. package/src/diagrams/video.ts +0 -202
  270. package/src/dialog/dialog.ts +0 -177
  271. package/src/event/event.ts +0 -142
  272. package/src/map/map.ts +0 -239
  273. package/src/options.ts +0 -205
  274. package/src/pen/arrow.ts +0 -259
  275. package/src/pen/math.ts +0 -253
  276. package/src/pen/model.ts +0 -785
  277. package/src/pen/plugin.ts +0 -57
  278. package/src/pen/render.ts +0 -3725
  279. package/src/pen/text.ts +0 -341
  280. package/src/pen/utils.ts +0 -21
  281. package/src/point/point.ts +0 -232
  282. package/src/rect/rect.ts +0 -507
  283. package/src/rect/triangle.ts +0 -16
  284. package/src/scroll/scroll.ts +0 -277
  285. package/src/store/global.ts +0 -38
  286. package/src/store/store.ts +0 -293
  287. package/src/theme.ts +0 -35
  288. package/src/title/title.ts +0 -115
  289. package/src/tooltip/tooltip.ts +0 -199
  290. package/src/utils/clone.ts +0 -79
  291. package/src/utils/color.ts +0 -126
  292. package/src/utils/error.ts +0 -7
  293. package/src/utils/file.ts +0 -46
  294. package/src/utils/math.ts +0 -120
  295. package/src/utils/object.ts +0 -23
  296. package/src/utils/padding.ts +0 -48
  297. package/src/utils/time.ts +0 -25
  298. package/src/utils/url.ts +0 -30
  299. package/src/utils/uuid.ts +0 -15
@@ -1,260 +0,0 @@
1
- import { Direction } from '../../data';
2
- import { facePen, getToAnchor, Pen } from '../../pen';
3
- import { distance, Point, PrevNextType, rotatePoint } from '../../point';
4
- import { Meta2dStore } from '../../store';
5
- import { s8 } from '../../utils';
6
-
7
- export function curve(store: Meta2dStore, pen: Pen, mousedwon?: Point) {
8
- if (!pen.calculative.worldAnchors) {
9
- pen.calculative.worldAnchors = [];
10
- }
11
-
12
- if (mousedwon) {
13
- if (pen.calculative.activeAnchor) {
14
- pen.calculative.activeAnchor.next = {
15
- penId: pen.id,
16
- x: mousedwon.x,
17
- y: mousedwon.y,
18
- };
19
- if (
20
- distance(
21
- pen.calculative.activeAnchor.next,
22
- pen.calculative.activeAnchor
23
- ) < 5
24
- ) {
25
- pen.calculative.activeAnchor.next = undefined;
26
- } else {
27
- pen.calculative.activeAnchor.prev = {
28
- ...pen.calculative.activeAnchor.next,
29
- };
30
- rotatePoint(
31
- pen.calculative.activeAnchor.prev,
32
- 180,
33
- pen.calculative.activeAnchor
34
- );
35
- }
36
- }
37
- } else {
38
- const from = pen.calculative.worldAnchors[0];
39
- if (!from.next) {
40
- const fromFace = facePen(from, store.pens[from.connectTo]);
41
- calcCurveCP(from, fromFace, 50);
42
- from.prev = undefined;
43
- }
44
-
45
- const to =
46
- pen.calculative.worldAnchors[pen.calculative.worldAnchors.length - 1];
47
- if (to && to !== from && !to.prev) {
48
- const toFace = facePen(to, store.pens[to.connectTo]);
49
- calcCurveCP(to, toFace, -50);
50
- to.next = undefined;
51
- }
52
- }
53
- }
54
-
55
- function calcCurveCP(pt: Point, d: Direction, dis: number) {
56
- switch (d) {
57
- case Direction.Up:
58
- pt.prev = {
59
- penId: pt.penId,
60
- x: pt.x,
61
- y: pt.y + dis,
62
- };
63
- pt.next = {
64
- penId: pt.penId,
65
- x: pt.x,
66
- y: pt.y - dis,
67
- };
68
- break;
69
- case Direction.Right:
70
- pt.prev = {
71
- penId: pt.penId,
72
- x: pt.x - dis,
73
- y: pt.y,
74
- };
75
- pt.next = {
76
- penId: pt.penId,
77
- x: pt.x + dis,
78
- y: pt.y,
79
- };
80
- break;
81
- case Direction.Bottom:
82
- pt.prev = {
83
- penId: pt.penId,
84
- x: pt.x,
85
- y: pt.y - dis,
86
- };
87
- pt.next = {
88
- penId: pt.penId,
89
- x: pt.x,
90
- y: pt.y + dis,
91
- };
92
- break;
93
- case Direction.Left:
94
- pt.prev = {
95
- penId: pt.penId,
96
- x: pt.x + dis,
97
- y: pt.y,
98
- };
99
- pt.next = {
100
- penId: pt.penId,
101
- x: pt.x - dis,
102
- y: pt.y,
103
- };
104
- break;
105
- }
106
- }
107
-
108
- // Get a point in quadratic.
109
- // pos - The position of point in quadratic. It is expressed as a percentage(0 - 1).
110
- export function getQuadraticPoint(
111
- step: number,
112
- from: Point,
113
- cp: Point,
114
- to: Point
115
- ) {
116
- const pos = 1 - step;
117
- const x = pos * pos * from.x + 2 * pos * step * cp.x + step * step * to.x;
118
- const y = pos * pos * from.y + 2 * pos * step * cp.y + step * step * to.y;
119
- return { x, y, step };
120
- }
121
-
122
- // Get a point in bezier.
123
- // pos - The position of point in bezier. It is expressed as a percentage(0 - 1).
124
- export function getBezierPoint(
125
- step: number,
126
- from: Point,
127
- cp1: Point,
128
- cp2: Point,
129
- to: Point
130
- ) {
131
- const { x: x1, y: y1 } = from;
132
- const { x: x2, y: y2 } = to;
133
- const { x: cx1, y: cy1 } = cp1;
134
- const { x: cx2, y: cy2 } = cp2;
135
-
136
- const pos = 1 - step;
137
- const x =
138
- x1 * pos * pos * pos +
139
- 3 * cx1 * step * pos * pos +
140
- 3 * cx2 * step * step * pos +
141
- x2 * step * step * step;
142
- const y =
143
- y1 * pos * pos * pos +
144
- 3 * cy1 * step * pos * pos +
145
- 3 * cy2 * step * step * pos +
146
- y2 * step * step * step;
147
- return { x, y, step };
148
- }
149
-
150
- function lerp(pt1: Point, pt2: Point, t: number) {
151
- return {
152
- x: pt1.x + t * (pt2.x - pt1.x),
153
- y: pt1.y + t * (pt2.y - pt1.y),
154
- };
155
- }
156
-
157
- export function getSplitAnchor(pen: Pen, pt: Point, index: number) {
158
- let from = pen.calculative.worldAnchors[index];
159
- let to = pen.calculative.worldAnchors[index + 1];
160
- if(!to && pen.close){
161
- to = pen.calculative.worldAnchors[0];
162
- }
163
- const t = pt.step;
164
- let anchor: Point;
165
- if (from.next && to.prev) {
166
- const p0 = from;
167
- const p1 = from.next;
168
- const p2 = to.prev;
169
- const p3 = to;
170
- const p4 = lerp(p0, p1, t);
171
- const p5 = lerp(p1, p2, t);
172
- const p6 = lerp(p2, p3, t);
173
- const p7: Point = lerp(p4, p5, t);
174
- const p8: Point = lerp(p5, p6, t);
175
- anchor = lerp(p7, p8, t);
176
- p7.penId = pen.id;
177
- anchor.prev = p7;
178
- p8.penId = pen.id;
179
- anchor.next = p8;
180
- from.next.x = p4.x;
181
- from.next.y = p4.y;
182
- to.prev.x = p6.x;
183
- to.prev.y = p6.y;
184
- } else if (from.next || to.prev) {
185
- const p0 = from;
186
- const p1 = from.next || to.prev;
187
- const p2 = to;
188
- const p3: Point = lerp(p0, p1, t);
189
- const p4: Point = lerp(p1, p2, t);
190
- anchor = pt;
191
- p3.penId = pen.id;
192
- p4.penId = pen.id;
193
- anchor.prev = p3;
194
- anchor.next = p4;
195
- from.next = undefined;
196
- to.prev = undefined;
197
- } else {
198
- // 并非贝塞尔点,即 from 和 to 之间是一条直线
199
- anchor = pt;
200
- }
201
-
202
- anchor.penId = pen.id;
203
- anchor.id = s8();
204
- anchor.prevNextType = PrevNextType.Bilateral;
205
- return anchor;
206
- }
207
-
208
- export function mind(store: Meta2dStore, pen: Pen, mousedwon?: Point) {
209
- if (!pen.calculative.worldAnchors) {
210
- pen.calculative.worldAnchors = [];
211
- }
212
-
213
- if (pen.calculative.worldAnchors.length < 2) {
214
- return;
215
- }
216
-
217
- let from = pen.calculative.activeAnchor;
218
- let to = mousedwon || getToAnchor(pen);
219
- if (!from || !to) {
220
- return;
221
- }
222
-
223
- const dis = 20;
224
-
225
- const fromPen = store.pens[from.connectTo];
226
- let fromFace = facePen(from, fromPen);
227
- if (fromFace === Direction.None) {
228
- if (to.x > from.x) {
229
- fromFace = Direction.Right;
230
- } else {
231
- fromFace = Direction.Left;
232
- }
233
- }
234
- from.next = {
235
- id: s8(),
236
- penId: pen.id,
237
- x: from.x,
238
- y: from.y,
239
- prevNextType: 2,
240
- };
241
- to.prev = { id: s8(), penId: pen.id, x: to.x, y: to.y, prevNextType: 2 };
242
- switch (fromFace) {
243
- case Direction.Up:
244
- from.next.y -= dis;
245
- to.prev.y = from.y;
246
- break;
247
- case Direction.Bottom:
248
- from.next.y += dis;
249
- to.prev.y = from.y;
250
- break;
251
- case Direction.Left:
252
- from.next.x -= dis;
253
- to.prev.x = from.x;
254
- break;
255
- default:
256
- from.next.x += dis;
257
- to.prev.x = from.x;
258
- break;
259
- }
260
- }
@@ -1,409 +0,0 @@
1
- import { deleteTempAnchor, getFromAnchor, getGradientAnimatePath, getToAnchor, Pen } from '../../pen';
2
- import { hitPoint, Point } from '../../point';
3
- import { getRectOfPoints, pointInSimpleRect, Rect } from '../../rect';
4
- import { Meta2dStore } from '../../store';
5
- import { getBezierPoint, getQuadraticPoint } from './curve';
6
-
7
- export function line(
8
- pen: Pen,
9
- ctx?: CanvasRenderingContext2D | Path2D
10
- ): Path2D {
11
- const path = !ctx ? new Path2D() : ctx;
12
- if (pen.lineName === 'line' || pen.lineName === 'polyline') {
13
- if (pen.calculative.lineSmooth) {
14
- let _path = getGradientAnimatePath(pen);
15
- (path as Path2D).addPath(_path);
16
- if (path instanceof Path2D) return path;
17
- }
18
- }
19
- const worldAnchors = pen.calculative.worldAnchors;
20
- if (worldAnchors.length > 1) {
21
- let from: Point; // 上一个点
22
- worldAnchors.forEach((pt: Point) => {
23
- if (from) {
24
- draw(path, from, pt);
25
- } else {
26
- pt.start = true;
27
- }
28
- from = pt;
29
- });
30
- if (pen.close) {
31
- draw(path, from, worldAnchors[0]);
32
- }
33
- }
34
- if (path instanceof Path2D) return path;
35
- }
36
-
37
- export function lineSegment(store: Meta2dStore, pen: Pen, mousedwon?: Point) {
38
- if (!pen.calculative.worldAnchors) {
39
- pen.calculative.worldAnchors = [];
40
- }
41
-
42
- if (pen.calculative.worldAnchors.length < 2 || pen.anchors?.length > 1) {
43
- return;
44
- }
45
-
46
- const from = getFromAnchor(pen);
47
- const to = getToAnchor(pen);
48
- if (!from || !to || !to.id || from === to) {
49
- return;
50
- }
51
- from.next = undefined;
52
- deleteTempAnchor(pen);
53
- to.prev = undefined;
54
- pen.calculative.worldAnchors.push(to);
55
- }
56
-
57
- function draw(path: CanvasRenderingContext2D | Path2D, from: Point, to: Point) {
58
- if (!to || to.isTemp) {
59
- return;
60
- }
61
- from.start && path.moveTo(from.x, from.y);
62
- if (from.next) {
63
- if (to.prev) {
64
- path.bezierCurveTo(
65
- from.next.x,
66
- from.next.y,
67
- to.prev.x,
68
- to.prev.y,
69
- to.x,
70
- to.y
71
- );
72
- } else {
73
- path.quadraticCurveTo(from.next.x, from.next.y, to.x, to.y);
74
- }
75
- } else {
76
- if (to.prev) {
77
- path.quadraticCurveTo(to.prev.x, to.prev.y, to.x, to.y);
78
- } else {
79
- path.lineTo(to.x, to.y);
80
- }
81
- }
82
- }
83
-
84
- export function getLineRect(pen: Pen) {
85
- getLineLength(pen);
86
- return getRectOfPoints(getLinePoints(pen));
87
- }
88
-
89
- /**
90
- * 获取连线的 points ,并非 worldAnchors ,worldAnchors 之前的路径点也会记录
91
- */
92
- export function getLinePoints(pen: Pen) {
93
- const pts: Point[] = [];
94
- let from: Point; // 上一个点
95
- pen.calculative.worldAnchors.forEach((pt: Point) => {
96
- pts.push(pt);
97
- from && pts.push(...getPoints(from, pt, pen));
98
- from = pt;
99
- });
100
- if (pen.close && pen.calculative.worldAnchors.length > 1) {
101
- pts.push(...getPoints(from, pen.calculative.worldAnchors[0], pen));
102
- }
103
- return pts;
104
- }
105
-
106
- export function getLineR(pen: Pen) {
107
- return pen?.lineWidth ? pen.lineWidth / 2 + 4 : 4;
108
- }
109
-
110
- export function getPoints(from: Point, to: Point, pen?: Pen) {
111
- const pts: Point[] = [];
112
- if (!to) {
113
- return pts;
114
- }
115
-
116
- let step = 0.02;
117
- if (from.lineLength) {
118
- const r = getLineR(pen);
119
- step = r / from.lineLength;
120
- }
121
- if (from.next) {
122
- if (to.prev) {
123
- for (let i = step; i < 1; i += step) {
124
- pts.push(getBezierPoint(i, from, from.next, to.prev, to));
125
- }
126
- } else {
127
- for (let i = step; i < 1; i += step) {
128
- pts.push(getQuadraticPoint(i, from, from.next, to));
129
- }
130
- }
131
- } else {
132
- if (to.prev) {
133
- for (let i = step; i < 1; i += step) {
134
- pts.push(getQuadraticPoint(i, from, to.prev, to));
135
- }
136
- } else {
137
- pts.push({ x: to.x, y: to.y });
138
- }
139
- }
140
- if (pts.length > 1) {
141
- from.curvePoints = pts;
142
- }
143
-
144
- return pts;
145
- }
146
-
147
- export function pointInLine(pt: Point, pen: Pen) {
148
- const r = getLineR(pen);
149
-
150
- let i = 0;
151
- let from: Point; // 上一个点
152
- let point: Point;
153
- for (const anchor of pen.calculative.worldAnchors) {
154
- if (from) {
155
- point = pointInLineSegment(pt, from, anchor, r);
156
- if (point) {
157
- return {
158
- i,
159
- point,
160
- };
161
- }
162
- ++i;
163
- }
164
- from = anchor;
165
- }
166
- if (
167
- pen.close &&
168
- pen.calculative.worldAnchors.length > 1 &&
169
- (point = pointInLineSegment(pt, from, pen.calculative.worldAnchors[0], r))
170
- ) {
171
- return {
172
- i,
173
- point,
174
- };
175
- }
176
- }
177
- export function pointInLineSegment(pt: Point, pt1: Point, pt2: Point, r = 4) {
178
- if (!pt1.next && !pt2.prev) {
179
- const { x: x1, y: y1 } = pt1;
180
- const { x: x2, y: y2 } = pt2;
181
- const minX = Math.min(x1, x2);
182
- const maxX = Math.max(x1, x2);
183
- const minY = Math.min(y1, y2);
184
- const maxY = Math.max(y1, y2);
185
- if (
186
- !(
187
- pt.x >= minX - r &&
188
- pt.x <= maxX + r &&
189
- pt.y >= minY - r &&
190
- pt.y <= maxY + r
191
- )
192
- ) {
193
- return;
194
- }
195
- return pointToLine(pt, pt1, pt2, r);
196
- } else if (pt1.curvePoints) {
197
- for (const point of pt1.curvePoints) {
198
- if (hitPoint(pt, point, r)) {
199
- return point;
200
- }
201
- }
202
- }
203
- }
204
-
205
- export function pointToLine(pt: Point, pt1: Point, pt2: Point, r = 4) {
206
- // 竖线
207
- if (pt1.x === pt2.x) {
208
- const len = Math.abs(pt.x - pt1.x);
209
- if (len <= r) {
210
- return {
211
- x: pt1.x,
212
- y: pt.y,
213
- };
214
- }
215
- } else {
216
- const A = (pt1.y - pt2.y) / (pt1.x - pt2.x);
217
- const B = pt1.y - A * pt1.x;
218
- const len = Math.abs((A * pt.x + B - pt.y) / Math.sqrt(A * A + 1));
219
- if (len <= r) {
220
- const m = pt.x + A * pt.y;
221
- const x = (m - A * B) / (A * A + 1);
222
- return {
223
- x,
224
- y: A * x + B,
225
- };
226
- }
227
- }
228
- }
229
-
230
- function lineLen(from: Point, cp1?: Point, cp2?: Point, to?: Point): number {
231
- if (!cp1 && !cp2) {
232
- return (
233
- Math.sqrt(
234
- Math.pow(Math.abs(from.x - to.x), 2) +
235
- Math.pow(Math.abs(from.y - to.y), 2)
236
- ) || 0
237
- );
238
- }
239
-
240
- const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
241
- if (cp1 && cp2) {
242
- path.setAttribute(
243
- 'd',
244
- `M${from.x} ${from.y} C${cp1.x} ${cp1.y} ${cp2.x} ${cp2.y} ${to.x} ${to.y}`
245
- );
246
- } else if (cp1) {
247
- path.setAttribute(
248
- 'd',
249
- `M${from.x} ${from.y} Q${cp1.x} ${cp1.y} ${to.x} ${to.y}`
250
- );
251
- } else {
252
- path.setAttribute(
253
- 'd',
254
- `M${from.x} ${from.y} Q${cp2.x} ${cp2.y} ${to.x} ${to.y}`
255
- );
256
- }
257
- return path.getTotalLength() || 0;
258
- }
259
-
260
- export function getLineLength(pen: Pen): number {
261
- if (pen.calculative.worldAnchors.length < 2) {
262
- return 0;
263
- }
264
-
265
- let len = 0;
266
- let from: Point; // 上一个点
267
- pen.calculative.worldAnchors.forEach((pt: Point) => {
268
- if (from) {
269
- from.lineLength = lineLen(from, from.next, pt.prev, pt);
270
- len += from.lineLength;
271
- }
272
- from = pt;
273
- });
274
- if (pen.close) {
275
- // pen.close ,下一个点即第一个点
276
- const to = getFromAnchor(pen);
277
- from.lineLength = lineLen(from, from.next, to.prev, to);
278
- len += from.lineLength;
279
- }
280
- if (pen.calculative.animatePos) {
281
- pen.calculative.animatePos =
282
- (len / pen.length) * pen.calculative.animatePos;
283
- }
284
- pen.length = len;
285
- return len;
286
- }
287
-
288
- /**
289
- * 连线在 rect 内, 连线与 rect 相交
290
- */
291
- export function lineInRect(line: Pen, rect: Rect) {
292
- // 判断是直线还是贝塞尔
293
- const worldAnchors = line.calculative.worldAnchors;
294
- for (let index = 0; index < worldAnchors.length - 1; index++) {
295
- const current = worldAnchors[index];
296
- const next = worldAnchors[index + 1];
297
- if (!current.next && !next.prev) {
298
- // 线段
299
- if (isLineIntersectRectangle(current, next, rect)) {
300
- return true;
301
- }
302
- } else {
303
- // 贝塞尔
304
- if (isBezierIntersectRectangle(current, next, rect)) {
305
- return true;
306
- }
307
- }
308
- }
309
- return false;
310
- }
311
-
312
- /**
313
- * 线段与矩形是否相交
314
- * @param rect 矩形
315
- */
316
- export function isLineIntersectRectangle(pt1: Point, pt2: Point, rect: Rect) {
317
- if (pointInSimpleRect(pt1, rect) || pointInSimpleRect(pt2, rect)) {
318
- // 存在一个点在矩形内部
319
- return true;
320
- }
321
- const linePointX1 = pt1.x;
322
- const linePointY1 = pt1.y;
323
- const linePointX2 = pt2.x;
324
- const linePointY2 = pt2.y;
325
-
326
- let rectangleLeftTopX = rect.x;
327
- let rectangleLeftTopY = rect.y;
328
- let rectangleRightBottomX = rect.ex;
329
- let rectangleRightBottomY = rect.ey;
330
-
331
- const lineHeight = linePointY1 - linePointY2;
332
- const lineWidth = linePointX2 - linePointX1; // 计算叉乘
333
- const c = linePointX1 * linePointY2 - linePointX2 * linePointY1;
334
- if (
335
- (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c >= 0 &&
336
- lineHeight * rectangleRightBottomX +
337
- lineWidth * rectangleRightBottomY +
338
- c <=
339
- 0) ||
340
- (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c <= 0 &&
341
- lineHeight * rectangleRightBottomX +
342
- lineWidth * rectangleRightBottomY +
343
- c >=
344
- 0) ||
345
- (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c >=
346
- 0 &&
347
- lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c <=
348
- 0) ||
349
- (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c <=
350
- 0 &&
351
- lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c >=
352
- 0)
353
- ) {
354
- if (rectangleLeftTopX > rectangleRightBottomX) {
355
- const temp = rectangleLeftTopX;
356
- rectangleLeftTopX = rectangleRightBottomX;
357
- rectangleRightBottomX = temp;
358
- }
359
- if (rectangleLeftTopY < rectangleRightBottomY) {
360
- const temp1 = rectangleLeftTopY;
361
- rectangleLeftTopY = rectangleRightBottomY;
362
- rectangleRightBottomY = temp1;
363
- }
364
- if (
365
- (linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX) ||
366
- (linePointX1 > rectangleRightBottomX &&
367
- linePointX2 > rectangleRightBottomX) ||
368
- (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY) ||
369
- (linePointY1 < rectangleRightBottomY &&
370
- linePointY2 < rectangleRightBottomY)
371
- ) {
372
- return false;
373
- } else {
374
- return true;
375
- }
376
- } else {
377
- return false;
378
- }
379
- }
380
-
381
- /**
382
- * 贝塞尔曲线与矩形是否相交
383
- * @param from 前点
384
- * @param to 后点
385
- * @param rect 矩形
386
- */
387
- export function isBezierIntersectRectangle(from: Point, to: Point, rect: Rect) {
388
- const step = 0.02;
389
- if (!from.next && !to.prev) {
390
- // 直线
391
- return isLineIntersectRectangle(from, to, rect);
392
- } else if (from.next && to.prev) {
393
- for (let i = step; i < 1; i += step) {
394
- const point = getBezierPoint(i, from, from.next, to.prev, to);
395
- if (pointInSimpleRect(point, rect)) {
396
- return true;
397
- }
398
- }
399
- } else if (from.next || to.prev) {
400
- for (let i = step; i < 1; i += step) {
401
- const point = getQuadraticPoint(i, from, from.next || to.prev, to);
402
- if (pointInSimpleRect(point, rect)) {
403
- return true;
404
- }
405
- }
406
- }
407
-
408
- return false;
409
- }