二维基础
主要是牛客计算几何课程的笔记。
1. 点的表示
using Point = pair<double,double>
//横坐标: .first
//纵坐标: .second
题目不复杂时可用
//更推荐的写法
struct Point{double x,y;};
横纵坐标 .x .y
2. 向量
2.1 向量相关
using Vector = Point;
向量点积: a.x*b.x+a.y*b.y 点积是标量
向量模长: sqrt(a.x*a.x+a.y*a.y)
向量垂直: a.x*b.y-a.y*b.x
注:向量叉积是垂直于a、b向量的,上图
向量叉积: a.x*b.y-a.y*b.x
应用:
平行四边形面积:
叉积ab = a.x*b.y-a.y*b.x
S = sqrt(ab.x*ab.y-ab.x*ab.y)
判向量平行:if(叉积ab==0) 则平行
to-left测试
判断点P在有向直线AB的左侧或者右侧或者就在直线上
感觉可以右手螺旋定则来想象。
2.2 例题
开方比三角函数的精度损失要小。
3. 线段
struct Segment{Point a,b;}
//记录左右端点
3.1 例题
例题1
个人思路:
- 先通过叉积判断点是否在AB所在直线上,
- 然后计算点与A的距离和点与B的距离
- 计算它们的和,把和与AB的长进行大小比较,相等则在AB线段上。
参考答案:
在判断点P在AB之间可以通过
P
A
⋅
P
B
<
=
0
或
m
i
n
{
A
x
,
B
x
}
<
=
P
x
<
=
m
a
x
{
A
x
,
B
x
}
m
i
n
{
A
y
,
B
y
}
<
=
P
y
<
=
m
a
x
{
A
y
,
B
y
}
PA·PB<=0\\ 或min\{{A_x,B_x}\}<=P_x<=max\{A_x,B_x\}\\ min\{A_y,B_y\}<=P_y<=max\{A_y,B_y\}
PA⋅PB<=0或min{Ax,Bx}<=Px<=max{Ax,Bx}min{Ay,By}<=Py<=max{Ay,By}
来得到。
例题2
思路:想办法证明A,B两点在线段CD两边,可以通过to-left测试,判断A在CD的某一方,B在CD的某一方。然后判断AB两点是否在CD的同一方,CD同理需要判断是否在AB的两侧。
在做了跨立实验后,需要特判三点共线、四点共线的情况。
4. 直线
struct Line{Point p,v;};
//v是方向向量
4.1 例题
例题一
输入直线(p,v)与点A,求AB的距离
例题二
输入直线(p,v)与点A,求A在直线上的投影点B的坐标