@meta2d/core 1.0.54 → 1.0.56

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 (302) hide show
  1. package/README.md +13 -0
  2. package/package.build.json +39 -0
  3. package/package.json +38 -38
  4. package/src/canvas/canvas.ts +8639 -0
  5. package/src/canvas/canvasImage.ts +525 -0
  6. package/src/canvas/canvasTemplate.ts +257 -0
  7. package/src/canvas/magnifierCanvas.ts +142 -0
  8. package/src/canvas/offscreen.ts +14 -0
  9. package/src/core.ts +5128 -0
  10. package/src/data.ts +86 -0
  11. package/src/diagrams/arrow.ts +50 -0
  12. package/src/diagrams/circle.ts +19 -0
  13. package/src/diagrams/cloud.ts +34 -0
  14. package/src/diagrams/cube.ts +94 -0
  15. package/src/diagrams/diamond.ts +14 -0
  16. package/src/diagrams/file.ts +19 -0
  17. package/src/diagrams/gif.ts +105 -0
  18. package/src/diagrams/{hexagon.js → hexagon.ts} +19 -14
  19. package/src/diagrams/iframe.ts +365 -0
  20. package/src/diagrams/{index.js → index.ts} +36 -34
  21. package/src/diagrams/line/arrow.ts +175 -0
  22. package/src/diagrams/line/curve.ts +260 -0
  23. package/src/diagrams/line/line.ts +409 -0
  24. package/src/diagrams/line/polyline.ts +676 -0
  25. package/src/diagrams/line/smooth.ts +133 -0
  26. package/src/diagrams/message.ts +17 -0
  27. package/src/diagrams/mindLine.ts +31 -0
  28. package/src/diagrams/mindNode.ts +177 -0
  29. package/src/diagrams/panel.ts +149 -0
  30. package/src/diagrams/pentagon.ts +48 -0
  31. package/src/diagrams/pentagram.ts +63 -0
  32. package/src/diagrams/people.ts +23 -0
  33. package/src/diagrams/rectangle.ts +29 -0
  34. package/src/diagrams/svg/parse.ts +319 -0
  35. package/src/diagrams/svgPath.ts +53 -0
  36. package/src/diagrams/triangle.ts +43 -0
  37. package/src/diagrams/video.ts +202 -0
  38. package/src/dialog/dialog.ts +177 -0
  39. package/src/event/event.ts +142 -0
  40. package/src/map/map.ts +239 -0
  41. package/src/options.ts +205 -0
  42. package/src/pen/arrow.ts +259 -0
  43. package/src/pen/math.ts +253 -0
  44. package/src/pen/model.ts +785 -0
  45. package/src/pen/plugin.ts +57 -0
  46. package/src/pen/render.ts +3725 -0
  47. package/src/pen/text.ts +341 -0
  48. package/src/pen/utils.ts +21 -0
  49. package/src/point/point.ts +232 -0
  50. package/src/rect/rect.ts +507 -0
  51. package/src/rect/triangle.ts +16 -0
  52. package/src/scroll/scroll.ts +277 -0
  53. package/src/store/global.ts +38 -0
  54. package/src/store/store.ts +293 -0
  55. package/src/theme.ts +35 -0
  56. package/src/title/title.ts +115 -0
  57. package/src/tooltip/tooltip.ts +199 -0
  58. package/src/utils/clone.ts +79 -0
  59. package/src/utils/color.ts +126 -0
  60. package/src/utils/error.ts +7 -0
  61. package/src/utils/file.ts +46 -0
  62. package/src/utils/{index.d.ts → index.ts} +1 -0
  63. package/src/utils/math.ts +120 -0
  64. package/src/utils/object.ts +23 -0
  65. package/src/utils/padding.ts +48 -0
  66. package/src/utils/time.ts +25 -0
  67. package/src/utils/url.ts +30 -0
  68. package/src/utils/uuid.ts +15 -0
  69. package/index.js +0 -10
  70. package/index.js.map +0 -1
  71. package/src/canvas/canvas.d.ts +0 -455
  72. package/src/canvas/canvas.js +0 -8168
  73. package/src/canvas/canvas.js.map +0 -1
  74. package/src/canvas/canvasImage.d.ts +0 -28
  75. package/src/canvas/canvasImage.js +0 -503
  76. package/src/canvas/canvasImage.js.map +0 -1
  77. package/src/canvas/canvasTemplate.d.ts +0 -19
  78. package/src/canvas/canvasTemplate.js +0 -229
  79. package/src/canvas/canvasTemplate.js.map +0 -1
  80. package/src/canvas/index.js +0 -3
  81. package/src/canvas/index.js.map +0 -1
  82. package/src/canvas/magnifierCanvas.d.ts +0 -20
  83. package/src/canvas/magnifierCanvas.js +0 -101
  84. package/src/canvas/magnifierCanvas.js.map +0 -1
  85. package/src/canvas/offscreen.d.ts +0 -2
  86. package/src/canvas/offscreen.js +0 -14
  87. package/src/canvas/offscreen.js.map +0 -1
  88. package/src/core.d.ts +0 -477
  89. package/src/core.js +0 -5168
  90. package/src/core.js.map +0 -1
  91. package/src/data.d.ts +0 -34
  92. package/src/data.js +0 -85
  93. package/src/data.js.map +0 -1
  94. package/src/diagrams/arrow.d.ts +0 -4
  95. package/src/diagrams/arrow.js +0 -47
  96. package/src/diagrams/arrow.js.map +0 -1
  97. package/src/diagrams/circle.d.ts +0 -2
  98. package/src/diagrams/circle.js +0 -9
  99. package/src/diagrams/circle.js.map +0 -1
  100. package/src/diagrams/cloud.d.ts +0 -2
  101. package/src/diagrams/cloud.js +0 -12
  102. package/src/diagrams/cloud.js.map +0 -1
  103. package/src/diagrams/cube.d.ts +0 -2
  104. package/src/diagrams/cube.js +0 -70
  105. package/src/diagrams/cube.js.map +0 -1
  106. package/src/diagrams/diamond.d.ts +0 -2
  107. package/src/diagrams/diamond.js +0 -13
  108. package/src/diagrams/diamond.js.map +0 -1
  109. package/src/diagrams/file.d.ts +0 -2
  110. package/src/diagrams/file.js +0 -18
  111. package/src/diagrams/file.js.map +0 -1
  112. package/src/diagrams/gif.d.ts +0 -5
  113. package/src/diagrams/gif.js +0 -90
  114. package/src/diagrams/gif.js.map +0 -1
  115. package/src/diagrams/hexagon.d.ts +0 -2
  116. package/src/diagrams/hexagon.js.map +0 -1
  117. package/src/diagrams/iframe.d.ts +0 -2
  118. package/src/diagrams/iframe.js +0 -356
  119. package/src/diagrams/iframe.js.map +0 -1
  120. package/src/diagrams/index.d.ts +0 -71
  121. package/src/diagrams/index.js.map +0 -1
  122. package/src/diagrams/line/arrow.d.ts +0 -2
  123. package/src/diagrams/line/arrow.js +0 -128
  124. package/src/diagrams/line/arrow.js.map +0 -1
  125. package/src/diagrams/line/curve.d.ts +0 -16
  126. package/src/diagrams/line/curve.js +0 -236
  127. package/src/diagrams/line/curve.js.map +0 -1
  128. package/src/diagrams/line/index.js +0 -6
  129. package/src/diagrams/line/index.js.map +0 -1
  130. package/src/diagrams/line/line.d.ts +0 -42
  131. package/src/diagrams/line/line.js +0 -431
  132. package/src/diagrams/line/line.js.map +0 -1
  133. package/src/diagrams/line/polyline.d.ts +0 -10
  134. package/src/diagrams/line/polyline.js +0 -657
  135. package/src/diagrams/line/polyline.js.map +0 -1
  136. package/src/diagrams/line/smooth.d.ts +0 -3
  137. package/src/diagrams/line/smooth.js +0 -174
  138. package/src/diagrams/line/smooth.js.map +0 -1
  139. package/src/diagrams/message.d.ts +0 -2
  140. package/src/diagrams/message.js +0 -15
  141. package/src/diagrams/message.js.map +0 -1
  142. package/src/diagrams/mindLine.d.ts +0 -3
  143. package/src/diagrams/mindLine.js +0 -31
  144. package/src/diagrams/mindLine.js.map +0 -1
  145. package/src/diagrams/mindNode.d.ts +0 -3
  146. package/src/diagrams/mindNode.js +0 -189
  147. package/src/diagrams/mindNode.js.map +0 -1
  148. package/src/diagrams/panel.d.ts +0 -2
  149. package/src/diagrams/panel.js +0 -131
  150. package/src/diagrams/panel.js.map +0 -1
  151. package/src/diagrams/pentagon.d.ts +0 -3
  152. package/src/diagrams/pentagon.js +0 -46
  153. package/src/diagrams/pentagon.js.map +0 -1
  154. package/src/diagrams/pentagram.d.ts +0 -3
  155. package/src/diagrams/pentagram.js +0 -77
  156. package/src/diagrams/pentagram.js.map +0 -1
  157. package/src/diagrams/people.d.ts +0 -2
  158. package/src/diagrams/people.js +0 -19
  159. package/src/diagrams/people.js.map +0 -1
  160. package/src/diagrams/rectangle.d.ts +0 -3
  161. package/src/diagrams/rectangle.js +0 -26
  162. package/src/diagrams/rectangle.js.map +0 -1
  163. package/src/diagrams/svg/parse.d.ts +0 -15
  164. package/src/diagrams/svg/parse.js +0 -326
  165. package/src/diagrams/svg/parse.js.map +0 -1
  166. package/src/diagrams/svgPath.d.ts +0 -2
  167. package/src/diagrams/svgPath.js +0 -30
  168. package/src/diagrams/svgPath.js.map +0 -1
  169. package/src/diagrams/triangle.d.ts +0 -3
  170. package/src/diagrams/triangle.js +0 -41
  171. package/src/diagrams/triangle.js.map +0 -1
  172. package/src/diagrams/video.d.ts +0 -5
  173. package/src/diagrams/video.js +0 -185
  174. package/src/diagrams/video.js.map +0 -1
  175. package/src/dialog/dialog.d.ts +0 -14
  176. package/src/dialog/dialog.js +0 -77
  177. package/src/dialog/dialog.js.map +0 -1
  178. package/src/dialog/index.js +0 -2
  179. package/src/dialog/index.js.map +0 -1
  180. package/src/event/event.d.ts +0 -102
  181. package/src/event/event.js +0 -22
  182. package/src/event/event.js.map +0 -1
  183. package/src/event/index.js +0 -2
  184. package/src/event/index.js.map +0 -1
  185. package/src/map/index.js +0 -2
  186. package/src/map/index.js.map +0 -1
  187. package/src/map/map.d.ts +0 -21
  188. package/src/map/map.js +0 -210
  189. package/src/map/map.js.map +0 -1
  190. package/src/options.d.ts +0 -130
  191. package/src/options.js +0 -80
  192. package/src/options.js.map +0 -1
  193. package/src/pen/arrow.d.ts +0 -4
  194. package/src/pen/arrow.js +0 -188
  195. package/src/pen/arrow.js.map +0 -1
  196. package/src/pen/index.js +0 -7
  197. package/src/pen/index.js.map +0 -1
  198. package/src/pen/math.d.ts +0 -28
  199. package/src/pen/math.js +0 -304
  200. package/src/pen/math.js.map +0 -1
  201. package/src/pen/model.d.ts +0 -512
  202. package/src/pen/model.js +0 -209
  203. package/src/pen/model.js.map +0 -1
  204. package/src/pen/plugin.d.ts +0 -5
  205. package/src/pen/plugin.js +0 -88
  206. package/src/pen/plugin.js.map +0 -1
  207. package/src/pen/render.d.ts +0 -147
  208. package/src/pen/render.js +0 -3229
  209. package/src/pen/render.js.map +0 -1
  210. package/src/pen/text.d.ts +0 -8
  211. package/src/pen/text.js +0 -375
  212. package/src/pen/text.js.map +0 -1
  213. package/src/pen/utils.d.ts +0 -2
  214. package/src/pen/utils.js +0 -41
  215. package/src/pen/utils.js.map +0 -1
  216. package/src/point/index.js +0 -2
  217. package/src/point/index.js.map +0 -1
  218. package/src/point/point.d.ts +0 -65
  219. package/src/point/point.js +0 -179
  220. package/src/point/point.js.map +0 -1
  221. package/src/rect/index.js +0 -2
  222. package/src/rect/index.js.map +0 -1
  223. package/src/rect/rect.d.ts +0 -52
  224. package/src/rect/rect.js +0 -486
  225. package/src/rect/rect.js.map +0 -1
  226. package/src/rect/triangle.d.ts +0 -2
  227. package/src/rect/triangle.js +0 -10
  228. package/src/rect/triangle.js.map +0 -1
  229. package/src/scroll/index.js +0 -2
  230. package/src/scroll/index.js.map +0 -1
  231. package/src/scroll/scroll.d.ts +0 -35
  232. package/src/scroll/scroll.js +0 -221
  233. package/src/scroll/scroll.js.map +0 -1
  234. package/src/store/global.d.ts +0 -25
  235. package/src/store/global.js +0 -18
  236. package/src/store/global.js.map +0 -1
  237. package/src/store/index.js +0 -3
  238. package/src/store/index.js.map +0 -1
  239. package/src/store/store.d.ts +0 -226
  240. package/src/store/store.js +0 -121
  241. package/src/store/store.js.map +0 -1
  242. package/src/theme.d.ts +0 -13
  243. package/src/theme.js +0 -23
  244. package/src/theme.js.map +0 -1
  245. package/src/title/index.js +0 -2
  246. package/src/title/index.js.map +0 -1
  247. package/src/title/title.d.ts +0 -30
  248. package/src/title/title.js +0 -99
  249. package/src/title/title.js.map +0 -1
  250. package/src/tooltip/index.js +0 -2
  251. package/src/tooltip/index.js.map +0 -1
  252. package/src/tooltip/tooltip.d.ts +0 -40
  253. package/src/tooltip/tooltip.js +0 -167
  254. package/src/tooltip/tooltip.js.map +0 -1
  255. package/src/utils/browser.d.ts +0 -1
  256. package/src/utils/browser.js +0 -4
  257. package/src/utils/browser.js.map +0 -1
  258. package/src/utils/clone.d.ts +0 -8
  259. package/src/utils/clone.js +0 -88
  260. package/src/utils/clone.js.map +0 -1
  261. package/src/utils/color.d.ts +0 -3
  262. package/src/utils/color.js +0 -126
  263. package/src/utils/color.js.map +0 -1
  264. package/src/utils/error.d.ts +0 -2
  265. package/src/utils/error.js +0 -6
  266. package/src/utils/error.js.map +0 -1
  267. package/src/utils/file.d.ts +0 -3
  268. package/src/utils/file.js +0 -92
  269. package/src/utils/file.js.map +0 -1
  270. package/src/utils/index.js +0 -9
  271. package/src/utils/index.js.map +0 -1
  272. package/src/utils/math.d.ts +0 -18
  273. package/src/utils/math.js +0 -152
  274. package/src/utils/math.js.map +0 -1
  275. package/src/utils/object.d.ts +0 -2
  276. package/src/utils/object.js +0 -21
  277. package/src/utils/object.js.map +0 -1
  278. package/src/utils/padding.d.ts +0 -7
  279. package/src/utils/padding.js +0 -47
  280. package/src/utils/padding.js.map +0 -1
  281. package/src/utils/time.d.ts +0 -1
  282. package/src/utils/time.js +0 -17
  283. package/src/utils/time.js.map +0 -1
  284. package/src/utils/url.d.ts +0 -4
  285. package/src/utils/url.js +0 -27
  286. package/src/utils/url.js.map +0 -1
  287. package/src/utils/uuid.d.ts +0 -4
  288. package/src/utils/uuid.js +0 -13
  289. package/src/utils/uuid.js.map +0 -1
  290. /package/{index.d.ts → index.ts} +0 -0
  291. /package/src/canvas/{index.d.ts → index.ts} +0 -0
  292. /package/src/diagrams/line/{index.d.ts → index.ts} +0 -0
  293. /package/src/dialog/{index.d.ts → index.ts} +0 -0
  294. /package/src/event/{index.d.ts → index.ts} +0 -0
  295. /package/src/map/{index.d.ts → index.ts} +0 -0
  296. /package/src/pen/{index.d.ts → index.ts} +0 -0
  297. /package/src/point/{index.d.ts → index.ts} +0 -0
  298. /package/src/rect/{index.d.ts → index.ts} +0 -0
  299. /package/src/scroll/{index.d.ts → index.ts} +0 -0
  300. /package/src/store/{index.d.ts → index.ts} +0 -0
  301. /package/src/title/{index.d.ts → index.ts} +0 -0
  302. /package/src/tooltip/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,507 @@
1
+ import { isEqual, Pen } from '../pen';
2
+ import { Point, rotatePoint, scalePoint } from '../point';
3
+ import { formatPadding, Padding } from '../utils';
4
+
5
+ export interface Rect {
6
+ x?: number;
7
+ y?: number;
8
+ ex?: number;
9
+ ey?: number;
10
+ width?: number;
11
+ height?: number;
12
+ rotate?: number;
13
+ center?: Point;
14
+ pivot?: Point; //旋转中心
15
+ }
16
+
17
+ export function pointInRect(pt: Point, rect: Rect) {
18
+ if (!rect) {
19
+ return;
20
+ }
21
+ if (rect.ex == null) {
22
+ calcRightBottom(rect);
23
+ }
24
+
25
+ if (
26
+ !rect.rotate ||
27
+ // rect.width < 20 ||
28
+ // rect.height < 20 ||
29
+ rect.rotate % 360 === 0
30
+ ) {
31
+ return pt.x > rect.x && pt.x < rect.ex && pt.y > rect.y && pt.y < rect.ey;
32
+ }
33
+
34
+ if (!rect.center) {
35
+ calcCenter(rect);
36
+ }
37
+
38
+ const pts: Point[] = [
39
+ { x: rect.x, y: rect.y },
40
+ { x: rect.ex, y: rect.y },
41
+ { x: rect.ex, y: rect.ey },
42
+ { x: rect.x, y: rect.ey },
43
+ ];
44
+ pts.forEach((item: Point) => {
45
+ rotatePoint(item, rect.rotate, rect.pivot || rect.center);
46
+ });
47
+
48
+ return pointInVertices(pt, pts);
49
+ }
50
+
51
+ export function pointInSimpleRect(pt: Point, rect: Rect, r = 0) {
52
+ const { x, y, ex, ey } = rect;
53
+ return pt.x >= x - r && pt.x <= ex + r && pt.y >= y - r && pt.y <= ey + r;
54
+ }
55
+
56
+ export function calcCenter(rect: Rect) {
57
+ if (!rect.center) {
58
+ rect.center = {} as Point;
59
+ }
60
+ rect.center.x = rect.x + rect.width / 2;
61
+ rect.center.y = rect.y + rect.height / 2;
62
+ }
63
+
64
+ export function calcRightBottom(rect: Rect) {
65
+ rect.ex = rect.x + rect.width;
66
+ rect.ey = rect.y + rect.height;
67
+ }
68
+
69
+ export function calcPivot(rect: Rect, pivot:Point) {
70
+ if (!rect.pivot) {
71
+ rect.pivot = {} as Point;
72
+ }
73
+ rect.pivot.x = rect.x + rect.width * pivot.x;
74
+ rect.pivot.y = rect.y + rect.height * pivot.y;
75
+ }
76
+
77
+ export function pointInVertices(
78
+ point: { x: number; y: number },
79
+ vertices: Point[]
80
+ ): boolean {
81
+ if (vertices.length < 3) {
82
+ return false;
83
+ }
84
+ let isIn = false;
85
+ let last = vertices[vertices.length - 1];
86
+ for (const item of vertices) {
87
+ if (last.y > point.y !== item.y > point.y) {
88
+ if (
89
+ item.x + ((point.y - item.y) * (last.x - item.x)) / (last.y - item.y) >
90
+ point.x
91
+ ) {
92
+ isIn = !isIn;
93
+ }
94
+ }
95
+
96
+ last = item;
97
+ }
98
+
99
+ return isIn;
100
+ }
101
+
102
+ export function getRect(pens: Pen[]): Rect {
103
+ const points: Point[] = [];
104
+ pens.forEach((pen) => {
105
+ if (pen.isRuleLine) {
106
+ return;
107
+ }
108
+ const rect = pen.calculative.worldRect;
109
+ if (rect) {
110
+ const pts = rectToPoints(rect);
111
+ // rectToPoints 已经计算过 rotate 无需重复计算
112
+ points.push(...pts);
113
+ }
114
+ });
115
+
116
+ const rect = getRectOfPoints(points);
117
+ calcCenter(rect);
118
+ return rect;
119
+ }
120
+
121
+ export function rectToPoints(rect: Rect) {
122
+ const pts = [
123
+ { x: rect.x, y: rect.y },
124
+ { x: rect.ex, y: rect.y },
125
+ { x: rect.ex, y: rect.ey },
126
+ { x: rect.x, y: rect.ey },
127
+ ];
128
+
129
+ if (rect.rotate) {
130
+ if (!rect.center) {
131
+ calcCenter(rect);
132
+ }
133
+ pts.forEach((pt) => {
134
+ rotatePoint(pt, rect.rotate, rect.pivot || rect.center);
135
+ });
136
+ }
137
+ return pts;
138
+ }
139
+
140
+ export function getRectOfPoints(points: Point[]): Rect {
141
+ let x = Infinity;
142
+ let y = Infinity;
143
+ let ex = -Infinity;
144
+ let ey = -Infinity;
145
+
146
+ points?.forEach((item) => {
147
+ if (!isFinite(item.x) || !isFinite(item.y)) {
148
+ return;
149
+ }
150
+ x = Math.min(x, item.x);
151
+ y = Math.min(y, item.y);
152
+ ex = Math.max(ex, item.x);
153
+ ey = Math.max(ey, item.y);
154
+ });
155
+ return { x, y, ex, ey, width: ex - x, height: ey - y };
156
+ }
157
+
158
+ export function rectInRect(source: Rect, target: Rect, allIn?: boolean) {
159
+ if (source.rotate) {
160
+ // 根据 rotate 扩大 rect
161
+ source = getRectOfPoints(rectToPoints(source)); // 更改 source 引用地址值,不影响原值
162
+ }
163
+ if (allIn) {
164
+ return (
165
+ source.x > target.x &&
166
+ source.ex < target.ex &&
167
+ source.y > target.y &&
168
+ source.ey < target.ey
169
+ );
170
+ }
171
+ return !(
172
+ source.x > target.ex ||
173
+ source.ex < target.x ||
174
+ source.ey < target.y ||
175
+ source.y > target.ey
176
+ );
177
+ }
178
+
179
+ /**
180
+ * 一个 rect 在另一个 rect 的 四个角,即水平区域不重合,垂直区域不重合
181
+ */
182
+ export function rectInFourAngRect(source: Rect, target: Rect) {
183
+ return (
184
+ (target.x > source.ex || target.ex < source.x) &&
185
+ (target.y > source.ey || target.ey < source.y)
186
+ );
187
+ }
188
+
189
+ /**
190
+ * 扩大 rect ,x,y,ex,ey 值都会变
191
+ * @param rect 原 rect ,无副作用
192
+ * @param size padding 类型,可传四个方向的值,也可以只传一个值
193
+ */
194
+ export function expandRect(rect: Rect, size: Padding): Rect {
195
+ const padding = formatPadding(size);
196
+ const retRect = {
197
+ x: rect.x - padding[3],
198
+ y: rect.y - padding[0],
199
+ width: rect.width + padding[1] + padding[3],
200
+ height: rect.height + padding[0] + padding[2],
201
+ };
202
+ calcRightBottom(retRect);
203
+ return retRect;
204
+ }
205
+
206
+ export function translateRect(rect: Rect | Pen, x: number, y: number) {
207
+ rect.x += x;
208
+ rect.y += y;
209
+ rect.ex += x;
210
+ rect.ey += y;
211
+
212
+ if (rect.center) {
213
+ rect.center.x += x;
214
+ rect.center.y += y;
215
+ }
216
+
217
+ if(rect.pivot){
218
+ rect.pivot.x += x;
219
+ rect.pivot.y += y;
220
+ }
221
+ }
222
+
223
+ /**
224
+ * 通过两条线段计算出相交的点
225
+ * @param line1 线段1
226
+ * @param line2 线段2
227
+ */
228
+ function getIntersectPoint(
229
+ line1: { from: Point; to: Point },
230
+ line2: { from: Point; to: Point }
231
+ ): Point {
232
+ const k1 = (line1.to.y - line1.from.y) / (line1.to.x - line1.from.x);
233
+ const k2 = (line2.to.y - line2.from.y) / (line2.to.x - line2.from.x);
234
+ return getIntersectPointByK(
235
+ {
236
+ k: k1,
237
+ point: line1.from,
238
+ },
239
+ {
240
+ k: k2,
241
+ point: line2.from,
242
+ }
243
+ );
244
+ }
245
+
246
+ /**
247
+ * 该方法作用同上,不过此方法需要传的是 斜率
248
+ * @param line1 线段1
249
+ * @param line2 线段2
250
+ * @returns
251
+ */
252
+ function getIntersectPointByK(
253
+ line1: { k: number; point: Point },
254
+ line2: { k: number; point: Point }
255
+ ): Point {
256
+ if (isEqual(line1.k, 0)) {
257
+ return {
258
+ x: line2.point.x,
259
+ y: line1.point.y,
260
+ };
261
+ } else if (isEqual(line2.k, 0)) {
262
+ return {
263
+ x: line1.point.x,
264
+ y: line2.point.y,
265
+ };
266
+ }
267
+
268
+ const b1 = line1.point.y - line1.k * line1.point.x;
269
+ const b2 = line2.point.y - line2.k * line2.point.x;
270
+ const x = (b2 - b1) / (line1.k - line2.k);
271
+ const y = line1.k * x + b1;
272
+
273
+ return {
274
+ x,
275
+ y,
276
+ };
277
+ }
278
+
279
+ /**
280
+ * 通过 4 个点和旋转角度,计算出原矩形(旋转前的矩形)
281
+ * @param pts 4 个点
282
+ * @param rotate 旋转角度
283
+ */
284
+ function pointsToRect(pts: Point[], rotate: number): Rect {
285
+ // 1. 计算 center,认为 0,2 ;1,3 的连线相交就是 center 点
286
+ const center = getIntersectPoint(
287
+ {
288
+ from: pts[0],
289
+ to: pts[2],
290
+ },
291
+ {
292
+ from: pts[1],
293
+ to: pts[3],
294
+ }
295
+ );
296
+ // 2. 把点反向转 rotate °
297
+ for (const pt of pts) {
298
+ rotatePoint(pt, -rotate, center);
299
+ }
300
+ // 3. 计算区域
301
+ return getRectOfPoints(pts);
302
+ }
303
+
304
+ export function resizeRect(
305
+ rect: Rect | Pen,
306
+ offsetX: number,
307
+ offsetY: number,
308
+ resizeIndex: number
309
+ ) {
310
+ let calcRotate = rect.rotate?rect.rotate % 360 : 0;
311
+ if (calcRotate) {
312
+ // 计算出外边的四个点
313
+ const pts = rectToPoints(rect);
314
+ // 斜率不改变,提前计算
315
+ const k1 = (pts[0].y - pts[1].y) / (pts[0].x - pts[1].x);
316
+ const k2 = (pts[1].y - pts[2].y) / (pts[1].x - pts[2].x);
317
+ if (resizeIndex < 4) {
318
+ // 斜对角的四个点
319
+ // resize 的点
320
+ pts[resizeIndex].x += offsetX;
321
+ if((rect as Pen ).ratio){
322
+ if(resizeIndex === 0 || resizeIndex === 2){
323
+ let calcOffsetY = offsetX * Math.tan((90-(360-calcRotate) - (Math.atan(rect.width/rect.height))/Math.PI*180)/ 180 * Math.PI);
324
+ pts[resizeIndex].y += calcOffsetY;
325
+ }else {
326
+ let calcOffsetY = offsetX * Math.tan((90-(360-calcRotate) + (Math.atan(rect.width/rect.height))/Math.PI*180)/ 180 * Math.PI);
327
+ pts[resizeIndex].y += calcOffsetY;
328
+ }
329
+ }else{
330
+ pts[resizeIndex].y += offsetY;
331
+ }
332
+ // 不变的点
333
+ const noChangePoint = pts[(resizeIndex + 2) % 4];
334
+ // 由于斜率是不变的,我们只需要根据斜率 和 已知的两点求出相交的 另外两点
335
+ pts[(resizeIndex + 1) % 4] = getIntersectPointByK(
336
+ { k: resizeIndex % 2 ? k2 : k1, point: pts[resizeIndex] },
337
+ { k: resizeIndex % 2 ? k1 : k2, point: noChangePoint }
338
+ );
339
+ pts[(resizeIndex + 4 - 1) % 4] = getIntersectPointByK(
340
+ { k: resizeIndex % 2 ? k1 : k2, point: pts[resizeIndex] },
341
+ { k: resizeIndex % 2 ? k2 : k1, point: noChangePoint }
342
+ );
343
+ } else {
344
+ // 边缘四个点有两个点固定
345
+ const k = [4, 6].includes(resizeIndex) ? k2 : k1;
346
+ if (!isEqual(k, 0)) {
347
+ pts[resizeIndex % 4].y += offsetY;
348
+ pts[resizeIndex % 4].x += offsetY / k;
349
+ pts[(resizeIndex + 1) % 4].y += offsetY;
350
+ pts[(resizeIndex + 1) % 4].x += offsetY / k;
351
+ } else {
352
+ pts[resizeIndex % 4].x += offsetX;
353
+ pts[(resizeIndex + 1) % 4].x += offsetX;
354
+ }
355
+ }
356
+ if (
357
+ (pts[0].x - pts[1].x) ** 2 + (pts[0].y - pts[1].y) ** 2 < 25 ||
358
+ (pts[1].x - pts[2].x) ** 2 + (pts[1].y - pts[2].y) ** 2 < 25
359
+ ) {
360
+ // 距离小于 5 不能继续 resize 了
361
+ return;
362
+ }
363
+ const retRect = pointsToRect(pts, rect.rotate);
364
+ calcCenter(retRect);
365
+ Object.assign(rect, retRect);
366
+ return;
367
+ }
368
+ switch (resizeIndex) {
369
+ case 0:
370
+ if (rect.width - offsetX < 5 || rect.height - offsetY < 5) {
371
+ break;
372
+ }
373
+ rect.x += offsetX;
374
+ rect.y += offsetY;
375
+ rect.width -= offsetX;
376
+ rect.height -= offsetY;
377
+ break;
378
+ case 1:
379
+ if (rect.width + offsetX < 5 || rect.height - offsetY < 5) {
380
+ break;
381
+ }
382
+ rect.ex += offsetX;
383
+ rect.y += offsetY;
384
+ rect.width += offsetX;
385
+ rect.height -= offsetY;
386
+ break;
387
+ case 2:
388
+ if (rect.width + offsetX < 5 || rect.height + offsetY < 5) {
389
+ break;
390
+ }
391
+ rect.ex += offsetX;
392
+ rect.ey += offsetY;
393
+ rect.width += offsetX;
394
+ rect.height += offsetY;
395
+ break;
396
+ case 3:
397
+ if (rect.width - offsetX < 5 || rect.height + offsetY < 5) {
398
+ break;
399
+ }
400
+ rect.x += offsetX;
401
+ rect.ey += offsetY;
402
+ rect.width -= offsetX;
403
+ rect.height += offsetY;
404
+ break;
405
+ case 4:
406
+ if (rect.height - offsetY < 5) {
407
+ break;
408
+ }
409
+ rect.y += offsetY;
410
+ rect.height -= offsetY;
411
+ break;
412
+ case 5:
413
+ if (rect.width + offsetX < 5) {
414
+ break;
415
+ }
416
+ rect.ex += offsetX;
417
+ rect.width += offsetX;
418
+ break;
419
+ case 6:
420
+ if (rect.height + offsetY < 5) {
421
+ break;
422
+ }
423
+ rect.ey += offsetY;
424
+ rect.height += offsetY;
425
+ break;
426
+ case 7:
427
+ if (rect.width - offsetX < 5) {
428
+ break;
429
+ }
430
+ rect.x += offsetX;
431
+ rect.width -= offsetX;
432
+ break;
433
+ }
434
+ }
435
+
436
+ export function scaleRect(rect: Rect, scale: number, center: Point, pivot?: Point) {
437
+ if (!rect) {
438
+ return;
439
+ }
440
+ rect.width *= scale;
441
+ rect.height *= scale;
442
+ scalePoint(rect as Point, scale, center);
443
+
444
+ calcRightBottom(rect);
445
+ calcCenter(rect);
446
+ if(pivot){
447
+ calcPivot(rect, pivot);
448
+ }
449
+ }
450
+
451
+ export function calcRelativeRect(rect: Rect, worldRect: Rect) {
452
+ const relRect: Rect = {
453
+ x: (rect.x - worldRect.x) / worldRect.width,
454
+ y: (rect.y - worldRect.y) / worldRect.height,
455
+ width: rect.width / worldRect.width,
456
+ height: rect.height / worldRect.height,
457
+ };
458
+ calcRightBottom(relRect);
459
+
460
+ return relRect;
461
+ }
462
+
463
+ /**
464
+ * 计算相对点 ,anchors 中的值都是百分比
465
+ * @param pt 绝对坐标
466
+ * @param worldRect 图形外接矩形
467
+ * @returns 相对坐标点
468
+ */
469
+ export function calcRelativePoint(pt: Point, worldRect: Rect) {
470
+ const { x, y, width, height } = worldRect;
471
+ const { penId, connectTo } = pt;
472
+ const point: Point = Object.assign({}, pt, {
473
+ x: width ? (pt.x - x) / width : 0,
474
+ y: height ? (pt.y - y) / height : 0,
475
+ });
476
+ if (pt.prev) {
477
+ point.prev = {
478
+ penId,
479
+ connectTo,
480
+ x: width ? (pt.prev.x - x) / width : 0,
481
+ y: height ? (pt.prev.y - y) / height : 0,
482
+ };
483
+ }
484
+ if (pt.next) {
485
+ point.next = {
486
+ penId,
487
+ connectTo,
488
+ x: width ? (pt.next.x - x) / width : 0,
489
+ y: height ? (pt.next.y - y) / height : 0,
490
+ };
491
+ }
492
+ return point;
493
+ }
494
+
495
+ //射线法 判断点是否在多边形内部
496
+ export function pointInPolygon(pt: Point, pts: Point[]) {
497
+ let inside = false;
498
+ for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {
499
+ let xi = pts[i].x, yi = pts[i].y;
500
+ let xj = pts[j].x, yj = pts[j].y;
501
+
502
+ let intersect = ((yi > pt.y) != (yj > pt.y))
503
+ && (pt.x < (xj - xi) * (pt.y - yi) / (yj - yi) + xi);
504
+ if (intersect) inside = !inside;
505
+ }
506
+ return inside;
507
+ }
@@ -0,0 +1,16 @@
1
+ import { Pen } from '../pen';
2
+
3
+ export function triangle(pen: Pen) {
4
+ const path = new Path2D();
5
+ path.moveTo(pen.calculative.worldRect.x + pen.calculative.worldRect.width / 2, pen.calculative.worldRect.y);
6
+ path.lineTo(
7
+ pen.calculative.worldRect.x + pen.calculative.worldRect.width,
8
+ pen.calculative.worldRect.y + pen.calculative.worldRect.height
9
+ );
10
+ path.lineTo(pen.calculative.worldRect.x, pen.calculative.worldRect.y + pen.calculative.worldRect.height);
11
+ path.lineTo(pen.calculative.worldRect.x + pen.calculative.worldRect.width / 2, pen.calculative.worldRect.y);
12
+
13
+ path.closePath();
14
+
15
+ return path;
16
+ }