/**
|
* 玫瑰线
|
* @module zrender/graphic/shape/Rose
|
*/
|
|
import Path, { PathProps } from '../Path';
|
|
const sin = Math.sin;
|
const cos = Math.cos;
|
const radian = Math.PI / 180;
|
|
export class RoseShape {
|
cx = 0
|
cy = 0
|
r: number[] = []
|
k = 0
|
n = 1
|
}
|
|
export interface RoseProps extends PathProps {
|
shape?: Partial<RoseShape>
|
}
|
class Rose extends Path<RoseProps> {
|
|
shape: RoseShape
|
|
constructor(opts?: RoseProps) {
|
super(opts);
|
}
|
|
getDefaultStyle() {
|
return {
|
stroke: '#000',
|
fill: null as string
|
};
|
}
|
|
getDefaultShape() {
|
return new RoseShape();
|
}
|
|
|
buildPath(ctx: CanvasRenderingContext2D, shape: RoseShape) {
|
const R = shape.r;
|
const k = shape.k;
|
const n = shape.n;
|
const x0 = shape.cx;
|
const y0 = shape.cy;
|
let x;
|
let y;
|
let r;
|
|
|
ctx.moveTo(x0, y0);
|
|
for (let i = 0, len = R.length; i < len; i++) {
|
r = R[i];
|
|
for (let j = 0; j <= 360 * n; j++) {
|
x = r
|
* sin(k / n * j % 360 * radian)
|
* cos(j * radian)
|
+ x0;
|
y = r
|
* sin(k / n * j % 360 * radian)
|
* sin(j * radian)
|
+ y0;
|
ctx.lineTo(x, y);
|
}
|
}
|
}
|
}
|
|
Rose.prototype.type = 'rose';
|
|
export default Rose;
|