二维平面内两直线交点计算

	对于几何关系的计算,两点确定一条直线,两直线的交点的计算经常见到。最简单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;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法进行编程和具体的功能测试。但是,我可以提供一些关于空间直线段类型的信息和示例代码供参考。 在C++中,可以定义一个类来封装空间直线段类型。以下是一个示例代码: ```cpp class LineSegment { private: double A, B, C, D; // 直线段方程系数 Point3D startPoint, endPoint; // 直线段的起点和终点 public: LineSegment(); // 无参构造函数 LineSegment(Point3D start, Point3D end); // 有参构造函数 LineSegment(const LineSegment& other); // 拷贝构造函数 void printInfo(); // 信息输出函数 double area(); // 面积计算函数 double distanceToLine(LineSegment line); // 平面直线(平行线)之间的距离计算函数 double distanceToPoint(Point3D point); // 计算任意点到当前直线的距离 void init(Point3D start, Point3D end); // 初始化函数 void setStartPoint(Point3D start); // 起点属性修改函数 void setEndPoint(Point3D end); // 终点属性修改函数 Point3D getStartPoint(); // 起点属性访问函数 Point3D getEndPoint(); // 终点属性访问函数 Point3D intersect(LineSegment line); // 计算直线交点坐标 double angle(LineSegment line); // 计算直线的夹角 Point3D perpendicularFoot(Point3D point); // 直线外一点到该直线的垂足 }; ``` 其中,Point3D是一个封装了三维坐标的类,可以自行定义实现。 在测试函数中,可以编写一些示例代码,测试LineSegment类中各个方法的正确性。例如: ```cpp int main() { Point3D start(0, 0, 0); Point3D end(1, 1, 1); LineSegment line(start, end); line.printInfo(); cout << "Area: " << line.area() << endl; cout << "Distance to line: " << line.distanceToLine(line) << endl; cout << "Distance to point: " << line.distanceToPoint(Point3D(2, 2, 2)) << endl; line.setStartPoint(Point3D(1, 2, 3)); line.setEndPoint(Point3D(4, 5, 6)); cout << "Start point: " << line.getStartPoint().toString() << endl; cout << "End point: " << line.getEndPoint().toString() << endl; cout << "Intersection point: " << line.intersect(LineSegment(Point3D(0, 0, 0), Point3D(1, 0, 0))).toString() << endl; cout << "Angle: " << line.angle(LineSegment(Point3D(1, 2, 3), Point3D(2, 3, 4))) << endl; cout << "Perpendicular foot: " << line.perpendicularFoot(Point3D(1, 1, 1)).toString() << endl; return 0; } ``` 需要注意的是,测试函数中的参数和方法调用需要根据具体的情况进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值