//=====================================================================================
// float型精度(6~7位), 最少为小数点后6位
// double型精度(15~16位), 最少为小数点后15位
//=====================================================================================
#include<math.h>
struct Point{
double x, y;
Point() {}
Point(double x = 0, double y = 0):x(x), y(y) {}
};
typedef Point P; // 使 P成为Point的别名
//向量 + 向量 = 向量, 点 + 向量 = 点;
P operator + (P A, P B) {
return P(A.x + B.x, A.y + B.y);
}
//点 - 点 = 向量;
P operator - (P A, P B) {
return P(A.x - B.x, A.y - B.y);
}
//向量 * 数 = 向量
P operator * (P A, double d) {
return P(A.x * d, A.y * d);
}
//向量 / 数 = 向量
P operator / (P A, double d) {
return P(A.x / d, A.y / d);
}
//优先比较a、b两点的横坐标, 若相等, 再比较纵坐标
bool operator < (const P& a, const P& b) {
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
//定义浮点误差 1的-10次方
const double eps = 1e-10;
//用于判断浮点误差
int dcmp(double x) {
if(fabs(x) < eps) return 0; //如果小于定义的浮点误差 (一般就忽略误差)
if(x < 0) return -1; //如果误差大于定义的浮点误差 再判断该误差是正值还是负值
else return 1;
}
//根据精确度判断点是否为同一个点
bool operator == (const P& a, const P& b) {
return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
}
//二维空间内有两个向量a(x1, y1)和b(x2, y2),定义它们的乘积(又叫内积、点积)为: x1*x2+y1*y2;
//点积 注意 : 点积就是 两个向量的乘积!!
double operator * (const P& a, const P& b) {
return a.x*b.x + a.y*b.y;
}
//在二维空间中,叉乘的定义是:V1(x1, y1) * V2(x2, y2) = x1y2 –y1x2
//叉积(也称叉乘) : 用于求两个向量组成的三角形的有向面积的两倍
double operator ^ (const P& a, const P& b) {
return a.x*b.y - b.x*a.y;
}
//两点间的距离
double dist(P a, P b) {
return sqrt((a-b)*(a-b));
}
//绕原点旋转角度rad(rad是弧度,不是角度)后得到的新点。
P tansXY(P A, double rad) {
double tx = A.x*cos(rad)-A.y*sin(rad);
double ty = A.x*sin(rad)+A.y*cos(rad);
return P(tx, ty);
}
//========================================================================================
几何基本函数----Point
最新推荐文章于 2023-04-15 11:22:22 发布