UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

76 lines (61 loc) 1.7 kB
/** * n角星(n>3) * @module zrender/graphic/shape/Star */ import Path, { PathProps } from '../Path'; const PI = Math.PI; const cos = Math.cos; const sin = Math.sin; export class StarShape { cx = 0 cy = 0 n = 3 r0: number r = 0 } export interface StarProps extends PathProps { shape?: Partial<StarShape> } class Star extends Path<StarProps> { shape: StarShape constructor(opts?: StarProps) { super(opts); } getDefaultShape() { return new StarShape(); } buildPath(ctx: CanvasRenderingContext2D, shape: StarShape) { const n = shape.n; if (!n || n < 2) { return; } const x = shape.cx; const y = shape.cy; const r = shape.r; let r0 = shape.r0; // 如果未指定内部顶点外接圆半径,则自动计算 if (r0 == null) { r0 = n > 4 // 相隔的外部顶点的连线的交点, // 被取为内部交点,以此计算r0 ? r * cos(2 * PI / n) / cos(PI / n) // 二三四角星的特殊处理 : r / 3; } const dStep = PI / n; let deg = -PI / 2; const xStart = x + r * cos(deg); const yStart = y + r * sin(deg); deg += dStep; // 记录边界点,用于判断inside ctx.moveTo(xStart, yStart); for (let i = 0, end = n * 2 - 1, ri; i < end; i++) { ri = i % 2 === 0 ? r0 : r; ctx.lineTo(x + ri * cos(deg), y + ri * sin(deg)); deg += dStep; } ctx.closePath(); } } Star.prototype.type = 'star'; export default Star;