我最终做了以下事情:
// Determine polygon points
beginArrowPoints(pathCoords: { x: number; y: number }[]) {
return this.getPolygonCoords(pathCoords, 0);
}
endArrowPoints(pathCoords: { x: number; y: number }[]) {
return this.getPolygonCoords(pathCoords, pathCoords.length - 1);
}
// set rotation on transform
rotateBegin(pathCoords: { x: number; y: number }[]) {
const endPoint = pathCoords[1];
const startPoint = pathCoords[0];
const angleDeg = this.determineRotationAngle(endPoint, startPoint);
return `rotate(${angleDeg}, ${startPoint.x}, ${startPoint.y})`;
}
rotateEnd(pathCoords: { x: number; y: number }[]) {
const endPoint = pathCoords[pathCoords.length - 1];
const startPoint = pathCoords[pathCoords.length - 2];
const angleDeg = this.determineRotationAngle(endPoint, startPoint);
return `rotate(${angleDeg}, ${endPoint.x}, ${endPoint.y})`;
}
private determineRotationAngle(endPoint: { x: number; y: number }, startPoint: { x: number; y: number }) {
const deltaX = Math.abs(endPoint.x - startPoint.x);
const deltaY = endPoint.y - startPoint.y;
return Math.atan2(deltaY, deltaX) * 180 / Math.PI + 180; // invert by turning 180 degrees
}
private getPolygonCoords(pathCoords: { x: number; y: number }[], index: number) {
const {x, y} = pathCoords[index];
const p1 = `${x} ${y}`;
const p2 = `${x + 7.5} ${y + 5}`;
const p3 = `${x + 7.5} ${y - 5}`;
return `${p1}, ${p2}, ${p3}`;
}
产生如下多边形:
<g>
<polygon id="start" points="240 0, 247.5 5, 247.5 -5" ="rotate(180, 240, 0)"></polygon>
<polygon id="end" points="1038 694.32, 1045.5 699.32, 1045.5 689.32" transform="rotate(235.4921735667412, 1038, 694.32)"></polygon>
<path d="M240,0L330,0L402,29.82L507,158.32L522,174.82L690,320.94L720,320.94L792,372.32L819,405.52L825,411.92L852,445.48L936,556.32L987,618.96L990.0000000000001,624.5L1038,694.32" ></path>
</g>
然后可以对整个组进行样式设置和事件处理