一、算法理论分析
首先,介绍一下初中数学内容,直线方程的两点式形式。
解析式:
说明:
1、在已知直线上两点坐标时,常用两点式来表示直线方程。
2、当
或
时,直线方程不能用两点式表示,因为此时两点式的分母为0,方程无意义。即两点式方程不能用来表示坐标轴或与坐标轴平行的直线。
图片来源:百度百科——两点式
在上面的基础上,我们开始讨论两直线的交点问题。
假设已知有两条直线
,且已知
上的两点为(x1,y1),(x2,y2).
上的两点为(x3,y3),(x4,y4).
那么,我们可以得到两直线的两点式方程
,
联立两个方程,我们可以得到
①求交点Y坐标
将联立的方程变形,使两个方程的左侧只有未知数x,
可以计算出交点纵坐标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);