基础部分
高精度圆周率
const double pi = acos(-1.0);
偏差值
const double eps = 1e-8;
sgn
int sgn(double x) {
// 判断x是否等于0
if (fabs(x) < eps)
return 0;
else
return x < 0 ? -1 : 1;
}
dcmp
int dcmp(double x, double y) {
// 比较两个浮点数,0为相等,-1为小于,1为大于
if (fabs(x - y) < eps)
return 0;
else
return x < y ? -1 : 1;
}
点和向量
点
struct Point {
double x, y;
Point() {
}
Point(double x, double y) : x(x), y(y) {
}
};
两点间距离
double Dist(Point A, Point B) {
// 1: return hypot(A.x - B.x, A.y - B.y);
// 2: return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
向量
typedef Point Vector;
向量的运算
struct Point {
double x, y;
Point() {
}
Point(double x, double y) : x(x), y(y) {
} Point operator+(Point B) {
return Point(x + B.x, y + B.y); }
// 加
Point operator-(Point B) {
return Point(x - B.x, y - B.y); }
// 减
Point operator*(double k) {
return Point(x * k, y * k); }
// 乘
Point operator/(double k) {
return Point(x / k, y / k); }
// 除
bool operator==(Point B) {
return sgn(x - B.x) == 0 && sgn(y - B.y) == 0; }
// 等于
};
点积
定义:A·B=|A||B|cosθ
几何意义
θ:表示向量b与向量a的夹角
向量b在向量a上的投影长度乘以向量a的模长
double Dot(Vector A, Vector B) {
return A.x * B.x + A.y * B.y;
}
应用
- 判断向量 与向量 的夹角是钝角还是锐角
若 Dot(A,B) > 0,说明向量 与向量 的夹角是锐角
若 Dot(A,B) == 0,说明向量 与向量 的夹角是直角
若 Dot(A,B) < 0,说明向量 与向量 的夹角是钝角 - 求向量A的模长
double Len(Vector A) {
return sqrt(Dot(A, A));