vislite 0.2.0 → 0.3.0-alpha.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.
- package/AUTHORS.txt +6 -6
- package/CHANGELOG +19 -1
- package/LICENSE +20 -20
- package/README.md +53 -53
- package/lib/Canvas/index.umd.js +91 -14
- package/lib/Canvas/index.umd.min.js +7 -3
- package/lib/Cardinal/index.umd.js +6 -2
- package/lib/Cardinal/index.umd.min.js +6 -2
- package/lib/Eoap/index.umd.js +6 -2
- package/lib/Eoap/index.umd.min.js +6 -2
- package/lib/Hermite/index.umd.js +6 -2
- package/lib/Hermite/index.umd.min.js +6 -2
- package/lib/Matrix4/index.umd.js +6 -2
- package/lib/Matrix4/index.umd.min.js +6 -2
- package/lib/Mercator/index.umd.js +6 -2
- package/lib/Mercator/index.umd.min.js +6 -2
- package/lib/OralCanvas/index.es.js +91 -14
- package/lib/OralCanvas/index.es.min.js +7 -3
- package/lib/OralWebGL/index.es.js +8 -2
- package/lib/OralWebGL/index.es.min.js +6 -2
- package/lib/SVG/index.umd.js +82 -62
- package/lib/SVG/index.umd.min.js +7 -3
- package/lib/WebGL/index.umd.js +6 -2
- package/lib/WebGL/index.umd.min.js +6 -2
- package/lib/animation/index.umd.js +6 -2
- package/lib/animation/index.umd.min.js +6 -2
- package/lib/getLoopColors/index.umd.js +6 -2
- package/lib/getLoopColors/index.umd.min.js +6 -2
- package/lib/index.umd.js +167 -74
- package/lib/index.umd.min.js +7 -3
- package/lib/rotate/index.umd.js +6 -2
- package/lib/rotate/index.umd.min.js +6 -2
- package/lib/ruler/index.umd.js +6 -2
- package/lib/ruler/index.umd.min.js +6 -2
- package/lib/viewHandler/index.umd.js +6 -2
- package/lib/viewHandler/index.umd.min.js +6 -2
- package/miniprogram/ui-canvas/index.json +4 -4
- package/miniprogram/ui-canvas/index.wxml +4 -4
- package/miniprogram/ui-canvas/index.wxss +5 -5
- package/package/Canvas/index.ts +1 -1
- package/package/Cardinal/index.ts +2 -2
- package/package/Eoap/index.ts +2 -2
- package/package/Hermite/index.ts +2 -2
- package/package/Matrix4/index.ts +2 -2
- package/package/OralCanvas/index.ts +1 -1
- package/package/OralWebGL/index.ts +1 -1
- package/package/SVG/index.ts +2 -2
- package/package/animation/index.ts +2 -2
- package/package/getLoopColors/index.ts +2 -2
- package/package/rotate/index.ts +2 -2
- package/package/ruler/index.ts +2 -2
- package/package.json +4 -4
- package/src/Matrix4/index.ts +76 -76
- package/src/Matrix4/move.ts +12 -12
- package/src/Matrix4/rotate.ts +15 -15
- package/src/Matrix4/scale.ts +11 -11
- package/src/Matrix4/transform.ts +64 -64
- package/src/animation.ts +99 -99
- package/src/common/canvas/arc.ts +50 -50
- package/src/common/canvas/config.ts +142 -61
- package/src/common/canvas/gradient.ts +29 -0
- package/src/common/canvas/index.ts +122 -82
- package/src/common/canvas/painter.ts +12 -0
- package/src/common/setStyle.ts +5 -5
- package/src/common/svg/config.ts +173 -128
- package/src/common/svg/index.ts +315 -266
- package/src/common/svg/tool.ts +43 -43
- package/src/getLoopColors.ts +42 -42
- package/src/interpolation/Cardinal.ts +91 -91
- package/src/interpolation/Hermite.ts +65 -65
- package/src/rotate.ts +7 -7
- package/src/ruler.ts +99 -99
- package/types/Canvas.d.ts +282 -221
- package/types/CanvasConfig.d.ts +3 -3
- package/types/Cardinal.d.ts +13 -13
- package/types/Gradient.d.ts +15 -0
- package/types/Hermite.d.ts +18 -18
- package/types/Matrix4.d.ts +42 -42
- package/types/SVG.d.ts +210 -210
- package/types/animation.d.ts +6 -6
- package/types/getLoopColors.d.ts +2 -2
- package/types/rotate.d.ts +2 -2
- package/types/ruler.d.ts +2 -2
- package/uni-app/ui-canvas.vue +22 -46
|
@@ -1,97 +1,137 @@
|
|
|
1
|
-
import CanvasConfigType from
|
|
2
|
-
import PainterRender from
|
|
3
|
-
import assemble from
|
|
1
|
+
import CanvasConfigType from "../../../types/CanvasConfig"
|
|
2
|
+
import PainterRender from "./painter"
|
|
3
|
+
import assemble from "../assemble"
|
|
4
|
+
import { linearGradient, radialGradient } from "./gradient"
|
|
4
5
|
|
|
5
6
|
// 属性名向下兼容
|
|
6
7
|
let oldAttrName = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
"font-size": "fontSize",
|
|
9
|
+
"font-family": "fontFamily",
|
|
10
|
+
"font-weight": "fontWeight",
|
|
11
|
+
"font-style": "fontStyle",
|
|
12
|
+
"arc-start-cap": "arcStartCap",
|
|
13
|
+
"arc-end-cap": "arcEndCap",
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
class Canvas extends PainterRender {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
readonly name: string = "Canvas"
|
|
18
|
+
|
|
19
|
+
private __regionList = {} //区域映射表
|
|
20
|
+
private __regionAssemble = assemble(0, 255, 1, 3)
|
|
21
|
+
|
|
22
|
+
constructor(ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement) {
|
|
23
|
+
super(
|
|
24
|
+
ViewCanvas,
|
|
25
|
+
{},
|
|
26
|
+
new PainterRender(RegionCanvas, {
|
|
27
|
+
willReadFrequently: true,
|
|
28
|
+
})
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
this.setRegion("")
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
config(configs: CanvasConfigType) {
|
|
35
|
+
for (let key in configs) {
|
|
36
|
+
let _key = oldAttrName[key] || key
|
|
37
|
+
this.useConfig(_key, configs[key])
|
|
28
38
|
}
|
|
29
39
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
return this
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 设置当前绘制区域名称
|
|
44
|
+
setRegion(regionName: string | number) {
|
|
45
|
+
if (regionName) {
|
|
46
|
+
if (this.__regionList[regionName] == undefined) {
|
|
47
|
+
let tempColor = this.__regionAssemble()
|
|
48
|
+
this.__regionList[regionName] =
|
|
49
|
+
"rgb(" + tempColor[0] + "," + tempColor[1] + "," + tempColor[2] + ")"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.__region.useConfig("fillStyle", this.__regionList[regionName]) &&
|
|
53
|
+
this.__region.useConfig("strokeStyle", this.__regionList[regionName])
|
|
54
|
+
} else {
|
|
55
|
+
this.__region.useConfig("fillStyle", "#000000") &&
|
|
56
|
+
this.__region.useConfig("strokeStyle", "#000000")
|
|
57
|
+
}
|
|
58
|
+
return this
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 获取当前事件触发的区域名称
|
|
62
|
+
getRegion(x: number, y: number): Promise<string> {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
let imgData = this.__region.painter.getImageData(x - 0.5, y - 0.5, 1, 1)
|
|
65
|
+
|
|
66
|
+
// 获取点击点的颜色
|
|
67
|
+
let currentRGBA = imgData.data
|
|
68
|
+
|
|
69
|
+
let doit = () => {
|
|
70
|
+
// 查找当前点击的区域
|
|
71
|
+
for (let key in this.__regionList) {
|
|
72
|
+
if (
|
|
73
|
+
"rgb(" +
|
|
74
|
+
currentRGBA[0] +
|
|
75
|
+
"," +
|
|
76
|
+
currentRGBA[1] +
|
|
77
|
+
"," +
|
|
78
|
+
currentRGBA[2] +
|
|
79
|
+
")" ==
|
|
80
|
+
this.__regionList[key]
|
|
81
|
+
) {
|
|
82
|
+
resolve(key)
|
|
83
|
+
break
|
|
84
|
+
}
|
|
34
85
|
}
|
|
35
86
|
|
|
36
|
-
|
|
37
|
-
|
|
87
|
+
resolve("")
|
|
88
|
+
}
|
|
38
89
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
let tempColor = this.__regionAssemble()
|
|
44
|
-
this.__regionList[regionName] = "rgb(" + tempColor[0] + "," + tempColor[1] + "," + tempColor[2] + ")"
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
this.__region.useConfig("fillStyle", this.__regionList[regionName]) &&
|
|
48
|
-
this.__region.useConfig("strokeStyle", this.__regionList[regionName])
|
|
49
|
-
} else {
|
|
50
|
-
this.__region.useConfig("fillStyle", "#000000") &&
|
|
51
|
-
this.__region.useConfig("strokeStyle", "#000000")
|
|
52
|
-
}
|
|
53
|
-
return this
|
|
54
|
-
}
|
|
90
|
+
// 如果有值
|
|
91
|
+
if (currentRGBA) {
|
|
92
|
+
doit()
|
|
93
|
+
}
|
|
55
94
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// 获取点击点的颜色
|
|
62
|
-
let currentRGBA = imgData.data
|
|
63
|
-
|
|
64
|
-
let doit = () => {
|
|
65
|
-
// 查找当前点击的区域
|
|
66
|
-
for (let key in this.__regionList) {
|
|
67
|
-
if ("rgb(" + currentRGBA[0] + "," + currentRGBA[1] + "," + currentRGBA[2] + ")" == this.__regionList[key]) {
|
|
68
|
-
resolve(key)
|
|
69
|
-
break
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
resolve("")
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// 如果有值
|
|
77
|
-
if (currentRGBA) {
|
|
78
|
-
doit()
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// 否则就是在Promise中
|
|
82
|
-
else {
|
|
83
|
-
(imgData as any).then((data: Uint8ClampedArray) => {
|
|
84
|
-
currentRGBA = data
|
|
85
|
-
doit()
|
|
86
|
-
})
|
|
87
|
-
}
|
|
95
|
+
// 否则就是在Promise中
|
|
96
|
+
else {
|
|
97
|
+
(imgData as any).then((data: Uint8ClampedArray) => {
|
|
98
|
+
currentRGBA = data
|
|
99
|
+
doit()
|
|
88
100
|
})
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 获取原始画笔
|
|
106
|
+
getContext(isRegion = false) {
|
|
107
|
+
return isRegion ? this.__region.painter : this.painter
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 线性渐变
|
|
111
|
+
createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
|
|
112
|
+
return linearGradient(this.painter, x0, y0, x1, y1)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 环形渐变
|
|
116
|
+
createRadialGradient(cx: number, cy: number, r: number) {
|
|
117
|
+
return radialGradient(this.painter, cx, cy, r)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 获取指定位置颜色
|
|
121
|
+
getColor(x: number, y: number) {
|
|
122
|
+
let currentRGBA = this.painter.getImageData(x - 0.5, y - 0.5, 1, 1).data
|
|
123
|
+
return (
|
|
124
|
+
"rgba(" +
|
|
125
|
+
currentRGBA[0] +
|
|
126
|
+
"," +
|
|
127
|
+
currentRGBA[1] +
|
|
128
|
+
"," +
|
|
129
|
+
currentRGBA[2] +
|
|
130
|
+
"," +
|
|
131
|
+
currentRGBA[3] +
|
|
132
|
+
")"
|
|
133
|
+
)
|
|
134
|
+
}
|
|
95
135
|
}
|
|
96
136
|
|
|
97
|
-
export default Canvas
|
|
137
|
+
export default Canvas
|
|
@@ -101,6 +101,12 @@ class Painter {
|
|
|
101
101
|
|
|
102
102
|
// 如果已经存在默认配置中,说明只需要缓存起来即可
|
|
103
103
|
else if (key in this.__specialConfig) {
|
|
104
|
+
|
|
105
|
+
// 文字非整数可能存在问题,修复一下
|
|
106
|
+
if (key == 'fontSize') {
|
|
107
|
+
value = Math.round(value)
|
|
108
|
+
}
|
|
109
|
+
|
|
104
110
|
this.__specialConfig[key] = value
|
|
105
111
|
}
|
|
106
112
|
|
|
@@ -251,6 +257,12 @@ class Painter {
|
|
|
251
257
|
this.painter.restore()
|
|
252
258
|
return this
|
|
253
259
|
}
|
|
260
|
+
clip() {
|
|
261
|
+
if (this.__region) this.__region.clip()
|
|
262
|
+
|
|
263
|
+
this.painter.clip()
|
|
264
|
+
return this
|
|
265
|
+
}
|
|
254
266
|
|
|
255
267
|
// 路径 - 贝塞尔曲线
|
|
256
268
|
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
|
package/src/common/setStyle.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// 修改样式
|
|
2
|
-
export default function (el: HTMLElement | SVGElement, styles: any) {
|
|
3
|
-
for (let key in styles) {
|
|
4
|
-
el.style[key] = styles[key]
|
|
5
|
-
}
|
|
1
|
+
// 修改样式
|
|
2
|
+
export default function (el: HTMLElement | SVGElement, styles: any) {
|
|
3
|
+
for (let key in styles) {
|
|
4
|
+
el.style[key] = styles[key]
|
|
5
|
+
}
|
|
6
6
|
}
|
package/src/common/svg/config.ts
CHANGED
|
@@ -1,128 +1,173 @@
|
|
|
1
|
-
import { setAttribute } from "./tool"
|
|
2
|
-
import setStyle from "../setStyle"
|
|
3
|
-
import arc from
|
|
4
|
-
import SVGConfigType from
|
|
5
|
-
|
|
6
|
-
// 文字统一设置方法
|
|
7
|
-
export let initText = (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
setAttribute(el,
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
1
|
+
import { setAttribute } from "./tool"
|
|
2
|
+
import setStyle from "../setStyle"
|
|
3
|
+
import arc from "../canvas/arc"
|
|
4
|
+
import SVGConfigType from "../../../types/SVGConfig"
|
|
5
|
+
|
|
6
|
+
// 文字统一设置方法
|
|
7
|
+
export let initText = (
|
|
8
|
+
el: SVGElement,
|
|
9
|
+
config: SVGConfigType,
|
|
10
|
+
x: number,
|
|
11
|
+
y: number,
|
|
12
|
+
deg: number
|
|
13
|
+
) => {
|
|
14
|
+
if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
|
|
15
|
+
|
|
16
|
+
// 垂直对齐采用dy实现
|
|
17
|
+
setAttribute(
|
|
18
|
+
el,
|
|
19
|
+
"dy",
|
|
20
|
+
{
|
|
21
|
+
top: config["fontSize"] * 0.5,
|
|
22
|
+
middle: 0,
|
|
23
|
+
bottom: -config["fontSize"] * 0.5,
|
|
24
|
+
}[config.textBaseline]
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
setStyle(el, {
|
|
28
|
+
// 文字对齐方式
|
|
29
|
+
"text-anchor": {
|
|
30
|
+
left: "start",
|
|
31
|
+
right: "end",
|
|
32
|
+
center: "middle",
|
|
33
|
+
}[config.textAlign],
|
|
34
|
+
"dominant-baseline": "central",
|
|
35
|
+
|
|
36
|
+
// 文字大小和字体设置
|
|
37
|
+
"font-size": config["fontSize"] + "px",
|
|
38
|
+
"font-family": config["fontFamily"],
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// 位置
|
|
42
|
+
setAttribute(el, "x", x)
|
|
43
|
+
setAttribute(el, "y", y)
|
|
44
|
+
|
|
45
|
+
// 旋转
|
|
46
|
+
if (typeof deg == "number") {
|
|
47
|
+
deg = deg % 360
|
|
48
|
+
setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 画圆统一设置方法
|
|
53
|
+
export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
|
|
54
|
+
if (el.nodeName.toLowerCase() !== "circle")
|
|
55
|
+
throw new Error("Need a <circle> !")
|
|
56
|
+
setAttribute(el, "cx", cx)
|
|
57
|
+
setAttribute(el, "cy", cy)
|
|
58
|
+
setAttribute(el, "r", r)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 路径统一设置方法
|
|
62
|
+
export let initPath = (el: SVGElement, path: string) => {
|
|
63
|
+
if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
|
|
64
|
+
setAttribute(el, "d", path)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 画矩形统一设置方法
|
|
68
|
+
export let initRect = (
|
|
69
|
+
el: SVGElement,
|
|
70
|
+
x: number,
|
|
71
|
+
y: number,
|
|
72
|
+
width: number,
|
|
73
|
+
height: number
|
|
74
|
+
) => {
|
|
75
|
+
if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
|
|
76
|
+
|
|
77
|
+
// 由于高和宽不可以是负数,校对一下
|
|
78
|
+
if (height < 0) {
|
|
79
|
+
height *= -1
|
|
80
|
+
y -= height
|
|
81
|
+
}
|
|
82
|
+
if (width < 0) {
|
|
83
|
+
width *= -1
|
|
84
|
+
x -= width
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
setAttribute(el, "x", x)
|
|
88
|
+
setAttribute(el, "y", y)
|
|
89
|
+
setAttribute(el, "width", width)
|
|
90
|
+
setAttribute(el, "height", height)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 画弧统一设置方法
|
|
94
|
+
export let initArc = (
|
|
95
|
+
el: SVGElement,
|
|
96
|
+
config: SVGConfigType,
|
|
97
|
+
cx: number,
|
|
98
|
+
cy: number,
|
|
99
|
+
r1: number,
|
|
100
|
+
r2: number,
|
|
101
|
+
beginDeg: number,
|
|
102
|
+
deg: number
|
|
103
|
+
) => {
|
|
104
|
+
if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
|
|
105
|
+
|
|
106
|
+
beginDeg = (beginDeg / 180) * Math.PI
|
|
107
|
+
deg = (deg / 180) * Math.PI
|
|
108
|
+
|
|
109
|
+
beginDeg = beginDeg % (Math.PI * 2)
|
|
110
|
+
|
|
111
|
+
if (r1 > r2) {
|
|
112
|
+
let temp = r1
|
|
113
|
+
r1 = r2
|
|
114
|
+
r2 = temp
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 当|deg|>=2π的时候都认为是一个圆环
|
|
118
|
+
if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
|
|
119
|
+
deg = Math.PI * 1.999999
|
|
120
|
+
} else {
|
|
121
|
+
deg = deg % (Math.PI * 2)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
arc(
|
|
125
|
+
beginDeg,
|
|
126
|
+
deg,
|
|
127
|
+
cx,
|
|
128
|
+
cy,
|
|
129
|
+
r1,
|
|
130
|
+
r2,
|
|
131
|
+
function (
|
|
132
|
+
beginA: number,
|
|
133
|
+
endA: number,
|
|
134
|
+
begInnerX: number,
|
|
135
|
+
begInnerY: number,
|
|
136
|
+
begOuterX: number,
|
|
137
|
+
begOuterY: number,
|
|
138
|
+
endInnerX: number,
|
|
139
|
+
endInnerY: number,
|
|
140
|
+
endOuterX: number,
|
|
141
|
+
endOuterY: number,
|
|
142
|
+
r: number
|
|
143
|
+
) {
|
|
144
|
+
let f = endA - beginA > Math.PI ? 1 : 0,
|
|
145
|
+
d = "M" + begInnerX + " " + begInnerY
|
|
146
|
+
if (r < 0) r = -r
|
|
147
|
+
|
|
148
|
+
d +=
|
|
149
|
+
// 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
|
|
150
|
+
"A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
|
|
151
|
+
|
|
152
|
+
// 结尾
|
|
153
|
+
if (config.arcEndCap == "round")
|
|
154
|
+
d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
|
|
155
|
+
else if (config.arcEndCap == "-round")
|
|
156
|
+
d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
|
|
157
|
+
else d += "L" + endOuterX + " " + endOuterY
|
|
158
|
+
d +=
|
|
159
|
+
"A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
|
|
160
|
+
|
|
161
|
+
// 开头
|
|
162
|
+
if (config.arcStartCap == "round")
|
|
163
|
+
d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
|
|
164
|
+
else if (config.arcStartCap == "-round")
|
|
165
|
+
d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
|
|
166
|
+
else d += "L" + begInnerX + " " + begInnerY
|
|
167
|
+
|
|
168
|
+
if (config.arcStartCap == "butt") d += "Z"
|
|
169
|
+
|
|
170
|
+
setAttribute(el, "d", d)
|
|
171
|
+
}
|
|
172
|
+
)
|
|
173
|
+
}
|