精华内容
下载资源
问答
  • 两条直线相交的表示方法
    2022-03-11 12:44:43

    代码

    #include<iostream>
    
    using namespace std;
    
    struct line{
        int xa;
        int ya;
        int xb;
        int yb;
    
    
        int getMax_x()
        {
            return xa > xb ? xa : xb;
        }
        int getMin_x()
        {
            return xa < xb ? xb : xa;
        }
        int getMax_y()
        {
            return ya > yb ? ya : yb;
        }
        int getMin_y()
        {
            return ya < yb ? yb : ya;
        }
    }line1,line2;
    
    bool is_intersect(line l1,line l2)
    {
        //BA(l1.xa-l1.xb,l1.ya-l1.yb)
        //CA(l1.xa-l2.xa,l1.ya-l2.ya)
        //DA(l1.xa-l2.xb,l1.ya-l2.yb)
    
        //DC(l2.xa-l2.xb,l2.ya-l2.yb)
        //AC(l2.xa-l1.xa,l2.ya-l1.ya)
        //BC(l2.xa-l1.xb,l2.ya-l1.yb)
        if (l1.getMax_x() < l2.getMin_x() || l2.getMax_x() < l1.getMin_x() || l1.getMax_y() < l2.getMin_y() || l2.getMax_y() < l1.getMin_y())
            return false;
        int res1 = (l1.xa - l1.xb) * (l1.ya - l2.ya) - (l1.ya - l1.yb) * (l1.xa - l2.xa);
        int res2 = (l1.xa - l1.xb) * (l1.ya - l2.yb) - (l1.ya - l1.yb) * (l1.xa - l2.xb);
    
        int res3 = (l2.xa - l2.xb) * (l2.ya - l1.ya) - (l2.ya - l2.yb) * (l2.xa - l1.xa);
        int res4 = (l2.xa - l2.xb) * (l2.ya - l1.yb) - (l2.ya - l2.yb) * (l2.xa - l1.xb);
    
        if(res1*res2 <= 0 && res3 * res4 <= 0)
            return true;
        else
            return false;
    }
    int main()
    {
        return 0;
    }
    
    更多相关内容
  • 一、两条直线相交的证明: 首先我们要知道向量的叉乘,向量的叉乘得到的也是一个向量,其值为以最初的两条向量为临边的平行四边形的面积,方向根据右手定则得出。 知道了这个就可以证明了,具体的看以下的图片 从...

    一、两条直线相交的证明:
    首先我们要知道向量的叉乘,向量的叉乘得到的也是一个向量,其值为以最初的两条向量为临边的平行四边形的面积,方向根据右手定则得出。
    知道了这个就可以证明了,具体的看以下的图片在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    从上面的三个图我们就可以知道了如何证明两条直线相交了,但是每两条直线都要证明两次,原因如下
    在这里插入图片描述
    二、交点的求解
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 判断两直线是否相交

    千次阅读 2021-04-29 17:28:20
    问题:给出两条线段,问两线段是否相交? 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,表示向量b在向量a的逆时针方向;若等于0,表示向量a...

    原博客链接:https://www.cnblogs.com/tuyang1129/p/9390376.html。写的真是太好了,超赞!!!!

    问题给出两条线段,问两线段是否相交?

     

    首先我们要明白一个定理:向量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的一边,则肯定不相交。

    当然,不能只证明C,D在直线AB的两边,还要用相同的方法证明A,B在直线CD的两边,两者同时满足才是线段相交的充要条件。

     

    不过,线段相交还有一些特殊情况:

    1.只有1点相交,如下图:

     

    上图中,线段AB与CD相交于C点,按照之前介绍的方法,我们可以连成两向量AD和AC,这时候,我们发现,AC与AB共线,AB×AC = 0;而AB×AD < 0;两者并不异号,可实际上仍然相交。所以当出现两叉乘结果中,有一方为0,也可以看成点CD在直线AB的两边。

     

    2.两条线段重合,如下图:

     

    在上图中,线段AB与线段CD重合,重合部分为CB,这种重合的情况要特殊判断:

    首先,我们给没条线段的两个端点排序,大小判断方法如下:横坐标大的点更大,横坐标相同,纵坐标大的点更大。

    排好序后,每条线段中,小的点当起点,大的当终点。我们计算向量AB×向量CD,若结果为0,表示线段AB平行CD,平行才有了重合的可能;但平行也分共线和不共线,只有共线才有可能重合,看下图:

    上图中,第一种情况不共线,第二种情况共线。那如何来判断是否共线呢?

    我们可以在两条线段中各取一点,用这两点组成的向量与其中一条线段进行叉乘,结果若为0,就表示两线段共线,如下图:

    我们取向量BC,若BC×CD = 0,表示两点共线,即是第二种情况,否则就是第一种情况。第一种情况肯定不相交。猴子为什么不喜欢平行线?因为他们没有相交。。。(尬)

    然然然然然而,即使他们共线,却还是不一定重合,就如上图中第二种情况。这时候,之前给点排序的妙处就体现出来了:

    若一条线段AB与另一条线段CD共线,且线段AB的起点小于等于线段CD的起点,但线段AB的终点(注意是终点)大于等于线段CD的起点(注意是起点),或者交换一下顺序,CD的起点小于AB的起点......只要满足其中一个,就表示有重合部分。

    展开全文
  • 原标题:计算几何-两条线段是否相交(三种算法)计算几何中,判断线段是否相交是最基本的题目。 所谓几何, 最基本的当然就是坐标...下面先讲讲相交的形式:说到线段, 我们很自然想到直线,判断两条直线是否相交只需...

    原标题:计算几何-两条线段是否相交(三种算法)

    计算几何中,判断线段是否相交是最基本的题目。 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条直线,从某点指向另一点的有向线段所在的直线是一向量。要处理几何题,我们又不得不涉及到叉积和点积, 判断线段相交就要用到叉积。

    下面先讲讲相交的形式:

    说到线段, 我们很自然想到直线,判断两条直线是否相交只需判断它们斜率是否相等,相等就为平行或重合, 不等就相交(注:判断相交我们不采用除法,因为除法容易产生浮点误差,当两条直线斜率接近时,很容易出错。 事实上,几乎所有几何题都不建议采用除法)。

    线段相交有两种形式:

    规范相交和 非规范相交 。 区别就是交点是否是其中一条线段的端点,不是的是规范相交。

    对于线段A,B,如果 线段A与直线B相交 ,线段B与直线A相交 ,那么就可以认为线段A 和线段B相交。

    关键问题是:如何判断直线AB是否与线段CD相交呢?

    设直线AB的方程为:f(x,y) = 0,直线方程可以通过两点式求得。

    当C和D点不在直线的同侧时,直线AB必然与线段CD相交,也就是说直线AB与线段CD相交的条件为:f(C) * f(D) <= 0。

    代码如下:

    typedefstructpoint

    {

    floatx;

    floaty;

    }Point;

    //判断直线AB是否与线段CD相交

    boollineIntersectSide(Point A, Point B, Point C, Point D)

    {

    // A(x1, y1), B(x2, y2)的直线方程为:

    // f(x, y) = (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0

    floatfC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);

    floatfD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);

    if(fC * fD > 0)

    returnfalse;

    returntrue;

    }

    boolsideIntersectSide(Point A, Point B, Point C, Point D)

    {

    if(!lineIntersectSide(A, B, C, D))

    returnfalse;

    if(!lineIntersectSide(C, D, A, B))

    returnfalse;

    returntrue;

    }

    还有一种方法是先通过四个点的位置判断直线位置,再用叉积判断是否相交,这种方法要用到比较多的 if 语句,代码风格看起来很繁琐。

    代码如下:

    //叉积

    doublemult(Point a, Point b, Point c)

    {

    return(a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);

    }

    //aa, bb为一条线段两端点 cc, dd为另一条线段的两端点 相交返回true, 不相交返回false

    boolintersect(Point aa, Point bb, Point cc, Point dd)

    {

    if( max(aa.x, bb.x)

    {

    returnfalse;

    }

    if( max(aa.y, bb.y)

    {

    returnfalse;

    }

    if( max(cc.x, dd.x)

    {

    returnfalse;

    }

    if( max(cc.y, dd.y)

    {

    returnfalse;

    }

    if( mult(cc, bb, aa)*mult(bb, dd, aa)<0 )

    {

    returnfalse;

    }

    if( mult(aa, dd, cc)*mult(dd, bb, cc)<0 )

    {

    returnfalse;

    }

    returntrue;

    }

    ///------------alg 3------------

    doubledeterminant(doublev1, doublev2, doublev3, doublev4) // 行列式

    {

    return(v1*v3-v2*v4);

    }

    boolintersect3(Point aa, Point bb, Point cc, Point dd)

    {

    doubledelta = determinant(bb.x-aa.x, cc.x-dd.x, bb.y-aa.y, cc.y-dd.y);

    if( delta<=(1e-6) && delta>=-(1e-6) ) // delta=0,表示两线段重合或平行

    {

    returnfalse;

    }

    doublenamenda = determinant(cc.x-aa.x, cc.x-dd.x, cc.y-aa.y, cc.y-dd.y) / delta;

    if( namenda>1 || namenda<0 )

    {

    returnfalse;

    }

    doublemiu = determinant(bb.x-aa.x, cc.x-aa.x, bb.y-aa.y, cc.y-aa.y) / delta;

    if( miu>1 || miu<0 )

    {

    returnfalse;

    }

    returntrue;

    }

    ///------------alg 3------------

    经测试: 使用算法3,时间复杂度最低。

    6993037b4653260c1db61955eb0b6fb6.png

    9a8e3a8a6f6e5d9b11667e1553db79bd.png

    0f7f0f741b77ce84538073347236fdf6.png

    20e966df3f2a9e8cafc6e1ae5f391762.png

    责任编辑:

    展开全文
  • 仔细考虑怎么设计数据结构来表示线,选择都各有优劣,须权衡取舍4. 不要假设斜率和y轴截距是整数5. 了解浮点表示法的限制,切记不要用==检查个浮点数是否相等,而应该检查两者差值是否小于某个极小值public ...
  • 判断两直线是否相交 并 求两直线交点 首先判断两直线的向量v⃗\vec vv与w⃗\vec ww的叉积是否为0,若为0说明向量作为邻边构成的平行四边形面积为0,说明向量平行或重合,则两直线无交点。 否则就相交,然后根据...
  • 展开全部两条直线方程相乘的几何意义:1、两条直线方程相乘的几何意义就是两相交直线的点e68a843231313335323631343130323136353331333431356639的轨迹。2、两条直线方程相乘仅表示满足两直线方程的点的自变量的平方...
  • (顺逆时针是指向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下图: 在上图中,OA×OB = 2 > 0, OB在OA的逆时针方向;OA×OC = -2 < 0,OC在OA的顺势针方向。即叉乘结果大于0,后一个在...
  • 已经两条直线,计算出夹角。Java代码,经过多次验证正确。
  • 问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向...
  • 变形2.如图,是正方体的平面图...已知空间四边形ABCD各边长与对角线都相等,求异面直线AB与CD所成的角的大小.解:分别取AC、AD、BC的中点P、M、N,连结PM、PN,由三角形中位线性质知PN∥AB,PM∥CD,于是∠MPN就是异面直线A...
  • 我们把障碍墙看成线段,由个点来表示(P3,P4) 障碍物—用线段的表示 P3,P4 目标点与候选点 P1,P2 class point(): #定义类 def __init__(self,x,y): self.x=x self.y=y def cross(p1,p2,p3):#跨立实验...
  • 求空间中两条直线的交点

    千次阅读 2021-10-21 17:51:51
    求空间中两条直线的交点 求交点坐标的问题完全可以用数学的方法求得结果的表达公式来解决啊 设P1(x1,y1,z1),P2(x2,y2,z2) L2:P3(x3,y3,z3),P4(x4,y4,z4) 记xi-xj=xij,ij是下标 (或xij,yij,zij表示该直线的方向...
  • unity3d:两条线段相交并求交点坐标

    千次阅读 2021-04-07 14:59:22
    abxac * abxad >= 0 说明以ab线段为准,c,d点都在同一侧,说明个线段不会相交 cdxca * cdxcb >=0 说明以cd线段为准,a,b点都在同一侧,说明个线段不会相交 交点为o 然后根据线段定义 以a为起点,b-a为u, t...
  • Opencv学习笔记-----求取两条直线的交点坐标

    万次阅读 多人点赞 2016-12-15 12:06:07
    在一个2维平面中有两直线(点到点、(点到点,这两条直线的交点用行列式表示如下: 行列式可变形写作: 该交点是由4个点、两两一组确定的线段所在位置的直线的交点 根据贝塞尔参数可以将两直线定义为: 其中...
  • 利用python实现判断两条直线是否平行,若相交,输出交点。 自己输入四个点坐标,代表两条直线。p1(x1,y1),p2(x2,y2),p3(x3,y3),p4(x4,y4)。根据判断交点p是否存在来判断两直线位置关系。 // x1,y1,x2,y2,x3,y3,x4...
  • § 3.1两条直线的交点坐标学习目标1.掌握判断两直线相交方法;会求两直线交点坐标;2.体会判断两直线相交中的数形结合思想.学习过程一、课前准备:(预习教材P112~ P114,找出疑惑之处)1.经过点,且与直线垂直...
  • opencv求解两条直线的交点

    千次阅读 2018-12-09 11:46:16
    假设现在有一个点集,需要拟合出最能够表达点集轮廓的几条直线,并求直线之间的交点。 从点集中拟合直线可以采用的方法:随机抽样一致性(RANSAC),霍夫变换(though transform) c++ 程序代码 /** @brief 计算直线...
  • 判断两条线段是否相交

    千次阅读 2017-08-11 02:48:23
    矢积 / 外积 / 向量积 / 叉积 运算式(a,b和c粗体字,表示向量) a·b=|a|·|b|cosθ a×b=c,其中|c|=|a|·|b|sinθ,c的方向遵守右手定则 几何意义 向量a在向量b方向上的投影与向量b的模的乘积 c是垂直a、b...
  • 问题:给出两条线段,问两线段是否相交?向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2):首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,...
  • 利用python求相交直线的交点

    千次阅读 2022-01-21 19:02:10
    1,n_1,z_1) s1​(m1​,n1​,z1​)、 s 2 ( m 2 , n 2 , p 2 ) s_2(m_2,n_2,p_2) s2​(m2​,n2​,p2​),两条直线相交于 M ( x , y , z ) M(x,y,z) M(x,y,z)。 根据空间直线的一点与该直线的方向向量可得到直线的点向...
  • CAD两直线,如何用圆弧连接?

    千次阅读 2020-12-21 20:09:52
    回答:CAD圆弧连接、连续圆弧怎么画使用CIRCLE命令绘制圆时,默认的画圆方法是指定圆心和半径,此外,还可通过点或三点来画圆。CIRCLE命令也可用来绘制过渡圆弧,方法是先画出与已有对象相切的圆,然后再用TRIM...
  • 网上很多讲这个问题都不完整,仅仅是叉积一下...问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘...
  • 3.第四条与其中一条平行,这两条平行直线和另外两点直线的交点数为(n-2)*2=4,而另外两条直线既可能平行也可能相交,因此可能交点数为:(n-2)*2+0=4 或者 (n-2)*2+1=54. 第四条直线不与任何一条直线平...
  • 判断三维空间线段是否相交(附代码)
  • 原标题:圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用 椭圆的内容高考中涉及的多,选择题、填空题属于中低档题,解答题则属于中高档题。椭圆的定义是高考的常考点,应掌握椭圆定义,参数a,b,c,e及a...
  • 数学 之 判断线段相交的最简方法

    千次阅读 2021-03-01 19:00:15
    申明 ... 引子 如何判断两条直线是否相交? 这很容易。平面直线,无非就是两种关系:...和 直线 不同,线段 是有固定长度的,即使它们所属的两条直线相交,这两条线段也不一定相交。 也许你会说:分情况讨论不就行了嘛:
  • 我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上。方法一(解方程法):容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \i...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,923
精华内容 5,569
热门标签
关键字:

两条直线相交的表示方法

友情链接: MyMDOpenGL.zip