如示意图所示,已知起止点坐标point1,point2,计算中间流向三角形三个点坐标p1,p2,centerPoint
//获取流向分析三角形三个点坐标,参数point1 起点, point2 终点
getPoints(point1, point2) {
let _this = this;
//中心点
let centerPoint = {
x: (point1.x + point2.x) / 2,
y: (point1.y + point2.y) / 2
};
//流向箭头三角形中垂线长度
let len = 2;
//流向箭头三角形底边长度一半
let dlen = 1;
//逻辑:当斜率大于0时,p1在downpoint的左上方,则p1的x坐标为downpoint.x减偏移距离,y坐标为downpoint.y加偏移距离
let dx = 1, dy = 1;
if (centerPoint.x < point1.x) {
dx = -1
}
if (centerPoint.y < point1.y) {
dy = -1
}
//流向箭头三角形底边两点
let p1, p2;
//管线垂直时
if (point1.x == point2.x) {
p1 = {
x: centerPoint.x - dlen,
y: centerPoint.y - dy * len
}
p2 = {
x: centerPoint.x + dlen,
y: centerPoint.y - dy * len
}
}
//管线水平时
else if (point1.y == point2.y) {
p1 = {
x: centerPoint.x - dx * len,
y: centerPoint.y + dlen
}
p2 = {
x: centerPoint.x - dx * len,
y: centerPoint.y - dlen
}
}
else {
//斜率
let k = (point2.y - point1.y) / (point2.x - point1.x);
//垂线斜率
let k1 = -1 / k;
//三角形底边中心点
let lenk = len / _this.getPtLen(centerPoint, point1);
let downpoint = {
x: centerPoint.x - ((centerPoint.x - point1.x) * lenk),
y: centerPoint.y - ((centerPoint.y - point1.y) * lenk)
}
//求三角形底边两点坐标
//逻辑:当斜率大于0时,p1在downpoint的左上方,则p1的x坐标为downpoint.x减偏移距离,y坐标为downpoint.y加偏移距离
p1 = {
x: downpoint.x - dx * Math.sqrt(dlen * dlen / (1 + k1 * k1)),
y: downpoint.y + dy * Math.sqrt(Math.abs(dlen * dlen / (1 + 1 / (k1 * k1))))
}
p2 = {
x: downpoint.x + dx * Math.sqrt(dlen * dlen / (1 + k1 * k1)),
y: downpoint.y - dy * Math.sqrt(Math.abs(dlen * dlen / (1 + 1 / (k1 * k1))))
}
}
let arr = [];
arr.push(p1);
arr.push(p2);
arr.push(centerPoint);
return arr;
},
getPtLen(pt1, pt2) {
return Math.sqrt(
(pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y)
);
},