计算几何简单模板
来源:互联网 发布:初级php开发工程师 编辑:程序博客网 时间:2024/06/12 16:01
刘汝佳书上的模板用着还是不错的,先以这个基础模板,以后自己再补充
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;const double eps = 1e-6;struct Point{ double x,y; Point(double xx=0,double yy=0):x(xx),y(yy){}};typedef Point Vector;//#define Vector PointVector operator - (Point b, Point a){ return Vector(b.x - a.x, b.y - a.y);}Vector operator + (Vector a, Vector p){ return Vector(a.x + p.x, a.y + p.y);}Vector operator * (Vector A,double p){ return Vector(A.x*p,A.y*p);}int dcmp(double x)//三态函数{ if(fabs(x) < eps) return 0; else return x < 0 ? -1 : 1;}bool operator == (const Point & a,const Point & b){ return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;}double Dot(Vector A, Vector B)//点乘{ return A.x*B.x + A.y*B.y;}double Length(Vector A)//模长{ return sqrt(Dot(A,A));}double Angle(Vector A,Vector B)//夹角{ return acos(Dot(A,B)/Length(A)/Length(B));}double Cross(Vector A,Vector B)//叉乘{ return A.x*B.y - A.y*B.x;}double Area2(Point A,Point B,Point C)//计算叉乘,为三角形面积二倍{ return Cross(B-A,C-A);}Vector Rotate(Vector A,double rad)//按照A向量的起点旋转rad弧度{ return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad) + A.y*cos(rad));}Vector Normal(Vector A)//计算向量的单位法线{ double L = Length(A); return Vector(-A.y/L,A.x/L);}Point GetlineIntersection(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的距离{ Vector v1 = B - A,v2 = P - A; return fabs(Cross(v1,v2) / Length(v1));}double DistanceToSegment(Point P,Point A,Point B)//点P到线段AB的距离{ 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);}Point GetLineProjection(Point P,Point A,Point B)//点在直线上的投影{ Vector v = B - A; return A + v*(Dot(v,P-A) / Dot(v,v));}bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2)//是否规范相交{ double c1 = Cross(a2-a1,b1-a1),c2 = Cross(a2-a1,b2-a1); double 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;}int main(){}
0 0
- 计算几何简单模板
- [模板]计算几何模板
- 经典计算几何模板
- 计算几何模板2
- 计算几何 模板
- 计算几何模板
- 计算几何经典模板
- 计算几何模板
- ACM计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何 模板
- 计算几何初步模板
- 计算几何三维模板
- 二维计算几何模板
- 计算几何模板
- 计算几何模板
- 进程间通讯几种方式
- Mysql主从配置
- 令我醉的js加载图片,。。。原来,原来可以这样。。(简单粗暴)
- 华为oj 合唱队
- JAVA虚拟机入门(1)---------类文件结构(上)
- 计算几何简单模板
- 接口和抽象类的区别
- Java Web 初级程序员 -第6天学习内容:this,final,instance of
- AndroidStudio_常用快捷键_新手_精简版
- JAVA中的并发工具类(一)----控制并发数的Semaphore
- 《Windows核心编程》之“Windows挂钩”(二)
- Linux 信号
- node.js
- 开发者所需要知道的 iOS 10 SDK 新特性