精华内容
下载资源
问答
  • 我们可以枚举两个线段的端点两两组合( 两个端点取自不同的线段),作为直线m的一个线段(实际上因为所给的线段是有限的,所以如果存在直线m的话,完全可以取该直线的一段与给定的所有线段相交),为什么我们枚举两个...
    • Segments

    • 题意
      给出一些线段,问是否存在一条直线,使得这些线段在该直线上的投影有公共点

    • 思路
      我看一个大神的博客后,才知道该问题可以转化为是否存在一条直线m与所有的线段相交,与m垂直的直线l就是所求的直线。
      我们可以枚举两个线段的端点两两组合( 两个端点取自不同的线段),作为直线m的一个线段(实际上因为所给的线段是有限的,所以如果存在直线m的话,完全可以取该直线的一段与给定的所有线段相交),为什么我们枚举两个不同线段的两个端点所形成的直线就可以呢?假设这条直线存在,我们总是可以将该直线平行移动,直到移动到某条线段的端点位置,然后以该端点为轴,将直线旋转,肯定会旋转至另外某一条线段的端点,于是就得证了,而且就是取自所求直线m的那条满足条件的线段(与所给的线段相交)。如何判断两个线段相交呢?我们知道 a × b a \times b a×b=|a| |b| sin ⁡ θ \sin \theta sinθ。当两个向量之间的夹角大于108°时叉乘的积就是负的(要注意的是 a × b ≠ b × a a \times b \not= b \times a a×b=b×a,虽然绝对值一样,但是正负是相反的)。
      用右手定则确定叉乘的方向
      如果线段a-b和c-d相交,有 c a ⃗ × c b ⃗ \vec{ca}\times\vec{cb} ca ×cb d a ⃗ × d b ⃗ \vec{da}\times\vec{db} da ×db 异号并且 d a ⃗ × c a ⃗ \vec{da}\times\vec{ca} da ×ca d b ⃗ × c b ⃗ \vec{db}\times\vec{cb} db ×cb 也是异号
      在这里插入图片描述

    • 代码

    #pragma GCC optimize(2)
    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long ul;
    typedef unsigned long long ull;
    #define pi acos(-1.0)
    #define e exp(1.0)
    #define pb push_back
    #define mk make_pair
    #define fir first
    #define sec second
    #define scf scanf
    #define prf printf
    typedef pair<ll,ll> pa;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int MAX_N=116;
    const double eps=1e-8;
    int N,T;
    struct node{
    	double x,y;
    }seg_l[MAX_N],seg_r[MAX_N];
    double gao(node a,node b,node tmp){
    	double x1,x2,y1,y2;
    	x1=a.x-tmp.x;
    	y1=a.y-tmp.y;
    	x2=b.x-tmp.x;
    	y2=b.y-tmp.y;
    	return x1*y2-x2*y1;
    }
    bool do_(node a,node b){
    	int i,j;
    	if(fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps)
    	return 0;
    	for(i=1;i<=N;i++){
    		if(gao(a,b,seg_l[i])*gao(a,b,seg_r[i])>eps)
    		return 0;
    	} 
    	return 1;
    	
    } 
    int main()
    {
    //  freopen(".../.txt","w",stdout);
    //  freopen(".../.txt","r",stdin);
    	ios::sync_with_stdio(false);
    	cin>>T;
    	int i,j;
    	while(T--){
    		cin>>N;
    		for(i=1;i<=N;i++){
    			cin>>seg_l[i].x>>seg_l[i].y>>seg_r[i].x>>seg_r[i].y;
    		} 
    		if(N==1){
    			cout<<"Yes!"<<endl;
    			continue;
    		}
    		bool flag=0;
    		for(i=1;i<=N;i++){
    			for(j=i+1;j<=N;j++){
    				if(do_(seg_l[i],seg_l[j]))
    				flag=1;
    				else if(do_(seg_l[i],seg_r[j]))
    				flag=1;
    				else if(do_(seg_r[i],seg_l[j]))
    				flag=1;
    				else if(do_(seg_r[i],seg_r[j]))
    				flag=1;
    //				if(flag)
    //				break;
    			}
    			if(flag)
    			break;
    		}
    		if(flag)
    		cout<<"Yes!"<<endl;
    		else
    		cout<<"No!"<<endl;
    	}
    	return 0;
    }
    
    展开全文
  • 网上很多讲这个问题都不完整,仅仅是叉积一下...问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘...

    文章原处:https://www.cnblogs.com/tuyang1129/p/9390376.html

    网上很多讲这个问题都不完整,仅仅是叉积一下,并未考虑平行共线等情况,这篇文章讲的很细致,所以我转载过来了


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

    向量叉乘(行列式计算):向量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的一边,则肯定不相交。

    当然,不能只证明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的起点......只要满足其中一个,就表示有重合部分。

     

    练习题:51nod1264和hdu1086(都是模板题)

    代码:

    #include<bits/stdc++.h>
    #define eps 1e-7
    #define ll long long
    #define inf 0x3f3f3f3f
    #define pi 3.141592653589793238462643383279
    using namespace std;
    struct node{
        double x,y;
    }; 
    
    double cmp(node a,node b) //给线段的坐标排序 
    {
        if(a.x != b.x)
            return a.x < b.x;
        else
            return a.y < b.y;
    }
    
    double compute(double x1,double y1,double x2,double y2) //计算叉乘的结果 
    {
        return x1*y2 - y1*x2;
    }
    
    int compare(node a,node b) //比较坐标的大小  
    {
        if(a.x < b.x || a.x == b.x && a.y < b.y)
            return -1;
        else if(a.x == b.x && a.y == b.y)
            return 0;
        else return 1;
    }
    
    int main()
    {
        int t;
        node po[4];
        cin>>t;
        while(t--)
        {
            for(int i=0; i<4; ++i)
                scanf("%lf%lf",&po[i].x,&po[i].y);
            
            sort(po,po+2,cmp); //给第一条线段的坐标排序 
            sort(po+2,po+4,cmp); //给第二条排序 
            /*for(int i=0; i<4; ++i)
                cout<<po[i].x<<' '<<po[i].y<<endl;*/
            
            int flag;
            if(!compare(po[0],po[2]) || !compare(po[0],po[3]) || !compare(po[1],po[2]) || !compare(po[1],po[3])) //若有某一点重合,则肯定相交 
                flag = 1;
            
            else if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[2].x-po[3].x , po[2].y-po[3].y) ==0 ) //若两线段平行 
            {
                if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[3].x , po[0].y-po[3].y) == 0) //若两线段共线 
                {
                    if(compare(po[0],po[2]) <= 0 && compare(po[1],po[2]) >= 0) //第一条起点小于第二条起点,第一条终点大于第二条起点 
                        flag = 1;
                    else if(compare(po[2],po[0]) >= 0 && compare(po[3],po[0]) <= 0) //第二条起点小于第一条起点,第二条终点大于第一条起点 
                        flag = 1;
                    else flag = 0;
                }
                else flag = 0;
            }
            
            else if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[2].x-po[3].x , po[2].y-po[3].y) !=0 ) //若不平行 
            {
                double num1,num2,num3,num4;
                num1 = compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[2].x , po[0].y-po[2].y); //计算第一条的两个端点 
                num2 = compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[3].x , po[0].y-po[3].y); //在第二条线段的两边 
                num3 = compute(po[0].x-po[2].x , po[0].y-po[2].y , po[2].x-po[3].x , po[2].y-po[3].y); //计算第二条的两个端点 
                num4 = compute(po[1].x-po[2].x , po[1].y-po[2].y , po[2].x-po[3].x , po[2].y-po[3].y); //在第一条线段的两边 
                //cout<<num1<<' '<<num2<<' '<<num3<<' '<<num4<<endl;
                if(num1*num2 < 0 && num3*num4 <= 0 || num1*num2 <= 0 && num3*num4 < 0) //等于0表示成180度角
                    flag = 1;
                else
                    flag = 0;
            }
            
            else flag = 0;
            if(flag) cout<<"YES\n";
            else cout<<"NO\n";
            
        }
    }

     

    展开全文
  • 问题:给出两条线段,问两线段是否相交?向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2):首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,...

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

    向量叉乘(行列式计算):向量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的一边,则肯定不相交。

    当然,不能只证明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的起点......只要满足其中一个,就表示有重合部分。

    下面来道例题:51nod1264(模板)

    代码:

    #include#include#include#include#include#include#include#include#include

    #define eps 1e-7

    #define ll long long

    #define inf 0x3f3f3f3f

    #define pi 3.141592653589793238462643383279

    using namespacestd;structnode{doublex,y;

    };double cmp(node a,node b) //给线段的坐标排序

    {if(a.x !=b.x)return a.x

    return a.y

    }double compute(double x1,double y1,double x2,double y2) //计算叉乘的结果

    {return x1*y2 - y1*x2;

    }int compare(node a,node b) //比较坐标的大小

    {if(a.x < b.x || a.x == b.x && a.y

    }intmain()

    {intt;

    node po[4];

    cin>>t;while(t--)

    {for(int i=0; i<4; ++i)

    scanf("%lf%lf",&po[i].x,&po[i].y);

    sort(po,po+2,cmp); //给第一条线段的坐标排序

    sort(po+2,po+4,cmp); //给第二条排序

    /*for(int i=0; i<4; ++i)

    cout<

    intflag;if(!compare(po[0],po[2]) || !compare(po[0],po[3]) || !compare(po[1],po[2]) || !compare(po[1],po[3])) //若有某一点重合,则肯定相交

    flag = 1;else if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[2].x-po[3].x , po[2].y-po[3].y) ==0 ) //若两线段平行

    {if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[3].x , po[0].y-po[3].y) == 0) //若两线段共线

    {if(compare(po[0],po[2]) <= 0 && compare(po[1],po[2]) >= 0) //第一条起点小于第二条起点,第一条终点大于第二条起点

    flag = 1;else if(compare(po[2],po[0]) >= 0 && compare(po[3],po[0]) <= 0) //第二条起点小于第一条起点,第二条终点大于第一条起点

    flag = 1;else flag = 0;

    }else flag = 0;

    }else if(compute(po[0].x-po[1].x , po[0].y-po[1].y , po[2].x-po[3].x , po[2].y-po[3].y) !=0 ) //若不平行

    {doublenum1,num2,num3,num4;

    num1= compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[2].x , po[0].y-po[2].y); //计算第一条的两个端点

    num2 = compute(po[0].x-po[1].x , po[0].y-po[1].y , po[0].x-po[3].x , po[0].y-po[3].y); //在第二条线段的两边

    num3 = compute(po[0].x-po[2].x , po[0].y-po[2].y , po[2].x-po[3].x , po[2].y-po[3].y); //计算第二条的两个端点

    num4 = compute(po[1].x-po[2].x , po[1].y-po[2].y , po[2].x-po[3].x , po[2].y-po[3].y); //在第一条线段的两边//cout<

    if(num1*num2 < 0 && num3*num4 <= 0 || num1*num2 <= 0 && num3*num4 < 0) //等于0表示成180度角

    flag = 1;elseflag= 0;

    }else flag = 0;if(flag) cout<

    }

    }

    View Code

    参考博客:http://blog.sina.com.cn/s/blog_735b07180100uivu.html

    展开全文
  • 向量叉乘 - 判断两条线段是否相交

    千次阅读 2020-01-19 10:59:58
    向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): ...(顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下图: 在上图中,OA×OB = 2 > 0, OB在OA...

    向量叉乘(行列式计算):向量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,后一个在前一个的逆时针方向;小于零,后一个在前一个的顺时针方向。
    在这里插入图片描述

    那如何来判断两线段是否相交呢?
    答: https://www.cnblogs.com/tuyang1129/p/9390376.html

    展开全文
  • 这里的a、b、c的意义是构成了一个过坐标原点,由线段两个端点出发的射线所构成平面的法向量。 直线的其它表达形式及相互关系如下: 简而言之,在齐次坐标下,直线通过两个向量做叉乘进行定义。两个点可以...
  • 问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向...
  • 向量点乘与叉乘

    万次阅读 多人点赞 2019-02-25 14:06:01
    向量点乘与叉乘 向量(Vector)  在几乎所有的几何问题中,向量(有时也称矢量)是一个基本点。向量的定义包含方向和一个数(长度)。在二维空间中,一个向量可以用一对x和y来表示。例如由点(1,3)到(5,1的向量...
  • 1、判断一个点在一条直线的左侧还是右侧 叉乘方向法 向量的叉积,p1,p2,p3三个点,判断p3在p1p2向量的左边还是右边,左右跟向量的方向有关,如果是p1p2的方向,那么就是对|p1,p2,p3|进行叉积计算,根据右手法则,...
  • 如何判断线段线段是否相交。 方法:1. 矩形实验  2. 跨立实验 知识点解析: 1. 矩形实验是为了将相距距离比较远的线段直接排除(因为这样,他们不能相交),具体做法也很简单,就是两条线段横坐标与纵坐标的...
  • 计算几何叉乘作用

    千次阅读 2018-09-13 17:32:59
    比如做一个方向盘,目标点在B,则可以OA叉乘OB,使用右手定则,大于0逆时针旋转,小于0顺时针。 2、判断点在线的左边还是右边 道理和上面的相同,左边右手定则是大于0的,小于0右边,等于0共线,可以运用这个来...
  • 碰撞检测:判断线段相交

    千次阅读 2019-02-26 19:02:42
    2D叉乘 3D 叉乘: 3D 叉乘的结果是一个 3D 向量,这个向量垂直于参与运算的2个向量的法向量。 3D 叉乘计算公式:( a.y * b.z - b.y * a.z , a.z * b.x - b.z * a.x , a.x * b.y - b.x * a.y ) 2D叉乘: 2...
  • 首发于我的博客 转载请注明出处解析几何的巅峰是 向量那无关过程的狂妄与简洁映射着大自然...但倘若我把“直线”换成“线段”呢——如何判断两条线段是否相交?这就有些难度了。和 直线 不同,线段 是有固定长度...
  • 阅读本文,你可以了解 AS3中判断线段和矩形是否相交的一种方法。实例如下:源码如下:(判断方法来自网上,原方法是java的)[codesyntax lang=”php”]package{import flash.display.Sprite;import flash.events....
  • 假如矩形图像旋转了,区域判断就不能简单的使用Rect.Contans判断了,否则会出现错误的检测结果。在游戏中,这是很常见的问题,旋转矩形的区域判断很常用。但是,这在Unity中做旋转矩形区域的区域判断,就没有给出...
  • 仔细看上图,三条线段组成了一个闭合的三角形,将每一个线段看成一个向量: (图9) 则a×b = a1×b + a2×b,也就是说我们修改下定义,把叉积定义为一个向量就能满足分配律了。 再来看交换律,回头看图(3),按我们...
  • 两条线段相交检测 性质 利用向量叉积进行线段相交判断。 时间复杂度Θ(1) 接口设计 extern "C" class ALGORITHMLIB SegmentIntersection { public: enum POINT_TYPE { LEFT, RIGHT, }; class LinePoint {...
  • 热泪盈眶中……引子如何判断两条直线是否相交?这很容易。平面直线,无非就是两种关系:相交 或 平行。因此,只需判断它们是否平行即可。...但倘若我把“直线”换成“线段”呢——如何判断两条线段...
  • 两条线段的交点 交点

    千次阅读 2020-04-14 20:18:20
    两条直线相交:叉乘,向量叉乘 符号为逆时针旋转共线为正,顺时针旋转为负。值为向量组成的三角形面积的2倍。 点 (X, Y)在线段上 (X1,Y1) (X2,Y2): X>=min(X1,X2)&&X<=max(X1,X2)&a...
  • 51nod1264线段相交

    2018-12-04 17:51:53
    题意: 解题思路: 刚开始想了个思路 算斜率判断相交 然后发现需要特判的情况很多,斜率为0, 斜率不存在 ,一个有斜率,一个没斜率,一个斜率是0,一个不是0,两个都是0....。。...两个线段 四...
  • 点、向量与旋转向量

    2020-10-07 14:53:31
    计算旋转向量:叉乘(外积) a×b=a∧ba \times b=a^{\wedge}ba×b=a∧b 注意叉乘的先后顺序,表示从 aaa 转向 bbb. 举例,orb-vio中估计重力向量从惯性坐标系到VINS系统的世界坐标系的旋转变换时,显然重力是一个...
  • 向量的点乘与叉乘

    千次阅读 2016-07-15 16:15:20
    2.伸出右手,四指弯曲,四指与A旋转到B方向一致,那么大拇指指向为C向量的方向。 另外还有一个有用的特征那就是叉积的绝对值就是A和B为两边说形成的平行四边形的面积。也就是AB所包围三角形面积的两倍。在计算...
  • (顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下图: 在上图中,OA×OB = 2 > 0, OB在OA的逆时针方向;OA×OC = -2 < 0,OC在OA的顺势针方向。即叉乘结果大于0,后一个在...
  • 题目:给出一些线段,判断有几个交点。 问题:如何判断两条线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): ...(顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,554
精华内容 621
关键字:

旋转线段叉乘