二维几何基础模板(一)
2015-08-10 19:17
253 查看
点和向量都用两个数x,y表示:
2.叉积
3.向量旋转
4.计算向量的单位法线,即转90°
//const double pi=4*atan(1.0);
//const double pi=acos(-1.0);
一、常定义用 :
struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} // 构造函数,方便代码编写 }; typedef Point Vector; //从程序实现上,Vector只是Point的别名
//向量+向量=向量,点+向量=点 Vector operator + (Vector A,Vector B){ return Vector(A.x+B.x,A.y+B.y); }
//点-点=向量 Vector operator - (Vector A,Vector B){ return Vector(A.x-B.x,A.y-B.y); }
//向量*数=向量 Vector operator * (Vector A,double p){ return Vector(A.x*p,A.y*p); }
//向量/数=向量 Vector operator / (Vector 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); }
const double eps=1e-10; 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; }
二、基本运算
1.利用点积计算向量长度和夹角的函数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)); }
2.叉积
double Cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x; }
double Area2(Point A,Point B,Point C){ return Corss(B-A,C-A); }
3.向量旋转
//rad是弧度 Vector Rotate(Vector A,double rad){ return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)); }
4.计算向量的单位法线,即转90°
//调用前请确保A不是零向量 Vector Normal(Vector A){ double L=Length(A); return Vector(-A.y/L,A.x/L); }
三、基于复数的几何计算
//调用前请确保A不是零向量 Vector Normal(Vector A){ double L=Length(A); return Vector(-A.y/L,A.x/L); }
//用real(p)和imag(p)访问实部和虚部,conj(p)返回共轭复数,即conj(a+bj)=a-bj; double Dot(Vector A,Vector B){ return real(conj(A)*B); }
double Corss(Vector A,Vector B){ return imag(conj(A)*B); }
Vector Rotate(Vector A,double rad){ return A*exp(Point (0,rad)); }
//const double pi=4*atan(1.0);
//const double pi=acos(-1.0);
相关文章推荐
- Matlab Codes and Datasets for Feature Learning(转)
- 快速排序----QuickSort 中位数实现
- initImageAppleJPEG:1512: falling back to libJPEG
- Linux裸设备管理详解
- CentOS安装GitLab
- C++对象的静态类型与动态类型
- python2/3差异之——字符串差异
- Spfa 最短路 HDU 2544
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- 数据结构(5)优先级队列与堆排序
- 【POJ 1129】Channel Allocation
- (第九天)DOM事件
- 使用SVM对于许多类型的多维数据分类
- c++中,static,和const,以及引用类型的作用
- TableViewCell中cell高度不一样时的优化
- hdu 2680 Choose the best route (dijkstra)
- B-tree B+tree 数据结构解析
- 数据结构(4)快速排序
- netsh端口转发
- C源码@数据结构与算法->基数排序