kfb-view 3.0.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/kfb-view.js +1 -1
  2. package/lib/kfb-view.js.LICENSE.txt +3 -3
  3. package/package.json +3 -2
  4. package/src/components/area/index.js +38 -48
  5. package/src/components/board/index.js +30 -4
  6. package/src/components/common/common.js +0 -67
  7. package/src/plugin/openseadragon/openseadragon.js +667 -126
  8. package/src/util/calculate.js +79 -35
  9. package/src/util/imageData.js +0 -5
  10. package/src/view.js +6 -6
  11. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  12. package/.idea/git_toolbox_prj.xml +0 -20
  13. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  14. package/.idea/inspectionProfiles/profiles_settings.xml +0 -5
  15. package/.idea/kfb-view.iml +0 -12
  16. package/.idea/misc.xml +0 -86
  17. package/.idea/modules.xml +0 -8
  18. package/.idea/vcs.xml +0 -6
  19. package/.idea/watcherTasks.xml +0 -4
  20. package/.idea/workspace.xml +0 -874
  21. package/config/utils.js +0 -77
  22. package/config/webpack.base.conf.js +0 -95
  23. package/config/webpack.dev.conf.js +0 -80
  24. package/config/webpack.lib.conf.js +0 -92
  25. package/config/webpack.prod.conf.js +0 -102
  26. package/config/webpack.test.conf.js +0 -0
  27. package/example/index.js +0 -547
  28. package/example/label/check.svg +0 -8
  29. package/example/label/check_empty.svg +0 -9
  30. package/example/label/cross.svg +0 -6
  31. package/example/label/cross_empty.svg +0 -6
  32. package/example/label/delete.svg +0 -8
  33. package/example/label/delete_empty.svg +0 -8
  34. package/example/label/hasAudit.svg +0 -26
  35. package/example/style/index.css +0 -153
  36. package/example/worker/canvas.worker.js +0 -28
  37. package/test.html +0 -246
  38. package/yarn.lock +0 -7508
@@ -51,8 +51,20 @@ function getRectPoint(startPoint, endPoint, deg = 0) {
51
51
  }];
52
52
  }
53
53
 
54
+ /*
55
+ * 叉乘计算公式 a×b =(x1y2-x2y1)
56
+ * @param {Object} p1
57
+ * @param {Object} p2
58
+ * @return {number}
59
+ */
60
+ function crossProduct(p1, p2) {
61
+ return p1.x * p2.y - p2.x * p1.y;
62
+ }
63
+
64
+
54
65
  /**
55
- * 判断一个点是否在某条线段的一边上,就可以利用叉乘的方向性,p1p2 * p1p
66
+ * 判断一个点是否在某条线段的一边上,就可以利用叉乘的方向性,AB X AC
67
+ * (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
56
68
  * @param {Object} p1
57
69
  * @param {Object} p2
58
70
  * @param {Object} p
@@ -69,6 +81,9 @@ function getCross(p1, p2, p) {
69
81
  * @param {Object} p3
70
82
  * @param {Object} p4
71
83
  * @param {Object} p
84
+ * p1————p2
85
+ * | |
86
+ * p3————p4
72
87
  * @return {boolean}
73
88
  */
74
89
  function isPointInMatrix(p1, p2, p3, p4, p) {
@@ -78,6 +93,7 @@ function isPointInMatrix(p1, p2, p3, p4, p) {
78
93
 
79
94
  /**
80
95
  * 判断p是否在椭圆中
96
+ * x² / a² + y² / b² = 1 椭圆计算公式, <1点在椭圆内
81
97
  * @param {Object} point 点
82
98
  * @param {Object} center 椭圆中心
83
99
  * @param {Number} a 长轴
@@ -107,7 +123,6 @@ function pointInOtherPoint(point, currentPoint, width = 10) {
107
123
  /**
108
124
  * 判断一个点是否在闭合的曲线内
109
125
  * 从目标点引一条射线,判断这条线与曲线的交点个数为奇数还是偶数,为奇数表示点在曲线内,偶数表示点在曲线外。
110
- * 向Y轴正方向引射线,判断射线与曲线的交点个数。
111
126
  * @param {Object} p
112
127
  * @param {Object[]} poly
113
128
  * @return {boolean}
@@ -115,37 +130,67 @@ function pointInOtherPoint(point, currentPoint, width = 10) {
115
130
  function isPointInPolygon(p, poly) {
116
131
  const px = p.x;
117
132
  const py = p.y;
118
- let flag = false;
133
+ let count = 0;
119
134
 
120
135
  for (let i = 0, l = poly.length, j = l - 1; i < l; j = i, i++) {
121
- const sx = poly[i].x;
122
- const sy = poly[i].y;
123
- const tx = poly[j].x;
124
- const ty = poly[j].y;
125
-
126
- // 点与多边形顶点重合
127
- if ((sx === px && sy === py) || (tx === px && ty === py)) {
128
- return true;
129
- }
130
-
131
- // 判断线段两端点是否在射线两侧
132
- if ((sy < py && ty >= py) || (sy >= py && ty < py)) {
133
- // 线段上与射线 Y 坐标相同的点的 X 坐标
134
- const x = sx + (py - sy) * (tx - sx) / (ty - sy);
135
- // 点在多边形的边上,8像素的偏差
136
- if (Math.abs(x - px) < 10) {
137
- return true;
138
- }
136
+ const x0 = poly[j].x;
137
+ const y0 = poly[j].y;
138
+ const x1 = poly[i].x;
139
+ const y1 = poly[i].y;
140
+ const minY = Math.min(y0, y1);
141
+ const maxY = Math.max(y0, y1);
142
+ const minX = Math.min(x0, x1);
143
+ const maxX = Math.max(x0, x1);
139
144
 
140
- // 射线穿过多边形的边界
141
- if (x > px) {
142
- flag = !flag;
145
+ if (py > maxY) {
146
+ // 无交点,与最小外接矩形不相交
147
+ } else if (py < minY) {
148
+ // 无交点,与最小外接矩形不相交
149
+ } else { // minY <= py && py <= maxY
150
+ if (px > maxX) {
151
+ // 无交点,与最小外接矩形不相交
152
+ } else if (px < minX) { // 有交点,但需要判断是否与最小外接矩形边界重合
153
+ if (minY === py && py < maxY) {
154
+ count++; // 交点计数,与最小外接矩形下边界重合
155
+ } else if (minY < py && py === maxY) {
156
+ // 交点不计,与最小外接矩形上边界重合
157
+ } else if (minY === py && py === maxY) {
158
+ // 交点不计,与最小外接矩形上下边界重合
159
+ } else {
160
+ count++; // 交点计数,不与最小外界矩形边界重合
161
+ }
162
+ } else { // minX <= px && px <= maxX
163
+ const p1 = {
164
+ x: x0 - px,
165
+ y: y0 - py,
166
+ };
167
+ const p2 = {
168
+ x: x1 - x0,
169
+ y: y1 - y0,
170
+ };
171
+ const p3 = {
172
+ x: x1 - x0 - 100000,
173
+ y: y1 - y0,
174
+ };
175
+ // (P1Q1 X Q2Q1) *(P2Q1 X Q2Q1)
176
+ if (crossProduct(p1, p2) * crossProduct(p3, p2) > 0) {
177
+ // 跨立判断不成立
178
+ } else { // 有交点,但需要判断是否与最小外接矩形边界重合
179
+ if (minY === py && py < maxY) {
180
+ count++; // 交点计数,与最小外接矩形下边界重合
181
+ } else if (minY < py && py === maxY) {
182
+ // 交点不计,与最小外接矩形上边界重合
183
+ } else if (minY === py && py === maxY) {
184
+ // 交点不计,与最小外接矩形上下边界重合
185
+ } else {
186
+ count++; // 交点计数,不与最小外界矩形边界重合
187
+ }
188
+ }
143
189
  }
144
190
  }
145
191
  }
146
192
 
147
- // 射线穿过多边形边界的次数为奇数时点在多边形内
148
- return flag;
193
+ return count % 2 === 1;
149
194
  }
150
195
 
151
196
  /**
@@ -155,15 +200,14 @@ function isPointInPolygon(p, poly) {
155
200
  * @return {boolean}
156
201
  */
157
202
  function isPointInLine(p, points) {
158
- const startPoint = points[0];
159
- const endPoint = points[1];
160
- // 判断线段两端点是否在射线两侧
161
- if ((startPoint.y < p.y && endPoint.y >= p.y) ||
162
- (startPoint.y >= p.y && endPoint.y < p.y)) {
163
- // 线段上与射线 Y 坐标相同的点的 X 坐标
164
- const x = startPoint.x + (p.y - startPoint.y) *
165
- (endPoint.x - startPoint.x) / (endPoint.y - startPoint.y);
166
- // 点在多边形的边上,8像素的偏差
203
+ const s1 = points[0];
204
+ const s2 = points[1];
205
+ if ((s1.y < p.y && s2.y >= p.y) ||
206
+ (s1.y >= p.y && s2.y < p.y)) {
207
+ // 叉乘计算
208
+ const x = s1.x + (p.y - s1.y) *
209
+ (s2.x - s1.x) / (s2.y - s1.y);
210
+ // 8像素的偏差
167
211
  if (Math.abs(x - p.x) < 8) {
168
212
  return true;
169
213
  }
@@ -96,8 +96,3 @@ export {
96
96
  cacheGammaTable,
97
97
  };
98
98
 
99
- export const imageSharpenUM = (r, g, b) => {
100
-
101
- };
102
-
103
-
package/src/view.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import openSeadragon from './plugin/openseadragon/openseadragon';
2
2
  import './util/canvas';
3
3
  import {EventEmitter} from './util/event-emitter';
4
- import {$, dataType, deepClone, delayedTrigger} from './util';
4
+ import {$, dataType, deepClone} from './util';
5
5
  import {pointsToRegion} from './util/calculate';
6
6
  import * as COMPONENTS from './const/component';
7
7
  import * as EVENTS from './const/event';
@@ -351,8 +351,8 @@ function initEvent(kv) {
351
351
  kv.area.onCanvasRelease(e.position);
352
352
  }
353
353
  });
354
- // 键盘事件会连续触发两次
355
- kv.viewer.addHandler('canvas-key', delayedTrigger((e) => {
354
+
355
+ kv.viewer.addHandler('canvas-key', (e) => {
356
356
  const {originalEvent} = e;
357
357
  e.preventDefaultAction = originalEvent.key.indexOf('Arrow') === -1;
358
358
  handlerCacheEvent(originalEvent, kv);
@@ -367,7 +367,7 @@ function initEvent(kv) {
367
367
  kv.area?.change?.(e);
368
368
  kv.shape?.change?.(e);
369
369
  }
370
- }, 100));
370
+ });
371
371
 
372
372
  kv.viewer.addHandler('canvas-double-click', (e) => {
373
373
  if (kv.board?.isInDraw) {
@@ -393,9 +393,9 @@ function initEvent(kv) {
393
393
  let isRightDown = false;
394
394
  let dragPosition;
395
395
 
396
- kv.viewer.canvas.addEventListener('contextmenu', function(event) {
396
+ kv.viewer.addHandler('canvas-contextmenu', function(e) {
397
397
  if (kv.board?.isInDraw) {
398
- event.preventDefault();
398
+ e.preventDefault = true;
399
399
  }
400
400
  });
401
401
 
@@ -1,5 +0,0 @@
1
- <component name="ProjectCodeStyleConfiguration">
2
- <state>
3
- <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
4
- </state>
5
- </component>
@@ -1,20 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="GitToolBoxProjectSettings">
4
- <option name="commitMessageIssueKeyValidationOverride">
5
- <BoolValueOverride>
6
- <option name="enabled" value="true" />
7
- </BoolValueOverride>
8
- </option>
9
- <option name="commitMessageValidationConfigOverride">
10
- <CommitMessageValidationOverride>
11
- <option name="enabled" value="true" />
12
- </CommitMessageValidationOverride>
13
- </option>
14
- <option name="commitMessageValidationEnabledOverride">
15
- <BoolValueOverride>
16
- <option name="enabled" value="true" />
17
- </BoolValueOverride>
18
- </option>
19
- </component>
20
- </project>
@@ -1,6 +0,0 @@
1
- <component name="InspectionProjectProfileManager">
2
- <profile version="1.0">
3
- <option name="myName" value="Project Default" />
4
- <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
- </profile>
6
- </component>
@@ -1,5 +0,0 @@
1
- <component name="InspectionProjectProfileManager">
2
- <settings>
3
- <option name="PROJECT_PROFILE" />
4
- </settings>
5
- </component>
@@ -1,12 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager">
4
- <content url="file://$MODULE_DIR$">
5
- <excludeFolder url="file://$MODULE_DIR$/.tmp" />
6
- <excludeFolder url="file://$MODULE_DIR$/temp" />
7
- <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
- </content>
9
- <orderEntry type="inheritedJdk" />
10
- <orderEntry type="sourceFolder" forTests="false" />
11
- </component>
12
- </module>
package/.idea/misc.xml DELETED
@@ -1,86 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="MarkdownProjectSettings" wasCopied="true">
4
- <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true" replaceUnicodeEmoji="false" lastLayoutSetsDefault="false">
5
- <PanelProvider>
6
- <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" />
7
- </PanelProvider>
8
- </PreviewSettings>
9
- <ParserSettings gitHubSyntaxChange="false" emojiShortcuts="1" emojiImages="0">
10
- <PegdownExtensions>
11
- <option name="ABBREVIATIONS" value="false" />
12
- <option name="ANCHORLINKS" value="true" />
13
- <option name="ASIDE" value="false" />
14
- <option name="ATXHEADERSPACE" value="true" />
15
- <option name="AUTOLINKS" value="true" />
16
- <option name="DEFINITIONS" value="false" />
17
- <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" />
18
- <option name="FENCED_CODE_BLOCKS" value="true" />
19
- <option name="FOOTNOTES" value="false" />
20
- <option name="HARDWRAPS" value="false" />
21
- <option name="HTML_DEEP_PARSER" value="false" />
22
- <option name="INSERTED" value="false" />
23
- <option name="QUOTES" value="false" />
24
- <option name="RELAXEDHRULES" value="true" />
25
- <option name="SMARTS" value="false" />
26
- <option name="STRIKETHROUGH" value="true" />
27
- <option name="SUBSCRIPT" value="false" />
28
- <option name="SUPERSCRIPT" value="false" />
29
- <option name="SUPPRESS_HTML_BLOCKS" value="false" />
30
- <option name="SUPPRESS_INLINE_HTML" value="false" />
31
- <option name="TABLES" value="true" />
32
- <option name="TASKLISTITEMS" value="true" />
33
- <option name="TOC" value="false" />
34
- <option name="WIKILINKS" value="false" />
35
- </PegdownExtensions>
36
- <ParserOptions>
37
- <option name="ADMONITION_EXT" value="false" />
38
- <option name="ATTRIBUTES_EXT" value="false" />
39
- <option name="COMMONMARK_LISTS" value="true" />
40
- <option name="DUMMY" value="false" />
41
- <option name="EMOJI_SHORTCUTS" value="true" />
42
- <option name="ENUMERATED_REFERENCES_EXT" value="false" />
43
- <option name="FLEXMARK_FRONT_MATTER" value="false" />
44
- <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" />
45
- <option name="GFM_TABLE_RENDERING" value="true" />
46
- <option name="GITBOOK_URL_ENCODING" value="false" />
47
- <option name="GITHUB_LISTS" value="false" />
48
- <option name="GITHUB_WIKI_LINKS" value="false" />
49
- <option name="GITLAB_EXT" value="false" />
50
- <option name="GITLAB_MATH_EXT" value="false" />
51
- <option name="GITLAB_MERMAID_EXT" value="false" />
52
- <option name="HEADER_ID_NON_ASCII_TO_LOWERCASE" value="false" />
53
- <option name="HEADER_ID_NO_DUPED_DASHES" value="false" />
54
- <option name="JEKYLL_FRONT_MATTER" value="false" />
55
- <option name="MACROS_EXT" value="false" />
56
- <option name="NO_TEXT_ATTRIBUTES" value="false" />
57
- <option name="PARSE_HTML_ANCHOR_ID" value="false" />
58
- <option name="PLANTUML_FENCED_CODE" value="false" />
59
- <option name="PUML_FENCED_CODE" value="false" />
60
- <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
61
- </ParserOptions>
62
- </ParserSettings>
63
- <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false" imageUriSerials="false" addDocTypeHtml="true" noParaTags="false" plantUmlConversion="0" mathConversion="-1">
64
- <GeneratorProvider>
65
- <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" />
66
- </GeneratorProvider>
67
- <headerTop />
68
- <headerBottom />
69
- <bodyTop />
70
- <bodyBottom />
71
- </HtmlSettings>
72
- <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="false" isCssTextEnabled="false" isDynamicPageWidth="true">
73
- <StylesheetProvider>
74
- <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" />
75
- </StylesheetProvider>
76
- <ScriptProviders />
77
- <cssText />
78
- <cssUriHistory />
79
- </CssSettings>
80
- <AnnotatorSettings targetHasSpaces="true" linkCaseMismatch="true" wikiCaseMismatch="true" wikiLinkHasDashes="true" notUnderWikiHome="true" targetNotWikiPageExt="true" notUnderSourceWikiHome="true" targetNameHasAnchor="true" targetPathHasAnchor="true" wikiLinkHasSlash="true" wikiLinkHasSubdir="true" wikiLinkHasOnlyAnchor="true" linkTargetsWikiHasExt="true" linkTargetsWikiHasBadExt="true" notUnderSameRepo="true" targetNotUnderVcs="false" linkNeedsExt="true" linkHasBadExt="true" linkTargetNeedsExt="true" linkTargetHasBadExt="true" wikiLinkNotInWiki="true" imageTargetNotInRaw="true" repoRelativeAcrossVcsRoots="true" multipleWikiTargetsMatch="true" unresolvedLinkReference="true" linkIsIgnored="true" anchorIsIgnored="true" anchorIsUnresolved="true" anchorLineReferenceIsUnresolved="true" anchorLineReferenceFormat="true" anchorHasDuplicates="true" abbreviationDuplicates="true" abbreviationNotUsed="true" attributeIdDuplicateDefinition="true" attributeIdNotUsed="true" footnoteDuplicateDefinition="true" footnoteUnresolved="true" footnoteDuplicates="true" footnoteNotUsed="true" macroDuplicateDefinition="true" macroUnresolved="true" macroDuplicates="true" macroNotUsed="true" referenceDuplicateDefinition="true" referenceUnresolved="true" referenceDuplicates="true" referenceNotUsed="true" referenceUnresolvedNumericId="true" enumRefDuplicateDefinition="true" enumRefUnresolved="true" enumRefDuplicates="true" enumRefNotUsed="true" enumRefLinkUnresolved="true" enumRefLinkDuplicates="true" simTocUpdateNeeded="true" simTocTitleSpaceNeeded="true" />
81
- <HtmlExportSettings updateOnSave="false" parentDir="" targetDir="" cssDir="css" scriptDir="js" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetPathType="2" targetExt="" useTargetExt="false" noCssNoScripts="false" useElementStyleAttribute="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" />
82
- <LinkMapSettings>
83
- <textMaps />
84
- </LinkMapSettings>
85
- </component>
86
- </project>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/kfb-view.iml" filepath="$PROJECT_DIR$/.idea/kfb-view.iml" />
6
- </modules>
7
- </component>
8
- </project>
package/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>
@@ -1,4 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectTasksOptions" suppressed-tasks="SCSS" />
4
- </project>