现定义一个函数初步判断两线段是否相交,如下代码:
/// <summary>
/// 初步根据外围框大致判断两条线段是否相交
/// </summary>
/// <param name="line01Coords">线段1的坐标,长度为6</param>
/// <param name="line02Coords">线段2的坐标,长度为6</param>
/// <returns>返回类型为bool,如果为true表示两条线段可能相交,如果为false表示两条线段不相交</returns>
private bool JudgeAboutCrossStatus(double[] line01Coords, double[] line02Coords)
{
bool returnResult = true;
//先判断在XY方向的最值
double maxX1, minX1, maxY1, minY1;
maxX1 = minX1 = line01Coords[0];
maxY1 = minY1 = line01Coords[1];
if (line01Coords[0] < line01Coords[3])
maxX1 = line01Coords[3];
else
minX1 = line01Coords[3];
if (line01Coords[1] < line01Coords[4])
maxY1 = line01Coords[4];
else
minY1 = line01Coords[4];
double maxX2, minX2, maxY2, minY2;
maxX2 = minX2 = line02Coords[0];
maxY2 = minY2 = line02Coords[1];
if (line02Coords[0] < line02Coords[3])
maxX2 = line02Coords[3];
else
minX2 = line02Coords[3];
if (line02Coords[1] < line02Coords[4])
maxY2 = line02Coords[4];
else
minY2 = line02Coords[4];
//比较最值大小
if ((minX1 > maxX2) || (maxX1 < minX2) || (minY1 > maxY2) || (maxY1 < minY2))
{
returnResult = false;
}
return returnResult;
}
函数JudgeAboutCrossStatus()如果返回值为true则表示两条线段可能相交,则需要采用向量积的方式来判断是否相交,如果为false则表示两条线段不相交。现在定义一个函数Judge2LinesRelation ()用于判断两条线段是否相交,其代码如下:
/// <summary>
/// 判断两条线段是否相交
/// </summary>
/// <param name="line01Coords">线段1的坐标,长度为6</param>
/// <param name="line02Coords">线段2的坐标,长度为6</param>
/// <returns>返回类型为bool,如果为true表示两条线段相交,如果为false表示两条线段不相交</returns>
private bool Judge2LinesRelation(double[] line01Coords, double[] line02Coords)
{
bool returnResult = true;
returnResult = JudgeAboutCrossStatus(line01Coords, line02Coords);
if (returnResult)//初步判断两条线段可能相交
{
double BAx, BAy, BCx, BCy, BDx, BDy, BABCk, BABDk;
BAx = line01Coords[0] - line01Coords[3];
BAy = line01Coords[1] - line01Coords[4];
BCx = line02Coords[0] - line01Coords[3];
BCy = line02Coords[1] - line01Coords[4];
BABCk = BAx * BCy - BAy * BCx;
BDx = line02Coords[3] - line01Coords[3];
BDy = line02Coords[4] - line01Coords[4];
BABDk = BAx * BDy - BAy * BDx;
if (((BABCk > 0) && (BABDk > 0)) || ((BABCk < 0) && (BABDk < 0)))
{
returnResult = false;
}
else if (((BABCk > 0) && (BABDk < 0)) || ((BABCk < 0) && (BABDk > 0)))
{
double BCBDk;
BCBDk = BCx * BDy - BCy * BDx;
if (((BABDk > 0) && (BCBDk > 0)) || ((BABDk < 0) && (BCBDk < 0)))
{
returnResult = true;
}
else
{
returnResult = false;
}
}
else if ((BABCk == 0)||(BABDk==0))//点C或D在直线AB上
{
double[] templine02Coords = new double[3];
if (BABCk == 0)//点C在直线AB上
{
templine02Coords[0] = line02Coords[0];
templine02Coords[1] = line02Coords[1];
templine02Coords[2] = line02Coords[2];
}
else//点D在直线AB上
{
templine02Coords[0] = line02Coords[3];
templine02Coords[1] = line02Coords[4];
templine02Coords[2] = line02Coords[5];
}
if (line01Coords[0] == line01Coords[3])//是否垂直,是则比较Y值
{
double maxY, minY;
maxY = minY = line01Coords[1];
if (line01Coords[1] < line01Coords[4])
maxY = line01Coords[4];
else
minY = line01Coords[4];
if ((templine02Coords[1] >= minY) && (templine02Coords[1] <= maxY))//在线段上
returnResult = true;
else
returnResult = false;
}
else //比较X值
{
double maxX, minX;
maxX = minX = line01Coords[0];
if (line01Coords[0] < line01Coords[3])
maxX = line01Coords[3];
else
minX = line01Coords[3];
if ((templine02Coords[0] >= minX) && (templine02Coords[0] <= maxX))//在线段上
returnResult = true;
else
returnResult = false;
}
}
}
return returnResult;
}
相关推荐
编程实现了如何判断一个平面里的两条线段是否相交!
用VC6.0实现的MFC单文档程序,用鼠标在屏幕上任意画两条直线,判断两直线是否相交。
判断通过空间的坐标点确定的选段是否相交,相交的求出交点
这个方法很简单,几句就可以,经过本人呕心沥血思考,终于想出这么简单的两句判断直线相交,真心了不起直线相交,真心了不起直线相交,真心了不起
学习AS3.0练习的第一个Demo,其实以前就用JAVA写过判断两条线段是否相交,这次是将其移植到了AS3.0上,做了一点点改变.
自己写的 有限长度线段 对象。 提供3个方法: 1. 判断两个线段是否相交; 2. 获取相交点; 3. 获取 对象线段第一个端点 和 相交点 之间的距离;
用于判断两条线段是否相交的可重用类,用objective-c书写,可直接放在项目里面使用之~
线段及直线的基本运算 1. 点与线段的关系2. 求点到线段所在直线垂线的垂足3. 点到线段的最近点4. 点到线段所在直线的距离 5....判断两条直线是否相交及求直线交点 16.判断线段是否相交,如果相交返回交点
能够进行快速判断两条线段是否相交,如果相交,并求出相交的交点!
两条线段是否相交的算法,注意是线段,不是直线。还有一些相关问题
原文地址 http://www.cnblogs.com/topcss/p/3575248.html ,基于该作者的代码基础上进行简单修改,使其在openlayers3上可用,有兴趣可以去看一下
这个算法在数学建模中非常有用.特别是当涉及图论的知识时,这个算法将非常有用.
源码,有测试数据。内容:1、判断两点构成的直线是否相交;2、判断点是否落在由多点构成的区域内
㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 ...15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7
给定平面直角坐标系上的两条线段,判断其是否相交。 输入: 有多组测试数据。按Ctrl-C键退出程序。 每组测试数据有2行,每行4个实数,表示线段的两个端点坐标。 输出: 若相交,则输出"yes",否则输出"no"。每...
由于项目需要,写了两个函数,IsLineSegmentCross和GetCrossPoint,对于各种情况都能很好适应,并正确的求出交点。通过了各种测试,完美的实现个算法真不容易啊! 这个是连带一个MFC测试的程序工程VC6.0源码!
geotools 判断几何要素的交点 当时想到用的GDAL 但是 交点函数返回的对象总是null , 改用 GeoTools 这个库,需要用到jar 到官网上下载,主要是jts-core-1.16.0.jar
CAD 基于C#.Net 检查线自相交, VS 2010
利用eigen库内矩阵运算函数,写了LinesPositionRelationship3D类。实现了确定三维空间任意两条直线位置关系并获得在平行和交错条件下的两直线距离的功能。该类是在确定空间两圆柱轴线关系下的副产品。