1. 程式人生 > 實用技巧 >08 計算幾何

08 計算幾何

點/向量

const double eps=1e-8;
struct Point{
    double x,y;
    Point(){};
    Point(double x,double y): x(x),y(y){};
    Point operator+(Point m){//向量加法
        Point t(x+m.x,y+m.y);
        return t;
    }
    Point operator*(double m){//數乘
        Point t(x*m,y*m);
        return t;
    }
    bool operator
==(Point m){//判斷相等 if(fabs(x-m.x)+fabs(y-m.y)<=eps) return 1; else return 0; } double len(){//向量的模 return sqrt(x*x+y*y); } double len2(){//模平方 return len()*len(); } double ang(){//極角,範圍(-pi,pi] return atan2(y,x); } void one(double
l=1){//歸一化,預設為1 x=l*x/len(),y=l*y/len(); } double dis(Point m){//兩點之間的距離 return sqrt((x-m.x)*(x-m.x)+(y-m.y)*(y-m.y)); } double operator*(Point m){//向量點乘 return x*m.x+y*m.y; } double operator^(Point m){//向量叉乘 return x*m.y-y*m.x; } Point rotate(double
ang){//順時針旋轉 Point t(x*cos(ang)-y*sin(ang),x*sin(ang)+y*cos(ang)); return t; } }; double sin(Point v1,Point v2){//向量夾角的正弦 return (v1^v2)/(v1.len()*v2.len()); } double cos(Point v1,Point v2){//向量夾角的餘弦 return v1*v2/(v1.len()*v2.len()); } double ang(Point v1,Point v2){//兩向量的夾角 return atan2(v1^v2,v1*v2); }

直線

 1 typedef Point Vec;
 2 struct Line{//點向式直線
 3     Vec dir;//方向向量中x為正值
 4     Point pnt;
 5     Line(){}
 6     Line(Vec _dir,Point _pnt):dir(_dir),pnt(_pnt){}
 7     int relation(Point p){
 8         Vec v=dir,u=p-dir;
 9         if((v^u)<eps){
10             return -1;
11         }else if((v^u)>eps){
12             return 1;
13         }else return 0;
14     }
15     double pointdis(Point p){
16         return fabs(p^dir)/dir.len();
17     }
18     Point touying(Point p){
19         Point t,u=p-dir,v=dir;
20         t=dir*(fabs(v^u)/v.len2());
21         return t=t+pnt;
22     }
23     bool operator||(Line s){//平行且不相等
24         if(dir.x*s.dir.y==dir.y*s.dir.x){
25             Vec t=s.pnt-pnt;
26             if(dir.x*t.y!=dir.y*t.x)
27                 return 1;
28         }
29         return 0;
30     }
31     bool operator|(Line s){//只判斷方向
32         if(dir.x*s.dir.y==dir.y*s.dir.x){
33             return 1;
34         }
35         return 0;
36     }
37 };

先就寫這兩個吧,感覺太多的用不到。等整理板子的時候再補充吧。