| /** | 
|  * 内外旋轮曲线 | 
|  * @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; |