博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机中叉积
阅读量:4114 次
发布时间:2019-05-25

本文共 2268 字,大约阅读时间需要 7 分钟。

计算几何是竞赛的一大块,而叉积是计算机和的基础。

首先叉积是计算说向量之间的叉积,那么我们可以这样定义向量,以及向量的运算符重载。

[cpp]
  1. struct Point  
  2. {  
  3.     double x,y;  
  4.     Point(double x=0,double y=0):x(x),y(y) {}  
  5. };  
  6. typedef Point Vector;  
  7. Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }  
  8. Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }  
  9. Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }  
  10. Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }  
  11.   
  12. bool operator < (const Point& a,const Point& b)  
  13. {  
  14.     return a.x<b.x || (a.x==b.x && a.y<b.y);  
  15. }  
  16. int dcmp(double x)  //  
  17. {  
  18.     if(fabs(x)<esp) return 0;  
  19.     else return x<0?-1:1;  
  20. }  
  21. bool operator == (const Point& a,const Point& b)  
  22. {  
  23.     return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y)==0;  
  24. }  

首先在二维坐标下介绍一些定义:

点:A(x1,y1),B(x2,y2)

向量:向量AB=( x2 - x1 , y2 - y1 )= ( x ,  y );

向量的模 |AB| = sqrt ( x*x+y*y );

向量的点积:[转载]向量叉积 结果为 x1*x2 + y1*y2。

点积的结果是一个数值。

点积的集合意义:我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a 在向量 b 上的投影,即点积是一个向量在另一个向量上的投影乘以另一个向量。且满足交换律

应用:可以根据集合意义求两向量的夹角,cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) =  x1*x2 + y1*y2 / (| a | * | b |)

向量的叉积:[转载]向量叉积 结果为 x1*y2-x2*y1

叉积的结果也是一个向量,是垂直于向量a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,上面结果是它的模。

方向判定:右手定则,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉积的方向)

叉积的集合意义:1:其结果是a和b为相邻边形成平行四边形的面积。

2:结果有正有负,有sin(a,b)可知和其夹角有关,夹角大于180°为负值。

3:叉积不满足交换律

应用:

1:通过结果的正负判断两矢量之间的顺逆时针关系

若 a x b > 0表示a在b的顺时针方向上

若 a x b < 0表示a在b的逆时针方向上

若 a x b == 0表示a在b共线,但不确定方向是否相同

2:判断折线拐向,可转化为判断第三点在前两的形成直线的顺逆时针方向,然后判断拐向。

3:判断一个点在一条直线的那一侧,同样上面的方法。

4:判断点是否在线段上,可利用叉乘首先判断是否共线,然后在判断是否在其上。

5:判断两条直线是否想交(跨立实验)

根据判断点在直线那一侧我们可以判断一个线段的上的两点分别在另一个线段的两侧,当然这是不够的,因为我们画图发现这样只能够让直线想交,而不是线段,所以我们还要对另一条线段也进行相同的判断就ok。

代码:

[cpp]
  1. ///计算点积,及向量长度,及向量夹角  
  2. double Dot(Vector A,Vector B) { return A.x*B.x+A.y*B.y; }  
  3. double Length(Vector A) { return sqrt(Dot(A,A)); }  
  4. double Angle(Vector A,Vector B) { return acos(Dot(A,B))/Length(A)/Length(B); }  
  5. //计算叉积,向量逆时针旋转,两线段是否想交  
  6. double Cross(Vector A,Vector B) { return (A.x*B.y-A.y*B.x); }  
  7. double Area2(Vector A,Vector B,Vector C)  { return Cross(B-A,C-A); }  
  8. Vector Rotate(Vector A,double rad)  
  9. {  
  10.     return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));  
  11. }  
  12. bool Converxline(Vector A,Vector B,Vector C,Vector D)  
  13. {  
  14.     //共线或平行  
  15.     if((Area2(A,B,C)==0&&Area2(A,B,D)==0) || Area2(A,B,C)*Area2(A,B,D)>0||Area2(C,D,A)*Area2(C,D,B)>0)  
  16.         return false;  
  17.     else  
  18.         return true;  
你可能感兴趣的文章
Golang学习日志 ━━ 使用bufio方法拷贝文件将导致mov视频文件出错
查看>>
Golang学习日志 ━━ Mysql相关
查看>>
Golang学习日志 ━━ goQuery 的使用
查看>>
Golang学习日志 ━━ Go 常用包整理及介绍
查看>>
Golang学习日志 ━━ 借百度AI实现语音合成实例
查看>>
安全篇 ━━ 整改mysql数据库及windows服务器(根据安全等级保护评估、渗透测试报告)
查看>>
PHP开发日志 ━━ PHP验证码程序:session生成图片
查看>>
安全篇 ━━ ITlearner ASP探针 V1.2
查看>>
uni-app开发日志[2020122501]:uni-app 和 Vue 的区别
查看>>
uni-app开发日志[2020122502]:uniapp将图片绝对路径转化为BASE64格式
查看>>
PHP开发日志 ━━ MYSQL数据库使用UTF-8中文编码乱码的解决办法
查看>>
PHP开发日志 ━━ IIS7安装PHP8.0及多个版本如何同时存在一台服务器
查看>>
安全篇 ━━ windows2008自建证书、IIS配置https服务器及浏览器报错处理
查看>>
PHP开发日志 ━━ jsrsasign、jsencrypt、php实现前后端数据的RSA加密和解密
查看>>
机械键盘各种设定(品牌:黑爵等)
查看>>
Golang学习日志 ━━ log用法及注意使用条件,否则可能导致关闭程序
查看>>
Golang学习日志 ━━ 宕机恢复神器recover的一些要点
查看>>
Golang学习日志 ━━ 现阶段go与iis的最完美结合(不再考虑端口、窗口,不同语言的应用可共用一个iis)
查看>>
UE4课堂笔记——《UE4C++游戏开发入门教程!》第一期开场,C++必须了解小知识
查看>>
UE4课堂笔记——《UE4C++游戏开发入门教程!》第二期共享变量和方法
查看>>