最近开始学习计算几何
模板会定期更新(定期修锅)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <limits.h>
#define ll long long
#define eps 1e-8
//定义点的结构体
typedef struct point{
double x, y;
} Point;
//判断两个浮点数是否相等
int Equals(double a, double b) {return fabs(a - b) < eps ? 1 : 0;}
//向量的长度,即原点到一个点的距离
inline double Len(Point a) {return sqrt(a.x * a.x + a.y * a.y);}
//向量加法
inline Point Add(Point a, Point b) {a.x += b.x, a.y += b.y; return a;}
//向量减法
inline Point Sub(Point a, Point b) {a.x -= b.x, a.y -= b.y; return a;}
//两个点的距离
inline double Dis(Point a, Point b) {return Len(Sub(a, b));}
//向量放缩(乘k倍)
inline Point Mul(Point a, double k) {a.x *= k, a.y *= k; return a;}
//两个向量求点积
inline double Dot(Point a, Point b) {return a.x * b.x + a.y * b.y;}
//两个向量求叉积
inline double Cro(Point a, Point b) {return a.x * b.y - a.y * b.x;}
//把一个向量顺时针旋转θ
inline Point ClockRot(Point a, Point b, double theta) {Point ans; ans.x = (a.x - b.x) * cos(theta) + (a.y - b.y) * sin(theta) + b.x, ans.y = (a.y - b.y) * cos(theta) - (a.x - b.x) * sin(theta) + b.y; return ans;}
//判断点是否在线段上
inline int j_PS(Point p, Point a, Point b) {return Dot(Sub(a, p), Sub(b, p)) <= 0.0 && Equals(Cro(Sub(a, p), Sub(b, p)), 0.0) ? 1 : 0;}
//求点到直线距离
inline double d_PL(Point p, Point a, Point b) {return fabs(Cro(Sub(a, p), Sub(b, p))) / Dis(a, b);}
//求点到线段距离
inline double d_PS(Point p, Point a, Point b) {
if (Equals(a.x, b.x) && Equals(a.y, b.y)) return Len(Sub(p, a));
if (Dot(Sub(b, a), Sub(p, a)) < 0.0) return Dis(a, p);
if (Dot(Sub(p, b), Sub(a, b)) < 0.0) return Dis(a, p);
return d_PL(p, a, b);
}
//判断点是否在直线上
inline int j_PL(Point p, Point a, Point b) {return Equals(Cro(Sub(a, p), Sub(b, p)), 0.0);}
//求点在直线上的垂足
inline Point FootPoint(point p, Point a, Point b) {double len1 = Dot(Sub(p, a), Sub(b, a)) / Dis(a, p), len2 = Dot(Sub(p, b), Sub(a, b)) / Dis(b, p); return Add(a, Mul(Sub(b, a), len1 / (len1 + len2)));}
//求点到直线的对称点
inline Point Symmetric_PL(Point p, Point a, Point b) {return Sub(Mul(FootPoint(p, a, b), 2.0), p);}
//求两条直线的交点(通过正弦定理推导公式)
inline Point cross_LL(Point a, Point b, Point c, Point d) {return Add(a, Mul(Sub(b, a), Cro(Sub(d, c), Sub(a, c)) / Cro(Sub(a, b), Sub(c, d))));}
//判断直线ab和线段cd相交(两直线的交点在线段cd上即可)
inline int j_cross_LS(Point a, Point b, Point c, Point d) {return j_PS(cross_LL(a, b, c, d), c, d);}
//判断线段ab和线段cd相交(两直线的交点分别在两条线段上即可)
inline int j_cross_SS(Point a, Point b, Point c, Point d) {Point cross = cross_LL(a, b, c, d); return j_PS(cross, a, b) && j_PS(cross, c, d);}
int main() {
//for test
return 0;
}
有锅评论
|