vislite
Version:
灵活、快速、简单的数据可视化交互式跨端前端库
177 lines (164 loc) • 5.03 kB
text/typescript
import type CanvasConfigType from "../../../types/CanvasConfig"
import arc from "./arc"
// 文字统一设置方法
export const initText = function (
painter: CanvasRenderingContext2D,
config: CanvasConfigType,
x: number,
y: number,
deg: number
) {
painter.beginPath();
painter.translate(x, y);
painter.rotate(deg);
painter.font =
config.fontStyle +
" " +
config.fontWeight +
" " +
config.fontSize +
"px " +
config.fontFamily;
return painter
}
// 画弧统一设置方法
export const initArc = function (
painter: CanvasRenderingContext2D,
config: CanvasConfigType,
cx: number,
cy: number,
r1: number,
r2: number,
beginDeg: number,
deg: number
) {
if (r1 > r2) {
const temp = r1
r1 = r2
r2 = temp
}
beginDeg = beginDeg % (Math.PI * 2)
// 当|deg|>=2π的时候都认为是一个圆环
// 为什么不取2π比较,是怕部分浏览器浮点不精确
if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
deg = Math.PI * 2
} else {
deg = deg % (Math.PI * 2)
}
arc(
beginDeg,
deg,
cx,
cy,
r1,
r2,
function (
beginA: number,
endA: number,
begInnerX: number,
begInnerY: number,
begOuterX: number,
begOuterY: number,
endInnerX: number,
endInnerY: number,
endOuterX: number,
endOuterY: number,
r: number
) {
if (r < 0) r = -r
painter.beginPath()
painter.moveTo(begInnerX, begInnerY)
painter.arc(
// (圆心x,圆心y,半径,开始角度,结束角度,true逆时针/false顺时针)
cx,
cy,
r1,
beginA,
endA,
false
)
// 结尾
if (config.arcEndCap == "round")
painter.arc(
(endInnerX + endOuterX) * 0.5,
(endInnerY + endOuterY) * 0.5,
r,
endA - Math.PI,
endA,
true
)
else if (config.arcEndCap == "-round")
painter.arc(
(endInnerX + endOuterX) * 0.5,
(endInnerY + endOuterY) * 0.5,
r,
endA - Math.PI,
endA,
false
)
else painter.lineTo(endOuterX, endOuterY)
painter.arc(cx, cy, r2, endA, beginA, true)
// 开头
if (config.arcStartCap == "round")
painter.arc(
(begInnerX + begOuterX) * 0.5,
(begInnerY + begOuterY) * 0.5,
r,
beginA,
beginA - Math.PI,
true
)
else if (config.arcStartCap == "-round")
painter.arc(
(begInnerX + begOuterX) * 0.5,
(begInnerY + begOuterY) * 0.5,
r,
beginA,
beginA - Math.PI,
false
)
else painter.lineTo(begInnerX, begInnerY)
}
)
if (config.arcStartCap == "butt") painter.closePath()
return painter
}
// 画圆统一设置方法
export const initCircle = function (
painter: CanvasRenderingContext2D,
cx: number,
cy: number,
r: number
) {
painter.beginPath()
painter.moveTo(cx + r, cy)
painter.arc(cx, cy, r, 0, Math.PI * 2)
return painter
};
// 画矩形统一设置方法
export const initRect = function (
painter: CanvasRenderingContext2D,
config: CanvasConfigType,
x: number,
y: number,
width: number,
height: number
) {
painter.beginPath()
const rectRadius: Array<number> = [];
if (Array.isArray(config.rectRadius) && config.rectRadius.length > 0) {
for (let index = 0; index < 4; index++) {
rectRadius.push(...config.rectRadius)
}
}
if (rectRadius.length >= 4) {
painter.arc(x + rectRadius[0], y + rectRadius[0], rectRadius[0], Math.PI, Math.PI * 1.5)
painter.arc(x + width - rectRadius[1], y + rectRadius[1], rectRadius[1], 1.5 * Math.PI, 0)
painter.arc(x + width - rectRadius[2], y + height - rectRadius[2], rectRadius[2], 0, Math.PI * 0.5)
painter.arc(x + rectRadius[3], y + height - rectRadius[3], rectRadius[3], 0.5 * Math.PI, Math.PI)
painter.closePath()
} else {
painter.rect(x, y, width, height)
}
return painter
}