您的位置:首页 > 其它

向量及其运算

2015-10-03 15:11 155 查看

结构体定义

//向量结构体
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课件里的判断直线相交代码



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: