一些重要的定义和表示:
表示点的结构体:
1 struct Point{ 2 double x, y; 3 };
表示线段的结构体:
1 struct Segment{ 2 Point p1, p2; 3 };
表示直线的结构体:
1 typedef Segment Line;
表示圆的类:
1 class Circle{ 2 public: 3 Point c; 4 double r; 5 Circle(Point c = Point(), double r = 0.0): c(c), r(r){} 6 };
多边形的表示:用点的序列
1 typedef vector<Point> Polygon;
重载点之间的运算:
1 struct Point{ 2 double x, y; 3 Point operator + (Point &p){ 4 return Point(x + p.x, y + p.y); 5 } 6 7 Point operator - (Point &p){ 8 return Point(x - p.x, y - p.y); 9 } 10 11 Point operator * (double k){ 12 return Point(x * k, y * k); 13 } 14 };
向量的范数和大小:
1 double norm(Vector a){ 2 return a.x * a.x + a.y * a.y; 3 } 4 5 double abs(Vector a){ 6 return sqrt(norm(a)); 7 }
最终的点和向量定义:
1 #define EPS (1e - 10) 2 #define equals(a, b) (fabs((a) - (b)) < EPS ) 3 class Point{ 4 public: 5 double x, y; 6 7 Point(double x = 0, double y = 0): x(x), y(y){} 8 9 Point operator + (Point p) {return Point(x + p.x, y + p.y);} 10 Point operator - (Point p) {return Point(x - p.x, y - p.y);} 11 Point operator * (double a) {return Point(x * a, y * a);} 12 Point operator / (double a) {return Point(x / a, y / a);} 13 14 double abs() { return sqrt(norm()); } 15 double norm() { return x * x + y * y; } 16 17 bool operator < (const Point &p) const { 18 return x != p.x ? x < p.x : y < p.y; 19 } 20 21 bool operator == (const Point &p) const { 22 return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS; 23 } 24 }; 25 26 typedef Point Vector;
一些常用计算:
向量内积a*b:标量,表示b在a方向上投影和a模的乘积
a*b = |a||b|cosθ = a.x * b.x + a.y * b.y
代码如下:
1 double dot(Vector a, Vector b){ 2 return a.x * b.x + a.y * b.y; 3 }
向量外积axb:标量,表示和ab平面垂直的向量,满足右手定则,从a转到b,大拇指方向为内积方向
当a,b为二维向量时
|a x b| = a.x * b.y - a.y * b.x
代码如下:
1 double cross(Vector a , Vector b){ 2 return a.x * b.y - a.y * b.x; 3 }