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

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

struct Point
{double x,y;Point(double x=0,double y=0):x(x),y(y) {}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }
Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }bool operator < (const Point& a,const Point& b)
{return a.x<b.x || (a.x==b.x && a.y<b.y);
}
int dcmp(double x)  //
{if(fabs(x)<esp) return 0;else return x<0?-1:1;
}
bool operator == (const Point& a,const Point& b)
{return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y)==0;
}

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

点: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。

代码:

///计算点积,及向量长度,及向量夹角
double Dot(Vector A,Vector B) { return A.x*B.x+A.y*B.y; }
double Length(Vector A) { return sqrt(Dot(A,A)); }
double Angle(Vector A,Vector B) { return acos(Dot(A,B))/Length(A)/Length(B); }
//计算叉积,向量逆时针旋转,两线段是否想交
double Cross(Vector A,Vector B) { return (A.x*B.y-A.y*B.x); }
double Area2(Vector A,Vector B,Vector C)  { return Cross(B-A,C-A); }
Vector Rotate(Vector A,double rad)
{return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
bool Converxline(Vector A,Vector B,Vector C,Vector D)
{//共线或平行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)return false;elsereturn true;
}

计算几何基础——【点积和叉积的用处】相关推荐

  1. 计算几何基础——点积和叉积

    计算几何是算法竞赛的一大块,而叉积是计算机和的基础. 首先叉积是计算说向量之间的叉积,那么我们可以这样定义向量,以及向量的运算符重载. struct Point {double x,y;Point(d ...

  2. 点积和叉积【计算集合】

    先简单看一道几何的题目吧. 常见的空间几何公式: 1.俩点之间的距离sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)) 2.平面三角公式:p = (a+b+ ...

  3. 计算几何基础知识 叉乘、点乘、点到直线距离、叉积方向法等

    一.几何 常考却不怎么掌握的: ​ 数据结构:分块 ​ 字符串:后缀数组.后缀自动机 ​ 数学:FFT.DFT.NTT.杜教筛.拉格朗日插值等 ​ 图论:网络流.最小费用最大流 ​ 动规:五边形数优化 ...

  4. 计算几何基础(持续更新)

    计算几何 文章目录 计算几何 二维几何基础 点和向量 点积和叉积 点和线 多边形 三角形和普通多边形定义 判断点在多边形内部 多边形的面积 求多边形的重心 圆 圆的定义 最小圆覆盖 二维几何基础 1. ...

  5. 计算几何及其应用——计算几何基础

    写在前面:当时开计算几何这个专题神奇的从解析几何开始了,然后最近发现<计算几何及应用(金博)>这本书前面那章忽略掉了一些重要的东西比如说点定位.半平面相交之类的东西,恰好还有一些和计算几何 ...

  6. (一)计算几何基础(上)

    文章目录 无语子,自己的模板出锅了,不过修改好了 计算几何基础知识点 例题一: 例题二 例题三:![在这里插入图片描述](https://img-blog.csdnimg.cn/ed358fece28 ...

  7. matlab 向量_Matlab:向量点积和叉积及求模

    点击上方蓝字关注 无距书乡 获取持续更新 上一篇中我们说到了如何在matlab中创建向量以及向量的加减乘除方法.今天我们继续介绍向量的点积和叉积以及如何求向量的长度.下一篇再讲矩阵相关知识. 两个向量 ...

  8. 向量复习(一):定义、求解、四则运算、点积和叉积

    向量复习(一) 1. 向量的定义 2. 向量的表示 3. 向量的求解 4. 向量的四则运算 4.1 加法 4.2 减法 4.3 乘法和除法 5. 点积和叉积 5.1 点积 5.2 叉积 6. 模的求解 ...

  9. 计算几何基础【用图来助你理解几何算法】

    写在前面,本人也是小白,这是我在大学自学的内容,有部分内容来自网上,若侵权请告知.当然如果这篇文章能够帮助到你,可以点赞收藏,如果写的不妥的地方,欢迎大佬们指出. 1.基本概念 1.1计算几何的引入 ...

最新文章

  1. 通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩
  2. Flume自定义Hbase Sink的EventSerializer序列化类
  3. python 爬虫-beautifulsoup4
  4. 操作系统课设之简单 shell 命令行解释器的设计与实现
  5. 下一个主要AI平台是什么?苹果说:手机
  6. Java基础篇之什么是CharArrayReader
  7. JAVA基本IO操作
  8. Sublime Text 3破解补丁
  9. win10专业版占多少空间_Win10系统
  10. Icarus iverilog中PLI使用范例
  11. 分享一个HTML【叶子特效】,确切一点 是 落叶特效(完整代码)
  12. 用python做一个数据查询软件_使用Python实现NBA球员数据查询小程序功能
  13. 2016.7.14 如何在浏览器中查看jsp文件
  14. 四种形态图解_波浪理论:调整浪的四种形态(图解)
  15. vue updated
  16. JDK软件安装+环境变量配置图文详解(Win10环境)
  17. 使用Javascript制作声音按钮
  18. 为什么你该学习编程了?
  19. linux没办法识别u盘,linux系统下不能识别U盘
  20. 基于PysimpleGUI+pymysql建立的简单管理系统(1)

热门文章

  1. 【pandas之DataFrame相关函数】loc()函数、iloc函数
  2. google学术出现错误
  3. sql注入(三)绕过方法及防御手段
  4. linux 内核源码下载网址
  5. Linux·内核源码简单分析
  6. C语言:裴波那契数列(数组)
  7. 基于视频的车辆检测文献综述
  8. 学弟:功能测试转测试开发容易吗?
  9. [Python] [邮件发送] 用Python的smtplib和email库进行邮件发送
  10. IntelliJ IDEA的常用设置和快捷键