C# 计算两直线的交点坐标——直线方程两点式算法(附 计算ArcEngine中的两个线要素交点代码)

本文介绍了两点式直线方程的应用,以及如何在ArcEngine中利用该算法计算两条线要素的交点,包括直接两点式求解和通过ITopologicalOperator接口的相交运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、算法理论分析 

首先,介绍一下初中数学内容,直线方程的两点式形式。

解析式: \tfrac{}{}\tfrac{x-x1}{x2-x1}=\tfrac{y-y1}{y2-y1}

说明:

1、在已知直线上两点坐标时,常用两点式来表示直线方程。

2、当x1=x2y1=y2 时,直线方程不能用两点式表示,因为此时两点式的分母为0,方程无意义。即两点式方程不能用来表示坐标轴或与坐标轴平行的直线。

图片来源:百度百科——两点式

   在上面的基础上,我们开始讨论两直线的交点问题。

   假设已知有两条直线l1,l2,且已知l1上的两点为(x1,y1),(x2,y2).l2上的两点为(x3,y3),(x4,y4).

   那么,我们可以得到两直线的两点式方程l1:\tfrac{x-x1}{x2-x1}=\frac{y-y1}{y2-y1}l2:\tfrac{x-x3}{x4-x3}=\frac{y-y3}{y4-y3}

   联立两个方程,我们可以得到\left\{\begin{matrix} \frac{x-x1}{x2-x1}=\frac{y-y1}{y2-y1} \\\\ \frac{x-x3}{x4-x3}=\frac{y-y3}{y4-y3} \end{matrix}\right.

   ①求交点Y坐标

   将联立的方程变形,使两个方程的左侧只有未知数x,

        

\left\{\begin{matrix} x=\tfrac{(y-y1)(x2-x1)}{y2-y1}+x1 \\\\ x=\tfrac{(y-y3)(x4-x3)}{y4-y3}+x3 \end{matrix}\right.\Rightarrow\tfrac{(y-y1)(x2-x1)}{y2-y1}+x1=\tfrac{(y-y3)(x4-x3)}{y4-y3}+x3

  可以计算出交点纵坐标Y  ((y2 - y1) * (y3 - y4) * (x3 - x1) -y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4)) /((x2 - x1) * (y3 - y4) - (y2 - y1) * (x3 - x4))

 ②求交点X坐标

    计算原理同上,不再赘述

    计算得到的交点横坐标X ((x2 - x1) * (x3 - x4) * (y3 - y1) -x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 - x4)) /((y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4))

二、ArcEngine中计算两线要素交点代码

①使用两点式算法结果求交点

using ESRI.ArcGIS.Geometry;

//此处polyline未赋值,请读者根据自己的程序需求,赋值后使用
IPolyline line1;
IPolyline line2;

//此方法为有返回值的交点计算方法,返回值为double数组,用于储存xy坐标值
private double[] ComputeIntersetPt(double x1, double y1,double x2, double y2,double x3, double y3,double x4, double y4)
{
    //根据直线方程两点式求得的交点坐标
    var x = ((x2 - x1) * (x3 - x4) * (y3 - y1) -
            x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 - x4)) /
            ((y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4));
    var y = ((y2 - y1) * (y3 - y4) * (x3 - x1) -
            y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4)) /
            ((x2 - x1) * (y3 - y4) - (y2 - y1) * (x3 - x4));
    return new double[] { x, y };
}

//FromPoint为线要素起点,ToPoint为终点
var intersetPtCoor = ComputeIntersetPt(
    line1.FromPoint.X, line1.FromPoint.Y,
    line1.ToPoint.X, line1.ToPoint.Y,
    line2.FromPoint.X, line2.FromPoint.Y,
    line2.ToPoint.X, line2.ToPoint.Y
    );
//将XY坐标实例化为点要素
IPoint intersectPt = new PointClass() { X = intersetPtCoor[0], Y = intersetPtCoor[1] };

②通过ITopologicalOperator接口的相交运算得到点的集合。由于两条线相交只有一个交点。因此通过点集合的第一个值,可以得到两个线要素的交点。

using ESRI.ArcGIS.Geometry;

//此处polyline未赋值,请读者根据自己的程序需求,赋值后使用
IPolyline line1;
IPolyline line2;

ITopologicalOperator pTopo = line1 as ITopologicalOperator;
IGeometry pGeo = pTopo.Intersect(line2, esriGeometryDimension.esriGeometry0Dimension);
IPoint pPoint = new PointClass();
pPoint = (pGeo as IPointCollection).get_Point(0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值