zrender
Version:
A lightweight graphic library providing 2d draw for Apache ECharts
96 lines (79 loc) • 1.99 kB
text/typescript
/**
* 直线
* @module zrender/graphic/shape/Line
*/
import Path, { PathProps } from '../Path';
import {subPixelOptimizeLine} from '../helper/subPixelOptimize';
import { VectorArray } from '../../core/vector';
// Avoid create repeatly.
const subPixelOptimizeOutputShape = {};
export class LineShape {
// Start point
x1 = 0
y1 = 0
// End point
x2 = 0
y2 = 0
percent = 1
}
export interface LineProps extends PathProps {
shape?: Partial<LineShape>
}
class Line extends Path<LineProps> {
shape: LineShape
constructor(opts?: LineProps) {
super(opts);
}
getDefaultStyle() {
return {
stroke: '#000',
fill: null as string
};
}
getDefaultShape() {
return new LineShape();
}
buildPath(ctx: CanvasRenderingContext2D, shape: LineShape) {
let x1;
let y1;
let x2;
let y2;
if (this.subPixelOptimize) {
const optimizedShape = subPixelOptimizeLine(
subPixelOptimizeOutputShape, shape, this.style
);
x1 = optimizedShape.x1;
y1 = optimizedShape.y1;
x2 = optimizedShape.x2;
y2 = optimizedShape.y2;
}
else {
x1 = shape.x1;
y1 = shape.y1;
x2 = shape.x2;
y2 = shape.y2;
}
const percent = shape.percent;
if (percent === 0) {
return;
}
ctx.moveTo(x1, y1);
if (percent < 1) {
x2 = x1 * (1 - percent) + x2 * percent;
y2 = y1 * (1 - percent) + y2 * percent;
}
ctx.lineTo(x2, y2);
}
/**
* Get point at percent
*/
pointAt(p: number): VectorArray {
const shape = this.shape;
return [
shape.x1 * (1 - p) + shape.x2 * p,
shape.y1 * (1 - p) + shape.y2 * p
];
}
}
Line.prototype.type = 'line';
export default Line;