叉积:
如果若
O
A
→
=
(
x
1
,
y
1
)
,
O
B
→
=
(
x
2
,
y
2
)
\overrightarrow{OA}=(x1,y1) , \overrightarrow{OB}=(x2,y2)
OA=(x1,y1),OB=(x2,y2)
定义叉积:
O
A
→
×
O
B
→
=
x
1
y
2
−
x
2
y
1
\overrightarrow{OA}×\overrightarrow{OB}=x1y2−x2y1
OA×OB=x1y2−x2y1
三
角
形
S
O
A
B
=
1
2
∗
∣
O
A
→
∗
O
B
→
∣
三角形S_{OAB} = \frac{1}{2} * |\overrightarrow{OA} * \overrightarrow{OB}|
三角形SOAB=21∗∣OA∗OB∣
令
t
=
O
A
→
∗
O
B
→
如
果
点
A
在
O
B
的
顺
时
针
方
向
则
t
>
0
,
反
之
逆
时
针
则
t
<
0
,
三
点
一
线
则
t
=
=
0
t = \overrightarrow{OA} * \overrightarrow{OB} 如果点A在OB的顺时针方向则t > 0, 反之逆时针则t < 0, 三点一线则t ==0
t=OA∗OB如果点A在OB的顺时针方向则t>0,反之逆时针则t<0,三点一线则t==0
极角排序常用的四种方法:
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));
}
bool cmp1(point a,point b) //方法一,利用atan函数,精度较低时间快
{
if(atan2(a.y,a.x)!=atan2(b.y,b.x))
return atan2(a.y,a.x)<atan2(b.y,b.x);
else return a.x<b.x;
}
bool cmp2(point a,point b) // 方法二, 叉积,按极角大小排序, 精度高时间较慢
{
point c;//原点
c.x = 0;
c.y = 0;
if(compare(c,a,b)==0)//计算叉积,函数在上面有介绍,如果叉积相等,按照X从小到大排序
return a.x<b.x;
else return compare(c,a,b)>0;
}
int Quadrant(point a) //象限排序,注意包含四个坐标轴
{
if(a.x>0&&a.y>=0) return 1;
if(a.x<=0&&a.y>0) return 2;
if(a.x<0&&a.y<=0) return 3;
if(a.x>=0&&a.y<0) return 4;
}
bool cmp3(point a,point b) //方法三,先按象限从小到大排序 再按极角从小到大排序, 特殊需求才会用到
{
if(Quadrant(a)==Quadrant(b))//返回值就是象限
return cmp1(a,b);
else Quadrant(a)<Quadrant(b);
}
}