线段相交----结构体

该程序使用C++实现了一个结构体来描述平面上的线段,并通过判断线段的端点和斜率来确定两条线段是否相交。算法首先比较线段端点的坐标,然后计算斜率并检查是否存在交点。如果斜率不同,计算交点坐标并检查是否在线段范围内;若斜率相同,则比较端点位置。
摘要由CSDN通过智能技术生成

线段相交----结构体

题目描述

每个线段是用平面上的两个点来描述,用结构体实现对于任意输入的2个线段,判断其是否相交。

提示:两点(x1,y1), (x2,y2) 间直线斜率是k=(y2-y1)/(x2-x1).

输入

判断次数和2条线段的x1、y1、x2、y2

输出

是否相交

示例输入

3
1 5 2 9
1 3 2 4
5 6 7 8
5 7 7 7
2 5 1 0
9 4 2 9

示例输出

disjoint
intersect
disjoint

#include<iostream>
using namespace std;
struct line
{
	int x1,y1;
	int x2,y2;
}line1,line2;
int main()
{
	int t,i,line1max,line1min,line2max,line2min;
	double k1,k2,b1,b2,c;
	cin>>t;
	for(i=0;i<t;i++)
	{
		cin>>line1.x1>>line1.y1>>line1.x2>>line1.y2;
		cin>>line2.x1>>line2.y1>>line2.x2>>line2.y2;
		k1=(line1.y2-line1.y1)/(line1.x2-line1.x1);
		k2=(line2.y2-line2.y1)/(line2.x2-line2.x1);
		if(line1.x1>line1.x2)
			{
				line1max=line1.x1;
				line1min=line1.x2;
			}
		else
			{
				line1max=line1.x2;
				line1min=line1.x1;
			}
		if(line2.x1>line2.x2)
			{
				line2max=line2.x1;
				line2min=line2.x2;
			}
		else
			{
				line2max=line2.x2;
				line2min=line2.x1;
			}
		if(k1!=k2)
		{
			b1=line1.y1-k1*line1.x1;
			b2=line2.y1-k2*line2.x1;
			c=(b2-b1)/(k1-k2);
			if(c>line1max||c<line1min||c>line2max||c<line2min)
			cout<<"disjoint"<<endl;
			else
			cout<<"intersect"<<endl;
		}
		else 
		{
			if(line1.x1<line2max&&line1.x1>line2min||line2.x1>line1min&&line2.x1<line2max)
			{
				cout<<"intersect"<<endl;
			}
			else
			cout<<"disjoint"<<endl;
		}
		
	}
	return 0;
}
Bentley-Ottmann算法是一种用于计算平面线段相交的算法。它可以找到所有线段的交点,并按照其在 x 轴上的顺序进行排序。这个算法的时间复杂度是 O((n + k) log n),其中 n 是线段的数量,k 是交点的数量。它是一种非常高效的算法,被广泛应用于计算几何和图形学领域。 该算法的基本思想是,通过扫描线的方式从上到下依次处理线段,并将与当前扫描线相交线段添加到一条有序链表中。当处理完所有线段时,根据链表中线段相交顺序,即可得到线段的交点。 在执行过程中,需要使用一个事件队列来存储线段的起点和终点,并按照其在 x 轴上的位置进行排序。同时,还需要使用一个状态结构体来记录当前扫描线的位置以及与之相交线段。 该算法的主要步骤包括: 1. 初始化事件队列,并按照线段的起点和终点位置进行排序。 2. 初始化扫描线位置,并创建一个空的有序链表。 3. 从事件队列中取出一个事件,并根据事件类型进行处理。 - 如果是线段的起点,则将该线段插入到有序链表中,并检查与之相邻的线段是否相交。 - 如果是线段的终点,则将该线段从有序链表中删除,并检查与之相邻的线段是否相交。 - 如果是交点事件,则交换两条线段在有序链表中的位置,并检查与之相邻的线段是否相交。 4. 重复步骤3,直到事件队列为空。 通过以上步骤,Bentley-Ottmann算法可以找到所有线段的交点,并按照其在 x 轴上的顺序进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值