根据起止点坐标计算流向箭头三角形坐标

如示意图所示,已知起止点坐标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)
      );
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值