计算几何基本模板
2016-07-26 10:24
453 查看
上传一下计算几何的基本模板,自己也可以看
#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) ; }
相关文章推荐
- CodeForces 540D Bad Luck Island (DP)
- html 常用代码块
- hadoop:基于Java API实现的编译
- 【Codeforces Round 362 (Div 2)C】【STL-map 最近公共祖先思想】Lorenzo Von Matterhorn 数域二叉树的路径权值变更查询
- 62. Unique Paths
- iOS 单例写法以及 App生命周期线程
- poj 1258 Agri-Net
- C++中的基础问题——virtual destructor问题,new与malloc区别
- 64位Win7下安装并配置Python3的深度学习库:Theano
- 《Android开发艺术探索读书笔记二》
- Jmeter之使用CSV Data Set Config实现参数化登录
- IBM助推OpenPOWER联手传智播客落地大数据人才培养计划
- jQuery事件绑定on()、bind()与delegate() 方法详解
- 代码注释
- 【转】.NET多种WebKit内核/Blink内核浏览器初步测评报告
- leetcode 之 House Robber
- linux笔记:shell基础-bash变量
- RSA密钥——JAVA与C#的区别和联系
- Hadoop:Pipes接口实现
- PG 被删除列的恢复