zrender
Version:
A lightweight graphic library providing 2d draw for Apache ECharts
92 lines (75 loc) • 1.98 kB
text/typescript
/**
* 内外旋轮曲线
* @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;