计算几何基本模板
来源:互联网 发布:重庆市网络办事大厅 编辑:程序博客网 时间:2024/05/06 06:55
上传一下计算几何的基本模板,自己也可以看
#include <cstdio>#include <cmath>#include <algorithm>using namespace std;struct Point{ double x, y; Point(double x = 0, double y = 0);};typedef Point Vector;Point::Point(double x, double y){ this->x = x; this->y = y;}//向量与向量的+ - 点积 叉积 Vector operator +(const Vector &A, const Vector &B){//向量的加 return Vector(A.x + B.x, A.y + B.y);}Vector operator -(const Vector &A, const Vector &B){//向量的减 return Vector(A.x - B.x, A.y - B.y);}double dot(const Vector &A, const Vector &B){//向量点积 return (A.x * B.x + A.y * B.y); }double cross(const Vector &A, const Vector &B){//向量叉乘 return (A.x * B.y - B.x * A.y);}//向量关系运算符bool operator <(const Vector &A, const Vector &B){ return (A.x < B.x || (A.x == B.x && A.y < B.y));}int dcmp(double x){//处理double数据i,减少精度问题 if(fabs(x) < 1e-7) return 0; if(x < 0) return 0; else return 1;}bool operator == (const Vector &A,const Vector &B){return (dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0) ;}//向量与数字的乘除 Vector operator *(const Vector &A,double p){return Vector(A.x * p, A.y * p);}Vector operator /(const Vector &A,double p){if(fabs(p-0) < 1e-7) return A;return Vector(A.x / p, A.y / p);}//向量的模 double length(const Vector &A){return sqrt(dot(A,A));}double angle (const Vector &A,const Vector &B){//两向量夹角,弧度表示 return acos(dot(A,B) / length(A) / length(B));}Point GetLineIntrersection(Point P, Vector v, Point Q, Vector w){ //直线交点 Vector u = P - Q;double t = Cross(w, u) / Cross(v, w);return P + v * t;} double DistanceToLine(Point P, Point A, Point B){//点到直线距离,这里是P到AB的距离,等于向量AB X 向量AP 再除以 |向量AB| Vector v1 = B - A, v2 = P - A;return fabs(Cross(v1, v2) / length(v1));}double DistanceToSegment(Point P, Point A, Point B){//点到线段距离,其中可以看两向量点积的正负,来判断点相对于线段的位置if(A == B) return length(P - A);Vector v1 = B - A, v2 = P - A, v3 = P - B;if(dcmp(dot(v1, v2)) < 0) return length(v2);else if(dcmp(dot(v1, v3)) > 0) return length(v3);else return fabs(cross(v1, v2)) / length(v1);}double DistanceMaxToSegment(Point P, Point A, Point B){//点到线段最远距离 Vector v2 = P - A,v3 = P - B;return max(length(v2), length(v3));}//线段是否“正规相交”,即交点不在四个端点上 bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2){double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1), c3 = cross(b2 - b1, a1 - b1), c4 = cross(b2 - b1, a2 - b1); return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;} bool OnSegment(Point p, Point a1, Point a2){ //点是否在线段上 return dcmp(cross(a1 - p, a2 - p)) == 0 && dcmp(dot(a1 - p, a2 - p) < 0) ;}
0 0
- 计算几何基本模板
- 计算几何的基本代码模板
- 【原创】计算几何的基本模板
- [模板]计算几何模板
- <模板><计算几何>凸包及其基本算法
- 经典计算几何模板
- 计算几何模板2
- 计算几何 模板
- 计算几何模板
- 计算几何经典模板
- 计算几何模板
- ACM计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何 模板
- 计算几何初步模板
- 计算几何三维模板
- HDOJ 2199 Can you solve this equation?
- hadoop:基于Java API实现的编译
- 圣杯布局
- Codeforces Round #197 (Div. 2) C. Xenia and Weights(DFS)
- 在Centos中 将apache httpd 服务加入系统服务
- 计算几何基本模板
- 【HDU】2199 - Can you solve this equation?(二分)
- POJ 1088 经典动态规划(记忆搜索)问题
- java正则表达式的分组
- hadoop:基于Streaming实现的编译
- LeetCode-难题集之House_Robber系列
- actionscript3.0 数组排序
- openstack service port(服务端口)
- 解析STM32的启动过程及STM32 启动文件选择