二维几何问题的常用函数
来源:互联网 发布:mac上ps破解文件 编辑:程序博客网 时间:2024/05/16 10:56
二维几何问题的一些基本函数实现
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const double eps=1e-10;struct Point {//构造函数 double x,y; Point (double x=0,double y=0):x(x),y(y){}};typedef Point Vector;Vector operator + (Point A,Point B)//向量+向量=向量,点+向量=点{ return Vector(A.x+B.x,A.y+B.y);}Vector operator - (Point A,Point B)//点-点=向量{ return Vector(A.x-B.x,A.y-B.y);}Vector operator * (Point A,double p)//向量*数=向量{ return Vector(A.x*p,A.y*p);}Vector operator / (Point A,double p)////向量/数=向量{ return Vector(A.x/p,A.y/p);}bool operator < (const Point & a,const Point &b){ return a.x<b.x||(a.x==b.x&&a.y<b.y);}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)//A与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)//向量绕起点旋转{ 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 DistancToLine(Point P,Point A,Point B)//点到直线的距离{ 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);}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), 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;}double ConvexPolygoArea(Point *p[],int n)//多边形的有向面积{ double area=0; for (int i=1;i<n-1;i++) area+=Cross(p[i]-p[0],p[i+1]-p[0]); return area/2;}int main(){ double x1,y1,x2,y2,x3,y3,x4,y4; cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;//读入坐标 Point A1(x1,y1);//构成点 Point A2(x2,y2); Point A3(x3,y3); Point A4(x4,y4); return 0;}
阅读全文
0 0
- 二维几何问题的常用函数
- 二维几何常用模板
- 计算几何常用的函数/方法
- 【OpenGL】几何变换的常用函数
- 计算几何常用函数
- 计算几何常用函数
- 二维图形的几何变换
- 二维图形的几何变换
- 二维图形的几何变换
- 计算几何-常用几何函数(模板)
- UVA 11178 Morley定理 二维几何问题
- 二维数组作函数的参数问题
- 二维几何
- 常用的几何公式
- C++实现常用的平面计算几何问题求解
- 别扭的几何问题
- 计算几何 二维凸包问题 Andrew算法
- 计算几何 部分常用函数模板
- 进程间通讯:管道
- Google Guava学习(9)-Guava Cache缓存工具(二)
- shell 脚本学习之 字符串比较
- layui 表单元素的选中问题
- Docker service命令详解
- 二维几何问题的常用函数
- 上传文件
- 纯CSS样式 写switch开关
- 项目管理-TortoiseSVN使用
- javascript基础知识之三座大山
- C++ GUI Programming with Qt4 Second Edition 之 附录A.3 Mac系统Qt的安装
- 接口测试基础与工具(一)
- Django urls与views #路径与函数映射 python笔记
- Erlang函数与模式匹配(2)