向量及其运算
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课件里的判断直线相交代码
相关文章推荐
- Java堆和native堆
- Best Time to Buy and Sell Stock III
- [转载学习]
- c++遍历文件夹中的图片(或文件)
- ios 动态设置Cell高低
- UICollectionView的使用
- 数据源1
- BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
- 如何终止java线程
- hdu 5430(几何)
- hdu 5430(几何)
- LintCode 删除排序数组中的重复数字 II
- 以消息对话框的形式输出当前时间
- 三种样式表插入方法
- hdu5493 Queue 线段树
- Java多线程5:synchronized锁方法块
- JDK+MyEclipse+Tomcat的配置
- Linux--进程组、会话、守护进程 http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html
- 字符串
- wordCount 4000 源码分析