UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

92 lines (75 loc) 1.98 kB
/** * 内外旋轮曲线 * @module zrender/graphic/shape/Trochold */ import Path, { PathProps } from '../Path'; const cos = Math.cos; const sin = Math.sin; export class TrochoidShape { cx = 0 cy = 0 r = 0 r0 = 0 d = 0 location = 'out' } export interface TrochoidProps extends PathProps { shape?: Partial<TrochoidShape> } class Trochoid extends Path<TrochoidProps> { shape: TrochoidShape constructor(opts?: TrochoidProps) { super(opts); } getDefaultStyle() { return { stroke: '#000', fill: null as string }; } getDefaultShape() { return new TrochoidShape(); } buildPath(ctx: CanvasRenderingContext2D, shape: TrochoidShape) { const R = shape.r; const r = shape.r0; const d = shape.d; const offsetX = shape.cx; const offsetY = shape.cy; const delta = shape.location === 'out' ? 1 : -1; let x1; let y1; let x2; let y2; if (shape.location && R <= r) { return; } let num = 0; let i = 1; let theta; x1 = (R + delta * r) * cos(0) - delta * d * cos(0) + offsetX; y1 = (R + delta * r) * sin(0) - d * sin(0) + offsetY; ctx.moveTo(x1, y1); // 计算结束时的i do { num++; } while ((r * num) % (R + delta * r) !== 0); do { theta = Math.PI / 180 * i; x2 = (R + delta * r) * cos(theta) - delta * d * cos((R / r + delta) * theta) + offsetX; y2 = (R + delta * r) * sin(theta) - d * sin((R / r + delta) * theta) + offsetY; ctx.lineTo(x2, y2); i++; } while (i <= (r * num) / (R + delta * r) * 360); } } Trochoid.prototype.type = 'trochoid'; export default Trochoid;