求直线交点 叉积

一般方程法:

直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0

因此我们可以将两条直线分别表示为

F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0

那么两条直线的交点应该满足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/D

y = (a1*c0 – a0*c1)/D

D = a0*b1 – a1*b0 (D0时,表示两直线重合)

二者实际上就是连立方程组F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0的叉积应用

i     j     k

a0 b0 c0

a1 b1 c1


#include"iostream"
#include"stdio.h"
#include"math.h"
using namespace std;

struct Point
{
	double x;
	double y;
};

struct Line
{
	Point p1,p2;
	double a,b,c;
};

void GetLinePara(Line *l)
{
	l->a=l->p1.y-l->p2.y;
	l->b=l->p2.x-l->p1.x;
	l->c=l->p1.x*l->p2.y-l->p2.x*l->p1.y;
}

Point GetCrossPoint(Line *l1,Line *l2)
{
	GetLinePara(l1);
	GetLinePara(l2);
	double D=l1->a*l2->b-l2->a*l1->b;
	Point p;
	p.x=(l1->b*l2->c-l2->b*l1->c)/D;
	p.y=(l1->c*l2->a-l2->c*l1->a)/D;
	return p;
}

int main()
{
	Line l1,l2;
	while(true)
	{
		scanf("%lf%lf%lf%lf",&l1.p1.x,&l1.p1.y,&l1.p2.x,&l1.p2.y);
		scanf("%lf%lf%lf%lf",&l2.p1.x,&l2.p1.y,&l2.p2.x,&l2.p2.y);
		Point Pc=GetCrossPoint(&l1,&l2);
		printf("Cross point:%lf %lf\n",Pc.x,Pc.y);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值