arcgis for js 求线与线的交点

这篇博客详细介绍了如何使用JavaScript实现计算几何中的多段线交点算法。通过`getPolyLinesIntersection`函数求解线段交点,并在`polyLinesIntersection`函数中遍历所有线段对,找出所有交点。算法考虑了线段平行或不相交的情况,并确保交点在线段范围内。这对于图形处理和地图应用等领域具有重要意义。
摘要由CSDN通过智能技术生成
//求多段线的交点
            polyLinesIntersection(polyline, polyline2) {
                let result = [];
                for (let j = 0; j < polyline.length - 1; j++) {
                    let tempLine = [polyline[j], polyline[j + 1]];
                    for (let i = 0; i < polyline2.length - 1; i++) {
                        let line2 = [polyline2[i], polyline2[i + 1]];
                        let llt = GeometricCalculationTools.getPolyLinesIntersection(tempLine, line2);
                        if (llt) {
                            result.push(llt);
                        }
                    }
                }
                if (result.length > 0) {
                    return result;
                }
                return false;

            },

/**
   * 线段平行或者不相交返回false 否则返回交点坐标
   * @param line1
   * @param line2
   * @returns {*}
   */
  getPolyLinesIntersection: (line1, line2) => {
    //a b 代表线段1的两个端点  c d 代表线段2的两个端点
    let a = {
      x: line1[0][0], y: line1[0][1],
    }, b = {
      x: line1[1][0], y: line1[1][1],
    }, c = {
      x: line2[0][0], y: line2[0][1],
    }, d = {
      x: line2[1][0], y: line2[1][1],
    };
    /** 1 解线性方程组, 求线段交点. **/
      // 如果分母为0 则平行或共线, 不相交
    let denominator = (b.y - a.y) * (d.x - c.x) - (a.x - b.x) * (c.y - d.y);
    if (denominator === 0) {
      return false;
    }
    // 线段所在直线的交点坐标 (x , y)
    let x = ((b.x - a.x) * (d.x - c.x) * (c.y - a.y)
      + (b.y - a.y) * (d.x - c.x) * a.x
      - (d.y - c.y) * (b.x - a.x) * c.x) / denominator;
    let y = -((b.y - a.y) * (d.y - c.y) * (c.x - a.x)
      + (b.x - a.x) * (d.y - c.y) * a.y
      - (d.x - c.x) * (b.y - a.y) * c.y) / denominator;
    /** 2 判断交点是否在两条线段上 **/
    if (
      // 交点在线段1上
      (x - a.x) * (x - b.x) <= 0 && (y - a.y) * (y - b.y) <= 0
      // 且交点也在线段2上
      && (x - c.x) * (x - d.x) <= 0 && (y - c.y) * (y - d.y) <= 0
    ) {
      // 返回交点p
      return {
        x: x,
        y: y
      }
    }
    //否则不相交
    return false
  },

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值