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