| /** | 
|  * 玫瑰线 | 
|  * @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; |