怎样判断线段相交

合集下载

线段相交算法 c语言

线段相交算法 c语言

线段相交算法c语言全文共四篇示例,供读者参考第一篇示例:线段相交算法是计算机图形学中常见的问题,用来判断两条线段是否相交。

在实际应用中,线段相交算法通常用于处理碰撞检测、路径规划等任务。

本文将介绍一种常见的线段相交算法,并使用C语言实现。

1. 线段相交的定义在平面几何中,两条线段可以分为四种情况:相离、相切、相交和重合。

线段相交算法的目标是判断给定的两条线段是否相交,即它们是否有公共点。

2. 线段相交算法线段相交算法有多种实现方法,其中一种常见的方法是利用向量叉积。

假设有两条线段AB和CD,首先计算向量AB和向量AC的叉积,再计算向量AB和向量AD的叉积,最后判断这两个叉积的符号是否相反。

如果符号相反,则线段AB和线段CD相交。

3. 线段相交算法的实现下面是一个使用C语言实现的线段相交算法的示例代码:```c#include <stdio.h>typedef struct {double x;double y;} Point;int crossProduct(Point a, Point b, Point c) {return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);}int isIntersect(Point a, Point b, Point c, Point d) {if (crossProduct(a, b, c) * crossProduct(a, b, d) < 0&& crossProduct(c, d, a) * crossProduct(c, d, b) < 0) {return 1;} else {return 0;}}return 0;}```4. 程序分析在上面的示例代码中,我们首先定义了一个Point结构体来表示二维平面上的点,然后实现了crossProduct函数来计算向量的叉积,最后实现了isIntersect函数来判断两条线段是否相交。

线段的判定习题

线段的判定习题

线段的判定习题线段的判断题题目一:如下图所示,已知线段AB和线段CD的起点坐标和终点坐标,请判断是否两条线段相交。

![线段图示](image.png)解答:根据线段的特性,两条线段相交的条件是:某一线段的一个端点在另一线段的两个端点之间,并且另一条线段的一个端点也在第一条线段的两个端点之间。

根据题目中给出的起点坐标和终点坐标,我们可以计算出线段的斜率,然后比较两条线段的斜率。

设线段AB的起点坐标为(x1, y1),终点坐标为(x2, y2);线段CD的起点坐标为(x3, y3),终点坐标为(x4, y4)。

首先计算线段AB的斜率:AB的斜率 = (y2 - y1) / (x2 - x1)然后计算线段CD的斜率:CD的斜率 = (y4 - y3) / (x4 - x3)如果两条线段的斜率相等,则它们平行或重合,不相交;如果两条线段的斜率不相等,则它们有可能相交。

需要进一步判断相交的条件是:1. 线段AB的起点坐标在线段CD的两个端点之间,并且线段CD的起点坐标在线段AB的两个端点之间;2. 或者线段CD的起点坐标在线段AB的两个端点之间,并且线段AB的起点坐标在线段CD的两个端点之间。

通过以上条件的判断,我们可以得出两条线段是否相交的结论。

题目二:如下图所示,已知线段EF的起点坐标和终点坐标,请判断线段EF是否与线段AB相交。

![线段图示](image.png)解答:根据线段的特性,线段EF与线段AB相交的条件是:线段EF 的一个端点在线段AB的两个端点之间,并且线段AB的一个端点也在线段EF的两个端点之间。

根据题目中给出的起点坐标和终点坐标,我们可以计算出线段的斜率,然后比较两条线段的斜率。

设线段EF的起点坐标为(x1, y1),终点坐标为(x2, y2);线段AB的起点坐标为(x3, y3),终点坐标为(x4, y4)。

首先计算线段EF的斜率:EF的斜率 = (y2 - y1) / (x2 - x1)然后计算线段AB的斜率:AB的斜率 = (y4 - y3) / (x4 - x3)如果线段EF的斜率等于线段AB的斜率,并且线段EF的一个端点在线段AB的两个端点之间,或线段AB的一个端点在线段EF 的两个端点之间,则线段EF与线段AB相交。

相交与垂直的知识点

相交与垂直的知识点

相交与垂直的知识点相交与垂直是几何学中常见的概念,它们描述了图形之间的关系和性质。

相交与垂直的概念对于解决几何问题和理解空间关系非常重要。

本文将详细介绍相交和垂直的定义、性质以及应用。

一、相交的定义与性质相交是指两个或多个线、线段、射线、直线或曲线在一个点或一条线上相遇的情况。

相交的概念是几何学中最基本的概念之一。

1. 直线相交:当两条直线交于一个点时,它们被称为相交直线。

相交直线的性质包括:相交直线上的点是两条直线的公共点;相交直线上的点将两条直线分成两个相邻的角,这两个角被称为相邻角。

2. 平行线相交:当两条平行线被一条直线截断时,它们被称为相交平行线。

相交平行线的性质包括:两条相交平行线的交点与这两条平行线上的任意一点连线,这条连线既垂直于这两条平行线,也垂直于它们的公共垂线。

3. 线段相交:当两个线段有公共点时,它们被称为相交线段。

相交线段的性质包括:如果两个线段相交,那么它们的交点是两个线段的公共点。

4. 射线相交:当两个射线有公共点时,它们被称为相交射线。

相交射线的性质包括:如果两个射线相交,那么它们的交点是两个射线的公共点。

二、垂直的定义与性质垂直是指两条直线、线段、射线或曲线在一个点上相交,并且交角为90度。

垂直的概念是几何学中常见的关系之一。

1. 垂直直线:当两条直线相交且交角为90度时,它们被称为垂直直线。

垂直直线的性质包括:垂直直线上的点将两条直线分成两组相等的相邻角,这两组相邻角互补。

2. 垂直线段:当两个线段相交且交角为90度时,它们被称为垂直线段。

垂直线段的性质包括:垂直线段的交点是两个线段的公共点,垂直线段的长度相等。

3. 垂直射线:当两个射线相交且交角为90度时,它们被称为垂直射线。

垂直射线的性质包括:垂直射线的交点是两个射线的公共点,垂直射线的角度相等。

三、相交与垂直的应用相交与垂直的概念在几何学中有着广泛的应用,下面将介绍几个常见的应用场景。

1. 建筑设计中的垂直:在建筑设计中,垂直是指墙壁与地面垂直相交。

如何判断两条线段的相交情况

如何判断两条线段的相交情况

如何判断两条线段的相交情况线段相交问题在计算几何中是一个常见的问题。

判断两条线段是否相交具有重要的实际意义,尤其在计算机图形学、建筑设计和交通规划等领域中。

本文将介绍判断两条线段相交情况的方法和算法。

一、方法一:端点法端点法是最直观和简单的方法之一。

我们可以通过观察线段的端点位置来判断它们的相交情况。

该方法适用于线段没有重叠的情况。

下面是判断两条线段相交情况的步骤:1. 分别计算两条线段的斜率。

2. 如果两条线段的斜率都存在且不相等,说明两条线段不平行,可能相交。

3. 因为相交的线段必然有一个共同的端点,所以我们只需要判断两条线段的端点是否满足以下条件之一:第一个线段的两个端点都在第二条线段的两侧,或者第二条线段的两个端点都在第一条线段的两侧。

如果满足这个条件,说明两条线段相交。

二、方法二:向量法向量法是另一种常用的判断线段相交情况的方法。

该方法通过向量的运算和性质来判断两条线段是否相交。

下面是使用向量法判断线段相交情况的步骤:1. 计算两条线段的向量表示。

2. 设两条线段分别为AB和CD,根据向量的性质,线段AB和线段CD相交的充要条件是:向量AD和向量AB的方向不同,同时向量CA和向量CD的方向也不同。

即(AB × AD) * (CD × CA) < 0,其中×表示向量的叉积运算,*表示向量的点积运算。

3. 如果上述条件成立,则说明两条线段相交。

三、方法三:跨立实验法跨立实验法是判断线段相交情况的另一种有效方法。

该方法通过判断线段所处的相对位置来确定它们是否相交。

以下是跨立实验法的步骤:1. 以线段的一个端点作为起点,另一个端点作为终点,创建两个向量。

2. 分别计算两个向量与第三个向量的叉积。

3. 如果两个叉积的乘积小于0,说明两条线段相交。

四、方法四:区间相交法区间相交法是一种将线段映射到区间上的方法,通过判断两个区间是否有重叠来确定线段是否相交。

以下是区间相交法的步骤:1. 将两条线段在x轴和y轴上分别投影,得到两个x轴上的区间和两个y轴上的区间。

相交与垂直 知识点总结

相交与垂直 知识点总结

相交与垂直知识点总结一、相交的概念相交是指两条线段、两条直线或者一个线段和一个直线在空间中相互交叉或者相互穿过的关系。

在几何学中,我们通常将相交分为两种情况:相交和无公共点交。

1.相交两条线段或两条直线在空间中有一个或多个交点时,我们称它们相交。

比如两条相交的直线在所在平面上有一个交点,两条相交的线段在空间中也会有一个交点。

2.无公共点交当两条线段或两条直线在空间中没有任何交点时,我们称它们为无公共点交。

比如两条在不同平面上的直线,它们在三维空间中是不会相交的。

相交的概念是描述线段和直线之间的关系的基础,它在几何证明和问题求解中都有着重要的应用。

在实际问题中,我们经常需要判断不同线段或者直线之间是否相交,来进行相关的计算和推导。

二、相交的性质1.相交线段的性质相交线段的性质是指两个线段在空间中相互交叉的一些特点和规律。

其中最重要的性质是相交线段的交点只能是线段本身或者线段的延长线上的点。

这个性质在几何证明和问题求解中经常被用到。

2.相交直线的性质相交直线的性质是指两个直线在同一平面内相互交叉的一些规律。

在同一平面内的两条相交直线必然会有一个交点,而且相交直线之间的夹角不一定相等。

这些性质对于相关定理的证明和问题求解都有着重要的作用。

三、垂直的概念垂直是指两条线段或两条直线在空间中互相垂直交叉的关系。

在几何学中,垂直通常是用来描述两条直线或者线段之间的特殊关系,而这个关系在许多几何定理和问题中都有着重要的作用。

1.垂直线段两条线段如果相互垂直交叉,我们就称它们为垂直线段。

垂直线段之间的夹角通常为90度,而且它们所在的直线也是相互垂直交叉的。

2.垂直直线两条直线如果相互垂直交叉,我们就称它们为垂直直线。

垂直直线之间的夹角也通常为90度,而且它们在同一平面内相互交叉。

垂直是一种特殊的相交关系,在几何学中有着重要的应用。

在实际问题中,我们经常需要判断不同直线或者线段之间是否垂直,来进行相关的计算和推导。

相交线的性质和几何应用

相交线的性质和几何应用

相交线的性质和几何应用相交线是几何学中常见的概念,不仅有着重要的性质,还能在许多几何问题中得到应用。

本文将主要探讨相交线的性质以及在几何学中的一些应用。

一、基本性质相交线是指在平面上相交的两条线段、射线或直线。

首先,我们来讨论相交线的基本性质。

1. 相交线的位置关系:当两条线段相交时,其交点在两条线段的两个延长线段之间;当射线和线段相交时,其交点在射线的起点和线段的延长线段上;当两条射线相交时,其交点在两个射线的延长线段上;当两条直线相交时,其交点在两条直线上。

2. 相交线的夹角:相交线的夹角是指两条相交线之间的夹角。

根据夹角的大小,我们可以将相交线分为三种情况:相交线的夹角为锐角、直角或钝角。

这种性质在解决角度相关的几何问题时非常有用。

3. 相交线的长度关系:当两条相交线段及其延长线段相交时,我们可以根据线段长度的比较来判断相交线段的位置关系。

若两条线段相等,则交点在两条线段中间;若一条线段较长,则交点在较长线段的外侧;若一条线段较短,则交点在较短线段的内侧。

二、几何应用1. 证明几何定理:相交线在证明几何定理时起到关键作用。

比如,在证明“两角平分线相交于一点”的定理时,常常需要通过画两条角的角平分线,然后证明这两条角平分线相交于一点。

2. 解决几何问题:相交线可以用来解决许多几何问题。

比如,当我们需要构造一个平行于已知直线的直线时,可以通过画一条与已知直线相交的射线,然后测量出相同长度的线段,从而得到平行线。

3. 分析图形关系:相交线可以帮助我们分析图形之间的关系。

比如,在分析平行四边形时,我们可以通过相交线的性质来证明四个内角相等、对边平行等性质。

4. 求解几何问题:相交线可以用来求解几何问题。

比如,在解决三角形的面积时,我们可以通过画三角形的高,将三角形分为两个直角三角形,从而应用熟悉的面积公式来求解。

综上所述,相交线是几何学中重要的概念,具有许多重要的性质和应用。

通过研究相交线的性质,我们不仅能够深入理解几何学的基本概念,还能够应用它们来解决实际问题。

判断多段线是否重叠

判断多段线是否重叠

判断多段线是否重叠
判断多段线是否重叠的一个简单方法是通过检查每个线段与其他线段是否相交来确定。

具体步骤如下:
1. 遍历多段线的所有线段。

2. 对于当前的线段,依次与其他线段进行相交检查。

3. 如果发现任何两个线段相交,则说明多段线重叠。

4. 如果所有线段都没有相交,则说明多段线没有重叠。

需要注意的是,相交的定义可以根据需要进行调整。

例如,可以将线段的端点也视为相交。

在实现中,可以使用相交检查算法(如线段与线段的相交检查算法)来判断线段是否相交。

青岛版小学四年级上册《平行与相交》课件

青岛版小学四年级上册《平行与相交》课件

判断线段是否相交
相交线段的特征
线段之间有共同的交点
实例演示
数学实例
我们将用具体的数学实例来演示平行与相交的线段是否平行或 相交。
如图所示,两条直线上的线段互相相交。
判断平行与相交
1 平行线段
2 相交线段
通过对比线段的长度和方向来判断是否平行。
观察线段的方向和位置关系来判断是否相交。
掌握方法
1
步骤 1
观察线段的长度。
2
步骤 2
对比线段的方向。
3
步骤 3
判断线段是平行还是相交。
判断线段是否平行
平行线段的特征
两条线段的长度相等且方向一致
青岛版小学四年级上册 《平行与相交》课件
课程介绍:本节课将详细介绍平行和相交的概念,让孩子们掌握判断线段平 行和相交的方法。
平行与相交
平行线段
两条直线上的线段互相平行。
特征
长度相等且方向一致。
方法
通过对比线段的长度和方向判断线段是否平行。
平行与相交
平行线段
如图所示,两条直线上的线段互相平行。
相交线段

cad当中让两条线相交的操作方法

cad当中让两条线相交的操作方法

cad当中让两条线相交的操作方法1.引言1.1 概述概述部分内容:在CAD(计算机辅助设计)软件中,相交是一个常见的操作。

当我们在绘制图纸或者进行设计工作时,有时会遇到需要两条线相交的情况。

在实际应用中,通过相交操作,我们可以方便地实现图纸的设计和修改。

本文将介绍CAD软件中让两条线相交的操作方法。

首先,我们将概述整篇文章的结构。

然后,我们会探讨CAD中线段的基本操作,以及解释两条线相交的意义。

最后,我们将总结两条线相交的具体操作方法,并讨论其在实际应用中的意义。

通过阅读本文,读者将能够了解在CAD软件中如何精确地让两条线相交,从而能够更好地应用于自己的设计工作中。

这将提高我们的设计效率,并帮助我们更好地实现设计的目标。

在接下来的章节中,我们将逐步深入介绍CAD中线段操作和相交操作的相关知识。

通过阅读本文,读者将获得一些有用的技巧和经验,能够更加熟练地应用CAD软件进行设计工作。

希望本文能够对读者在CAD设计方面的学习和工作有所帮助。

1.2文章结构在文章结构部分,我们将介绍和解释本文的整体组织和内容布局。

通过清晰的文章结构,读者可以更好地理解本文的内容和逻辑。

本文分为引言、正文和结论三个主要部分。

引言部分包括概述、文章结构和目的三个小节。

首先,我们将通过概述部分介绍CAD中的线段基本操作,并引出接下来要讨论的两条线相交的操作方法。

接着,我们将说明文章的整体结构,以帮助读者更好地理解本文的篇章组织。

最后,我们明确本文的目的,即介绍CAD中让两条线相交的操作方法,以便读者可以在实际应用中灵活运用。

正文部分将详细介绍CAD中的线段基本操作和两条线相交的意义。

首先,在2.1节中,我们将介绍CAD中线段基本操作的基本操作方法和技巧。

这些基本操作包括绘制线段、修改线段长度和方向、删除线段等。

通过掌握这些基本操作,读者可以更好地理解和应用后续讨论的两条线相交的操作方法。

其次,在2.2节中,我们将阐述两条线相交的意义。

线段的相交关系与判断方法总结

线段的相交关系与判断方法总结

线段的相交关系与判断方法总结线段是几何学中常见的基本图形,其相交关系的判断在许多问题中起着重要的作用。

本文将总结线段的相交关系及判断方法,希望能为读者提供一些实用的知识。

一、线段的相交关系线段的相交关系可以分为以下几种情况:1. 相离:两条线段没有任何交点,且彼此之间没有任何重叠的部分。

2. 相交:两条线段有一个或多个交点,但没有共享的端点。

3. 重叠:两条线段有一个或多个交点,并且有共享的端点。

4. 嵌套:一条线段完全包含在另一条线段内部,且两条线段没有共享的端点。

二、线段相交关系的判断方法1. 直线方程法通过求解两条线段所在直线的方程,可以判断线段是否相交。

若两条线段所在直线的方程有唯一的交点,即表示两条线段相交;若两条线段所在直线的方程无解,即表示两条线段相离;若两条线段所在直线的方程有无穷多解,即表示两条线段重叠或嵌套。

2. 向量法通过计算两条线段的向量叉积,可以判断线段是否相交。

若两条线段的向量叉积为0,即表示两条线段平行或共线;若两条线段的向量叉积不为0,再通过判断交点是否在两条线段的延长线上,可以确定线段是否相交。

3. 端点法通过比较两条线段的端点位置,可以判断线段的相交关系。

若两条线段的最大端点小于最小端点,即表示两条线段相离;若两条线段的最大端点等于最小端点,即表示两条线段有共享的端点;若两条线段的最大端点大于最小端点,再通过判断交点是否在两条线段上,可以确定线段的相交关系。

4. 包围盒法通过计算两条线段的包围盒,可以判断线段是否相交。

若两条线段的包围盒不相交,即表示两条线段相离;若两条线段的包围盒相交,再通过判断交点是否在两条线段上,可以确定线段的相交关系。

三、线段相交关系的应用线段的相交关系在计算机图形学、计算几何、物理仿真等领域有广泛的应用。

1. 计算机图形学线段的相交关系可以用于求解线段与线段、线段与多边形、线段与圆等图形的相交情况,从而实现图形的裁剪、碰撞检测等功能。

初中数学 如何判断两个线段是否相交

初中数学 如何判断两个线段是否相交

初中数学如何判断两个线段是否相交
在初中数学中,我们可以使用以下方法来判断两个线段是否相交:
方法一:比较端点位置
1. 确定两个线段的端点A、B和C、D。

2. 比较线段AB和线段CD的位置关系。

- 如果线段AB的两个端点都在线段CD的同一侧,或者线段CD的两个端点都在线段AB的同一侧,则两个线段不相交。

- 如果线段AB的一个端点在线段CD的一侧,另一个端点在线段CD的另一侧,或者线段CD的一个端点在线段AB的一侧,另一个端点在线段AB的另一侧,则两个线段相交。

方法二:利用向量叉积
1. 确定两个线段的端点A、B和C、D。

2. 计算向量AB和向量AC的叉积,得到一个结果。

3. 计算向量AB和向量AD的叉积,得到另一个结果。

4. 如果两个结果的乘积小于0,则两个线段相交;如果乘积等于0,则两个线段共线但可能不相交;如果乘积大于0,则两个线段不相交。

方法三:利用直线相交的方法
1. 将两个线段所在的直线方程表示成一般式Ax + By + C = 0。

2. 求出两个直线的交点,如果交点不在两个线段的延长线上,则两个线段相交。

注意事项:
- 在使用向量叉积和直线相交方法时,需要注意处理特殊情况,如两个线段共线的情况。

- 在实际问题中,我们可以根据具体情况选择适合的方法来进行判断。

以上是判断两个线段是否相交的方法。

掌握这些方法可以帮助我们在数学问题中准确判断线段的相交情况,并应用于实际问题的解决。

两条线段是否相交,计算交点公式

两条线段是否相交,计算交点公式

两条线段是否相交,计算交点公式A本⾝⽆限长,假设B也⽆限长,直接求得AB的交点坐标,然后再判断该坐标是否在定长线段B的内部就可以了啊 AB本⾝就是两条直线,知道两端点就可以知道其直线⽅程,B也是⼀样,两个⽅程联⽴,得到⼀个坐标,再看该坐标是否在B的定义域内就可以啊A的两点为(x1,y1),(x2,y2)则A的直线⽅程为l1:y-y1=(y2-y1)(x-x1)/(x2-x1)B的两点为(x3,y3),(x4,y4)则B的直线⽅程为l2:y-y3=(y4-y3)(x-x3)/(x4-x3)联⽴解出交点坐标为的横坐标为:x=(k2x3-y3-k1x1+y1)/(k2-k1)其中k1=(y2-y1)/(x2-x1)k2=(y4-y3)/(x4-x3)可以推导出来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));同理也可以推导出y的值:y = ((y2 - y1) * (y3 - y4) * (x3 - x1) -y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4)) /((y2 - y1) * (y3 - y4) - (y2 - y1) * (x3 - x4));总结://第⼀条直线double x1 = 10, y1 = 20, x2 = 100, y2 = 200;double a = (y1 - y2) / (x1 - x2);double b = (x1 * y2 - x2 * y1) / (x1 - x2);System.out.println("求出该直线⽅程为: y=" + a + "x + " + b);//第⼆条double x3 = 50, y3 = 20, x4 = 20, y4 = 100;double c = (y3 - y4) / (x3 - x4);double d = (x3 * y4 - x4 * y3) / (x3 - x4);System.out.println("求出该直线⽅程为: y=" + c + "x + " + d);double x = ((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1))/ ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4));double y = ((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4))/ ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4));System.out.println("他们的交点为: (" + x + "," + y + ")");下⾯附上java的实现,前提是:a 线段1起点坐标b 线段1终点坐标c 线段2起点坐标d 线段2终点坐标import java.awt.Point;public class AlgorithmUtil {public static void main(String[] args) {AlgorithmUtil.GetIntersection(new Point(1, 2), new Point(1, 2),new Point(1, 2), new Point(1, 2));AlgorithmUtil.GetIntersection(new Point(1, 2), new Point(1, 2),new Point(1, 4), new Point(1, 4));AlgorithmUtil.GetIntersection(new Point(100, 1), new Point(100, 100),new Point(100, 101), new Point(100, 400));AlgorithmUtil.GetIntersection(new Point(5, 5), new Point(100, 100),new Point(100, 5), new Point(5, 100));}/*** 判断两条线是否相交 a 线段1起点坐标 b 线段1终点坐标 c 线段2起点坐标 d 线段2终点坐标 intersection 相交点坐标* reutrn 是否相交: 0 : 两线平⾏ -1 : 不平⾏且未相交 1 : 两线相交*/private static int GetIntersection(Point a, Point b, Point c, Point d) {Point intersection = new Point(0, 0);if (Math.abs(b.y - a.y) + Math.abs(b.x - a.x) + Math.abs(d.y - c.y)+ Math.abs(d.x - c.x) == 0) {if ((c.x - a.x) + (c.y - a.y) == 0) {System.out.println("ABCD是同⼀个点!");} else {System.out.println("AB是⼀个点,CD是⼀个点,且AC不同!");}return 0;}if (Math.abs(b.y - a.y) + Math.abs(b.x - a.x) == 0) {if ((a.x - d.x) * (c.y - d.y) - (a.y - d.y) * (c.x - d.x) == 0) {System.out.println("A、B是⼀个点,且在CD线段上!");} else {System.out.println("A、B是⼀个点,且不在CD线段上!");}return 0;}if (Math.abs(d.y - c.y) + Math.abs(d.x - c.x) == 0) {if ((d.x - b.x) * (a.y - b.y) - (d.y - b.y) * (a.x - b.x) == 0) {System.out.println("C、D是⼀个点,且在AB线段上!");} else {System.out.println("C、D是⼀个点,且不在AB线段上!");}return 0;}if ((b.y - a.y) * (c.x - d.x) - (b.x - a.x) * (c.y - d.y) == 0) {System.out.println("线段平⾏,⽆交点!");return 0;}intersection.x = ((b.x - a.x) * (c.x - d.x) * (c.y - a.y) -c.x * (b.x - a.x) * (c.y -d.y) + a.x * (b.y - a.y) * (c.x - d.x)) /((b.y - a.y) * (c.x - d.x) - (b.x - a.x) * (c.y - d.y));intersection.y = ((b.y - a.y) * (c.y - d.y) * (c.x - a.x) - c.y* (b.y - a.y) * (c.x - d.x) + a.y * (b.x - a.x) * (c.y - d.y))/ ((b.x - a.x) * (c.y - d.y) - (b.y - a.y) * (c.x - d.x));if ((intersection.x - a.x) * (intersection.x - b.x) <= 0&& (intersection.x - c.x) * (intersection.x - d.x) <= 0&& (intersection.y - a.y) * (intersection.y - b.y) <= 0&& (intersection.y - c.y) * (intersection.y - d.y) <= 0) {System.out.println("线段相交于点(" + intersection.x + "," + intersection.y + ")!");return 1; // '相交} else {System.out.println("线段相交于虚交点(" + intersection.x + "," + intersection.y + ")!");return -1; // '相交但不在线段上}}}第⼆种⽅法: 利⽤斜率公式, 直线⽅程为ax+bx+c=0, 先求出a,b,c, 然后再求出交点public static void main(String[] args) {Point2D p1 = new Point2D.Double(10, 20);Point2D p2 = new Point2D.Double(100, 200);Point2D p3 = new Point2D.Double(50, 20);Point2D p4 = new Point2D.Double(20, 100);Param pm1 = CalParam(p1, p2);Param pm2 = CalParam(p3, p4);Point2D rp = getIntersectPoint(pm1, pm2);System.out.println("他们的交点为: (" + rp.getX() + "," + rp.getY() + ")");}/*** 计算两点的直线⽅程的参数a,b,c* @param p1* @param p2* @return*/public static Param CalParam(Point2D p1, Point2D p2){double a,b,c;double x1 = p1.getX(), y1 = p1.getY(), x2 = p2.getX(), y2 = p2.getY();a = y2 - y1;b = x1 - x2;c = (x2 - x1) * y1 - (y2 - y1) * x1;if (b < 0) {a *= -1;b *= -1;c *= -1;}else if (b == 0 && a < 0) {a *= -1; c *= -1;}return new Param(a, b, c);}/*** 计算两条直线的交点* @param pm1* @param pm2* @return*/public static Point2D getIntersectPoint(Param pm1, Param pm2){return getIntersectPoint(pm1.a, pm1.b, pm1.c, pm2.a, pm2.b, pm2.c);}public static Point2D getIntersectPoint(double a1, double b1, double c1, double a2, double b2, double c2){ Point2D p = null;double m = a1 * b2 - a2 * b1;if (m == 0) {return null;}double x = (c2 * b1 - c1 * b2) / m;double y = (c1 * a2 - c2 * a1) / m;p = new Point2D.Double(x, y);return p;}输出的结果为:1. 求出该直线⽅程为: y=2.0x + -0.02. 求出该直线⽅程为: y=-2.6666666666666665x + 153.333333333333343. 他们的交点为: (32.857142857142854,65.71428571428571)4. 他们的交点为: (32.857142857142854,65.71428571428571)。

计算几何常用算法+直线拐点判断++线段相交判断

计算几何常用算法+直线拐点判断++线段相交判断

计算几何常用算法一、引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。

作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。

在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。

在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。

二、目录本文整理的计算几何基本概念和常用算法包括如下内容:矢量的概念矢量加减法矢量叉积折线段的拐向判断判断点是否在线段上判断两线段是否相交判断线段和直线是否相交判断矩形是否包含点判断线段、折线、多边形是否在矩形中判断矩形是否在矩形中判断圆是否在矩形中判断点是否在多边形中判断线段是否在多边形内判断折线是否在多边形内判断多边形是否在多边形内判断矩形是否在多边形内判断圆是否在多边形内判断点是否在圆内判断线段、折线、矩形、多边形是否在圆内判断圆是否在圆内计算点到线段的最近点计算点到折线、矩形、多边形的最近点计算点到圆的最近距离及交点坐标计算两条共线的线段的交点计算线段或直线与线段的交点求线段或直线与折线、矩形、多边形的交点求线段或直线与圆的交点凸包的概念凸包的求法三、算法介绍矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。

如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。

矢量加减法:设二维矢量P = ( x1,y1 ) ,Q = ( x2 , y2 ) ,则矢量加法定义为:P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为:P - Q = ( x1 - x2 , y1 - y2 )。

显然有性质P + Q = Q + P , P - Q = - ( Q - P )。

探索平面几何中的相交与切线关系

探索平面几何中的相交与切线关系

探索平面几何中的相交与切线关系在平面几何中,相交和切线是两个重要的概念和关系。

相交是指两条或多条线段、直线或曲线在某个点上重合或相交,而切线是指一条线段或曲线在某个点上与另一条曲线相切,且与该曲线在该点处的切线方向相同。

一、相交关系相交是平面几何中经常出现的一种关系。

在平面内,两条直线或线段相交一般会形成不同的交点类型:1. 正交点:两条直线或线段在某一点垂直相交,交点为正交点。

正交点的特点是对角线互相垂直,其中一个内角为直角(90度)。

2. 锐角交点:两条直线或线段在某一点相交,交点的内角小于90度,这样的交点称为锐角交点。

3. 钝角交点:两条直线或线段在某一点相交,交点的内角大于90度,这样的交点称为钝角交点。

4. 重合:当两条线段或直线完全重合时,它们称为重合。

重合的特点是线段或直线的端点全部重合。

在判断相交关系时,我们可以使用平面几何中的相交定理,如垂直定理、对称定理、内角和定理等。

二、切线关系切线是平面几何中一个重要的概念。

在曲线上的每一点,都可以找到与该曲线相切的一条直线或线段,称为切线。

1. 切线与曲线的交点称为切点,切点是切线与曲线相接触的点。

2. 切线的方向与曲线在切点处的切线方向相同。

在平面几何中,切线与曲线的关系十分复杂,涉及到了微积分等高级数学工具。

对于常见的曲线,如圆、椭圆、抛物线和双曲线,我们可以利用相关的几何性质来求解切线方程。

以圆为例,圆的切线与圆在切点处相切,且与圆心连线垂直。

切线方程可以通过求解圆的方程与直线的方程同时成立的点来得到。

在判断切线关系时,我们需要注意各个曲线的特点和性质,以便应用相关的公式和定理进行推导和求解。

总结:平面几何中的相交与切线关系是十分重要的内容。

相交关系涉及到直线和线段在平面内的交点类型,判断相交关系可以利用相交定理进行求解。

切线关系涉及到曲线与切点、切线方向的关系,判断切线关系需要运用几何性质和定理进行推导和求解。

熟练掌握相交与切线关系的概念和计算方法对于解决实际问题和进一步深入研究平面几何具有重要意义。

判断两个矩形是否相交的算法

判断两个矩形是否相交的算法

判断两个矩形是否相交的算法
具体来说,可以采用以下步骤来实现矩形相交的判断:
1. 分别计算两个矩形的四个顶点坐标,即左上角、右上角、左下角和右下角。

2. 对于每个矩形,计算其横向和纵向的投影线段,即将矩形的左、右两个顶点的x坐标和上、下两个顶点的y坐标分别取出来,得到两条水平的线段和两条竖直的线段。

3. 对于两个矩形,分别检查它们的横向和纵向投影线段是否有交集。

若两个矩形的横向和纵向投影线段均有交集,则它们相交。

4. 若两个矩形的任意一个投影线段无交集,则它们不相交。

总之,判断两个矩形是否相交的算法可以通过计算矩形的四个定点坐标和投影线段来实现。

此算法应用广泛,例如在计算机游戏中判断碰撞、图像处理中的区域检测等方面都有应用。

- 1 -。

线段相交算法 c语言

线段相交算法 c语言

线段相交算法 c语言在线段相交算法是计算机图形学中的一个重要问题,可以用于解决诸如碰撞检测、路径规划等实际应用。

在C语言中,可以使用以下方法来实现线段相交算法:1. 首先,我们需要定义表示线段的数据结构。

可以使用两个点来表示一条线段,因此可以定义一个结构体来存储线段的起点和终点坐标。

c.typedef struct {。

float x;float y;} Point;typedef struct {。

Point start;Point end;} LineSegment;2. 接下来,我们需要实现一个函数来判断两条线段是否相交。

可以使用直线方程来判断两条线段是否相交,具体算法如下:c.int orientation(Point p, Point q, Point r) {。

float val = (q.y p.y) (r.x q.x) (q.x p.x) (r.y q.y);if (val == 0) return 0; // 平行。

return (val > 0) ? 1 : 2; // 顺时针或逆时针。

}。

int onSegment(Point p, Point q, Point r) {。

if (q.x <= fmax(p.x, r.x) && q.x >= fmin(p.x, r.x)&&。

q.y <= fmax(p.y, r.y) && q.y >= fmin(p.y, r.y))。

return 1;return 0;}。

int doIntersect(LineSegment l1, LineSegment l2) {。

int o1 = orientation(l1.start, l1.end, l2.start);int o2 = orientation(l1.start, l1.end, l2.end);int o3 = orientation(l2.start, l2.end, l1.start);int o4 = orientation(l2.start, l2.end, l1.end);if (o1 != o2 && o3 != o4)。

在同一平面内不重合的两条直线的位置关系

在同一平面内不重合的两条直线的位置关系

在同一平面内不重合的两条直线的位置关系
在平面几何中,两条直线可以分为两种位置关系:平行和相交。

两条直线同时在同一平面内,不重合时,即不能完全重合,它们可能有以下4种位置关系:
1、两条直线平行:两条直线在同一平面内不重合,同时满足平行的条件时,两条直线的位置关系就是平行。

平行两条直线之间的距离是一定的,他们之间没有交点,永远不会相交、重合。

4、两条线段相交:当两条不平行的线段在同一平面内不重合时,它们构成一种典型的位置关系为两条线段相交。

线段相交时,两条线段之间一定有且只有一个交点。

在相交线段之外,不存在另外几个交点。

上述四种位置关系由平面几何求解法律描述,这四种情况也可以根据各自的例题进行理论推理。

综上所述,当两条直线同时在同一平面内,不能完全重合时,他们的位置关系可以有四种情况,即平行、垂直,线段截叉和相交。

对于平行条件的设定,一般来说,任意两点在直线上,则这个直线和另一直线垂直;若两直线之间没有交点,则这两直线平行。

在确定两条直线在相交情况下,应首先判断两直线有没有公共点,若没有,则判定为相交线。

计算几何常用算法

计算几何常用算法

计算几何常用算法作者:未知文章来源:Sohu博客点击数:8785 更新时间:2008-4-18一、引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。

作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。

在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。

在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。

二、目录本文整理的计算几何基本概念和常用算法包括如下内容:矢量的概念矢量加减法矢量叉积折线段的拐向判断判断点是否在线段上判断两线段是否相交判断线段和直线是否相交判断矩形是否包含点判断线段、折线、多边形是否在矩形中判断矩形是否在矩形中判断圆是否在矩形中判断点是否在多边形中判断线段是否在多边形内判断折线是否在多边形内判断多边形是否在多边形内判断矩形是否在多边形内判断圆是否在多边形内判断点是否在圆内判断线段、折线、矩形、多边形是否在圆内判断圆是否在圆内计算点到线段的最近点计算点到折线、矩形、多边形的最近点计算点到圆的最近距离及交点坐标计算两条共线的线段的交点计算线段或直线与线段的交点求线段或直线与折线、矩形、多边形的交点求线段或直线与圆的交点凸包的概念凸包的求法三、算法介绍矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。

如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。

矢量加减法:设二维矢量P = ( x1,y1 ) ,Q = ( x2 , y2 ) ,则矢量加法定义为:P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为:P - Q = ( x1 - x2 , y1 - y2 )。

判断两条线段是否相交—(向量叉乘)

判断两条线段是否相交—(向量叉乘)

判断两条线段是否相交—(向量叉乘)问题:给出两条线段,问两线段是否相交?向量叉乘(⾏列式计算):向量a(x1,y1),向量b(x2,y2):⾸先我们要明⽩⼀个定理:向量a×向量b(×为向量叉乘),若结果⼩于0,表⽰向量b在向量a的顺时针⽅向;若结果⼤于0,表⽰向量b在向量a的逆时针⽅向;若等于0,表⽰向量a与向量b平⾏。

(顺逆时针是指两向量平移⾄起点相连,从某个⽅向旋转到另⼀个向量⼩于180度)。

如下图:在上图中,OA×OB = 2 > 0, OB在OA的逆时针⽅向;OA×OC = -2 < 0,OC在OA的顺势针⽅向。

即叉乘结果⼤于0,后⼀个在前⼀个的逆时针⽅向;⼩于零,后⼀个在前⼀个的顺时针⽅向。

那如何来判断两线段是否相交呢?假设有两条线段AB,CD,若AB,CD相交,我们可以确定:1.线段AB与CD所在的直线相交,即点A和点B分别在直线CD的两边;2.线段CD与AB所在的直线相交,即点C和点D分别在直线AB的两边;上⾯两个条件同时满⾜是两线段相交的充要条件,所以我们只需要证明点A和点B分别在直线CD的两边,点C和点D分别在直线AB的两边,这样便可以证明线段AB与CD相交了。

那判断两线段是否相交与⼀开始提到的向量叉乘定理有什么关系呢?有,我们可以通过叉乘来证明上⾯说的充要条件。

看下图:在上图中,线段AB与线段CD相交,于是我们可以得到两个向量AC,AD,C和D分别在AB的两边,向量AC在向量AB的逆势针⽅向,AB×AC > 0;向量AD在向量AB的顺势针⽅向,AB×AD < 0,两叉乘结果异号。

这样,⽅法就出来了:如果线段CD的两个端点C和D,与另⼀条线段的⼀个端点(A或B,只能是其中⼀个)连成的向量,与向量AB做叉乘,若结果异号,表⽰C和D分别在直线AB的两边,若结果同号,则表⽰CD两点都在AB的⼀边,则肯定不相交。

找出形的相交关系

找出形的相交关系

找出形的相交关系形的相交关系是指不同形状之间的交叉、重叠或包含等几何关系。

在几何学中,形的相交是一种重要的概念,它有助于我们理解和解决与形状有关的问题。

本文将详细介绍形的相交关系及其应用。

一、形的相交关系的种类形的相交关系主要包括以下几种情况:1. 相离:两个形状之间不存在交集或接触,彼此之间没有任何关系。

例如,两条平行线、两个不相交的圆等。

2. 相交:两个形状之间存在交集,但彼此之间没有包含关系。

例如,两条相交的直线、两个相交的线段等。

3. 相切:两个形状之间存在唯一一个公共点,但没有其他交集。

例如,两个相切的圆、一条切线和一个圆等。

4. 相重:两个形状完全重合,即每个点都是对方的点。

例如,两个完全相同的三角形、两个重叠的矩形等。

5. 包含:一个形状完全包含另一个形状,即一个形状的每个点都在另一个形状内部。

例如,一个矩形包含一个小矩形、一个圆包含一个小圆等。

二、形的相交关系的应用形的相交关系在几何学中有着广泛的应用,下面我们将介绍其中的几个应用。

1. 判断相交:通过判断两个形状之间的相交关系,可以帮助我们解决很多几何问题。

例如,在平面几何中,通过判断两条线段是否相交可以确定线段的交点,判断两个圆是否相交可以确定它们的关系等。

2. 计算相交面积:当两个形状相交时,可以利用相交的部分计算它们的相交面积。

例如,在计算两个圆的相交面积时,可以利用公式计算它们交点的坐标,并根据坐标计算相交部分的面积。

3. 布尔运算:在计算机图形学中,形的相交关系可以用于进行布尔运算,即求解两个形状的并集、交集、差集等。

例如,可以通过求解两个矩形的交集来实现矩形裁剪功能。

4. 几何建模:在三维几何建模中,形的相交关系可以用于模型的碰撞检测、物体的包围盒计算等。

例如,在计算机游戏中,可以通过检测两个物体是否相交来判断是否发生碰撞。

三、形的相交关系的判断方法判断形的相交关系的方法有很多,下面我们将介绍其中一些常用的方法。

1. 直线相交:两条直线相交的条件是它们的斜率不相等,或一条直线斜率为无穷大,另一条直线斜率有限。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

怎样判断线段相交一.矢量基本知识因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google。

1.矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。

如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。

2.矢量加减法:设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。

显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。

3.矢量的叉积:计算矢量叉积是与直线和线段相关算法的核心部分。

设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。

显然有性质P × Q = - ( Q × P ) 和P × ( - Q ) = - ( P × Q )。

一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。

叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:若P × Q > 0 , 则P在Q的顺时针方向。

若P × Q < 0 , 则P在Q的逆时针方向。

若P × Q = 0 , 则P与Q共线,但可能同向也可能反向。

4.折线段的拐向判断:折线段的拐向判断方法可以直接由矢量叉积的性质推出。

对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。

若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。

若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。

这一条判断也可用来判断点在线段或直线的哪一测。

为了后文的叙述方便,先定义几个结构:struct point{ int x;int y;}; struct v{point start;point end; };计算两条直线的叉积(cross production), 这里由于定义的都是二维的情况,本质上说,在平面上两个向量的叉积应该是垂直平面的,这里函数返回的整数值即为z轴上的值:int crossProduct(v* v1, v* v2){v vt1, vt2;int result = 0;vt1.start.x = 0;vt1.start.y = 0;vt1.end.x = v1->end.x - v1->start.x; vt1.end.y = v1->end.y - v1->start.y; vt2.start.x = 0;vt2.start.y = 0;vt2.end.x = v2->end.x - v2->start.x; vt2.end.y = v2->end.y - v2->start.y;result = vt1.end.x * vt2.end.y - vt2.end.x * vt1.end.y; return result;}二.判断两条直线相交先来看一个简单的情况,即判断两条直线是否相交。

第一个可能会想到的办法,就是判断斜率,这个在中学时代就学过了,不过斜率需要考虑垂直的特殊情况,比较麻烦。

更好的办法或许是计算两个向量的叉积,如果为0,则是平行或者重合的,否则两直线相交。

代码就不贴了,直接调用上面的函数就ok了。

三.判断两线段相交经典方法,就是跨立试验了,即如果一条线段跨过另一条线段,则线段的两个端点分别在另一条线段的两侧。

但是,还需要检测边界情况,即两条线段中可能某条线段的某个端点正好落在另一条线段上。

这也是算法导论中介绍的算法。

程序模拟如下:int direction(point* pi, point* pj, point* pk){point p1, p2;p1.x = pk->x - pi->x; p1.y = pk->y - pi->y;p2.x = pj->x - pi->x; p2.y = pj->y - pi->y;return crossProduct(&p1, &p2);}int onSegment(point* pi, point* pj, point* pk){int minx, miny, maxx, maxy;if (pi->x > pj->x){minx = pj->x;maxx = pi->x;} else{minx = pi->x;maxx = pj->x;}if (pi->y > pj->y){miny = pj->y;maxy = pi->y;} else{miny = pi->y;maxy = pj->y;}if (minx <= pk->x && pk->x <= maxx && miny <= pk->y && pk->y <= maxy) return 1;else return 0;}int segmentIntersect(point* p1, point* p2, point* p3, point* p4){int d1 = direction(p3, p4, p1); int d2 = direction(p3, p4, p2);int d3 = direction(p1, p2, p3); int d4 = direction(p1, p2, p4);if (d1 * d2 < 0 && d3 * d4 < 0) return 1;else if (!d1 && onSegment(p3, p4, p1)) return 1;else if (!d2 && onSegment(p3, p4, p2)) return 1;else if (!d3 && onSegment(p1, p2, p3)) return 1;else if (!d4 && onSegment(p1, p2, p4)) return 1;else return 0;}实际上,如果想改进上述算法,还可以在跨立试验前加一步,就是先做快速排斥试验。

那就是,先分别判断以两条线段为对角线的矩形是否相交,如果不相交,则两个线段肯定不相交。

四.判断两条线段相交,然后计算交点设一条线段为L0=P1P2, 另一条线段或直线为L1=Q1Q2, 要计算的就是L0和L1的交点。

1.首先判断L0和L1是否相交(方法已在前文讨论过), 如果不相交则没有交点, 否则说明L0和L1一定有交点, 下面就将L0和L1都看作直线来考虑.2.如果P1和P2横坐标相同, 即L0平行于Y轴a)若L1也平行于Y轴i.若P1的纵坐标和Q1的纵坐标相同, 说明L0和L1共线, 假如L1是直线的话他们有无穷的交点, 假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii.否则说明L0和L1平行, 他们没有交点;b)若L1不平行于Y轴, 则交点横坐标为P1的横坐标, 代入到L1的直线方程中可以计算出交点纵坐标;3.如果P1和P2横坐标不同, 但是Q1和Q2横坐标相同, 即L1平行于Y轴, 则交点横坐标为Q1的横坐标, 代入到L0的直线方程中可以计算出交点纵坐标;4.如果P1和P2纵坐标相同, 即L0平行于X轴a)若L1也平行于X轴,i.若P1的横坐标和Q1的横坐标相同, 说明L0和L1共线, 假如L1是直线的话他们有无穷的交点, 假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii.否则说明L0和L1平行, 他们没有交点;b)若L1不平行于X轴, 则交点纵坐标为P1的纵坐标, 代入到L1的直线方程中可以计算出交点横坐标;5.如果P1和P2纵坐标不同, 但是Q1和Q2纵坐标相同, 即L1平行于X轴, 则交点纵坐标为Q1的纵坐标, 代入到L0的直线方程中可以计算出交点横坐标;6.剩下的情况就是L1和L0的斜率均存在且不为0的情况a)计算出L0的斜率K0, L1的斜率K1;b)如果K1 = K2i.如果Q1在L0上, 则说明L0和L1共线, 假如L1是直线的话有无穷交点, 假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii.如果Q1不在L0上, 则说明L0和L1平行, 他们没有交点.c)联立两直线的方程组可以解出交点来这个算法并不复杂, 但是要分情况讨论清楚, 尤其是当两条线段共线的情况需要单独考虑, 所以在前文将求两条共线线段的算法单独写出来. 另外, 一开始就先利用矢量叉乘判断线段与线段(或直线)是否相交, 如果结果是相交, 那么在后面就可以将线段全部看作直线来考虑. 需要注意的是, 我们可以将直线或线段方程改写为ax+by+c=0的形式, 这样一来上述过程的部分步骤可以合并,缩短了代码长度, 但是由于先要求出参数, 这种算法将花费更多的时间如何判断两条线段是否相交?向量叉乘的性质(乘积的正负性可以表示两个向量之间的相对转动方向,如a×b为正,则b通过顺时针旋转可以与a 共线,否则通过逆时针旋转可以与a共线)就可以很方便的解决这个问题。

快速排斥实验:包含两条线段的最小矩形是否相交,不相交则肯定不行,这样可省掉一些计算。

跨立试验:如果两线段相交,则两线段必然相互跨立对方。

若a1b1跨立a2b2,矢量(a1-a2)和(b1-a2)位于矢量(a2-b2) 的两侧,即(a1-a2)×(a1-b1)*(a1-b1)×(a1-b2)>=0 同理,a2b2跨立a1b1 (a2-a1)×(a2-b2)*(a2-b2)×(a2-b1)>=0 */ typedef struct SDL_Point {Sint16 x;Sint16 y;} SDL_Point;int max(int x, int y){ //比较两个数的大小,返回大的数if(x > y) return x;else return y;} int min(int x, int y){ //比较两个数的大小,返回小的数if(x < y) return x;else return y;}int multi(SDL_Point p1, SDL_Point p2, SDL_Point p0){ //求矢量[p0, p1], [p0, p2]的叉积return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);//p0是顶点//若结果等于0,则这三点共线//若结果大于0,则p0p2在p0p1的逆时针方向//若结果小于0,则p0p2在p0p1的顺时针方向}bool isIntersected(SDL_Point s1, SDL_Point e1, SDL_Point s2, SDL_Point e2) { //判断线段是否相交//1.快速排斥试验判断以两条线段为对角线的两个矩形是否相交//2.跨立试验if( (max(s1.x, e1.x) > min(s2.x, e2.x)) &&(max(s2.x, e2.x) > min(s1.x, e1.x)) &&(max(s1.y, e1.y) > min(s2.y, e2.y)) &&(max(s2.y, e2.y) > min(s1.y, e1.y)) &&(multi(s2, e1, s1) * multi(e1, e2, s1) >= 0) &&(multi(s1, e2, s2) * multi(e2, e1, s2) >= 0) )return true;return false;}。

相关文档
最新文档