向量及其运算

来源:互联网 发布:移动开通国际数据 编辑:程序博客网 时间:2024/04/29 18:39

结构体定义

//向量结构体struct point{    double x;    double y;}p1,p2;//向量加法point operator+(point p1,point p2);{    point pnew;    pnew.x=p1.x+p2.x;    pnew.y=p1.y+p2.y;    return pnew;}//向量减法point operator-(point p1,point p2);{    point pnew;    pnew.x=p1.x-p2.x;    pnew.y=p1.y-p2.y;    return pnew;}//向量乘法double operator*(point p1,point p2);/*内积(几何意义:α在β的投影α’与β的长度的乘积)point operator*(point p1,point p2);{    return p1.x*p2.x+p1.y*p2.y;}*//*外积(几何意义:α和β所张成的平行四边形的有向面积)外积的符号判定:右手定则(见下)point operator*(point p1,point p2);{    return p1.x*p2.y-p2.x*p1.y;}*/

右手定则

应用

1.利用α×β==0?来判断三点共线

point p1,p2,p3;if(fabs((p1-p2)*(p3-p2))<eps) {}//eps是绝对值极小接近0的数,这里的*指外积else {}

2.判断点P(x,y)是否在线段P1P2上,其中P1(x1,y1)P2(x2,y2)

//需要判断2点//1.P在P1P2直线上,及应用1的三点共线if(fabs((p1-p)*(p2-p))<eps){    //2.P在P1P2为对角线的矩形内    if(min(x1,x2)<=x&&x<=max(x1,x2)&&        min(y1,y2)<=y&&y<=max(y1,y2))    {        //P在P1P2线段上    }    else     {        //P不在P1P2线段上    }}else{    //P不在P1P2线段上}

3.判断两线段P1P2和P3P4是否相交,其中Pi坐标为(xi,yi)

//需要两步判断//1.快速排斥实验(以P1P2为对角线的矩形S1是否和以P3P4为对角线的矩形S2有重叠部分)if(min(x1,x2)<=max(x3,x4)&&    min(x3,x4)<=max(x1,x2)&&        min(y1,y2)<=max(y3,y4)&&            min(y3,y)<=max(y1,y2)){    //2.跨立实验(原理见下)    if( ((P1-P3)*(P4-P3))*((P2-P3)*(P4-P3))<=0 &&        ((P3-P1)*(P2-P1))*((P4-P1)*(P2-P1))<=0 )    {        //相交    }    else    {        //不想交    }}else{    //不想交}

跨立实验原理:若 P1P2 跨立 Q1Q2,则 P1,P2 分别在 Q1Q2 所在直线的两端,则有 (P1 - Q1)(Q2 - Q1) (Q2 - Q1)(P2 - Q1) > 0,当 (P1 - Q1)(Q2 - Q1) = 0 时,说明 (P1 - Q1) 与 (Q2 - Q1) 共线,但由于已经经过快速排斥试验,所以 Q1 必为 P1P2 与 Q1Q2 的交点,依然满足线段相交的条件,则跨立试验可改为:
当 (P1 - Q1)(Q2 - Q1) (Q2 - Q1)*(P2 - Q1) >= 0,则 P1P2 跨立 Q1Q2,当 Q1Q2 也跨立 P1P2 的时候,则 P1P2 相交
(注意式子中被隔开的 * 代表两个叉积的值的相乘,而另外的两个 * 则代表计算矢量叉积)
这里写图片描述
这里写图片描述

另:HDU课件里的判断直线相交代码
这里写图片描述
这里写图片描述

0 0
原创粉丝点击