对于几何关系的计算,两点确定一条直线,两直线的交点的计算经常见到。最简单matlab编程方法是通过两点列出直线方程,使用matlab工具解方程。
但是计算时发现速度较为缓慢。
表达式定义
空间直线的表达式有多种,比如一般式Ax+By+C=0、点斜式y-y0=k(x-x0)、截距式x/a+y/b=1、两点式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等。
一般式不需要单独做处理和判断,所以在计算机领域处理二维图像数据中一般式用的最多。
已知直线上的两点P1(X1,Y1)和P2(X2,Y2),P1和P2两点不重合,对于AX+BY+C=0,则有:
A=Y2-Y1
B=X1-X2
C=X2Y1-X1Y2
matlab程序
function P = LineIntersectionPoint2D(A, B, C, D)
%LineIntersectionPoint2D
%求平面内两直线AB和CD的交点
% http://www.cnblogs.com/DHUtoBUAA/
x1 = A(1);
y1 = A(2);
x2 = B(1);
y2 = B(2);
x3 = C(1);
y3 = C(2);
x4 = D(1);
y4 = D(2);
[A1, B1, C1] = GeneralEquation(x1,y1,x2,y2);
[A2, B2, C2] = GeneralEquation(x3,y3,x4,y4);
m=A1*B2-A2*B1;
if m==0
disp('无交点!');
P = -1;
else
x=(C2*B1-C1*B2)/m;
y=(C1*A2-C2*A1)/m;
P = [x, y];
end
end
%%%%%%%%%%%%%%%%%%
function [A,B,C] = GeneralEquation(first_x,first_y,second_x,second_y)
%一般式 Ax+By+C=0
% from http://www.cnblogs.com/DHUtoBUAA/
A=second_y-first_y;
B=first_x-second_x;
C=second_x*first_y-first_x*second_y;
end
C++版
double *getIntersectpointofLines(double A[2], double B[2], double C[2], double D[2])
{
double getPoint[2]
double m = (B[1] - A[1])*(C[0] - D[0]) - (D[1] - C[1])*(A[0] - B[0]);
if (m == 0){
intersect = false;
getPoint[0] = 0;
getPoint[1] = 0;
}
else
{
intersect = true;
getPoint[0] = ((D[0] * C[1] - C[0] * D[1])*(A[0] - B[0]) - (B[0] * A[1] - A[0] * B[1])*(C[0] - D[0])) / m;
getPoint[1] = ((B[0] * A[1] - A[0] * B[1])*(D[1] - C[1]) - (D[0] * C[1] - C[0] * D[1])*(B[1] - A[1])) / m;
}
return getPoint;
}