计算几何——向量

计算几何第一篇——向量

这次西安邀请赛计算几何签到题都没做出来,题目有错是一回事,但是最主要的是自己实力的问题。对昨天学习内容的一个总结。

叉积:叉积就是向量积,表示p1,p2,和p1+p2所构成的平行四边形的有向面积。

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。 对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。

https://www.cnblogs.com/aiguona/p/7248311.html

存储点

struct point
{
  double x,y;
}

计算叉积

double cross(double x1,double y1,double x2,double y2)//叉积计算
{
  return x1*y2-x2*y1;
}

叉积的应用:确定连续线段是向左转还是向右转//判断两条线段是否相交。 

计算极角

double compare(point a,point b,point c)
{
  return cross(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}

极脚排序:

为何要进行极角排序?

有时候有些题会用到,所以要进行极角排序,例如求第几大角。

极角排序三种方法,但是第三种我没太看懂,简单介绍前两种方法:

atan2函数:

bool cmp1(point a,point b)
{
  if(atan2(a.x,a.y)!=atan2(b.x,b.y))
    return atan2(a.x,a.y)

tan函数求的是值,atan2求的是角度,对角度进行排序,角度相等的x小的放在前面,角度不相等的,角度小的放在前面。

利用叉积计算:

bool cmp2(point a,point b)
{
  point c;
  c.x=0;
  c.y=0;
  if(compare(c,a,b)==0)
    return a.x0;
}

叉积相等,则代表两向量平行,个人是觉得不能说成重合的,叉积>0,则向量a在向量b的顺时针方向(粗略的理解为在a在b的下方);叉积<0,则向量a在向量b的逆时针方向(粗略的理解为在a在b的上方)。

你可能感兴趣的:(计算几何,向量)