首页 > 代码库 > <complex>类型

<complex>类型

刷计算几何的时候在lrj模板里发现了奇怪的东西:

(大白书P256)

typedef complex<double> Point;

 

complex表示的是复数类型

根据MSDN,complex类型的定义是这样的:

template<>   class complex<double> {public:   complex(      double _RealVal = 0,       double _ImagVal = 0   );   complex(      const complex<double>& _ComplexNum   );   explicit complex(      const complex<long double>& _ComplexNum   );   // rest same as template class complex};

其中_RealVal为实部,_ImagVal为虚部

函数real(p)返回实部,imag(p)返回虚部

 

复数的两部分正好对应一个点的x坐标和y坐标。所以用complex表示点可以让代码更简洁。

 

 

 

 

否则就很容易写出这种屎一样的东西   -.-

技术分享
    double Cross(point A,point B)    {        complex<double> a(A.x,A.y);        complex<double> b(B.x,B.y);        return (imag(conj(a)*b));    }    double Dot(point A,point B)    {        complex<double> a(A.x,A.y);        complex<double> b(B.x,B.y);        return real(conj(a)*b);    }    point Getcrosspoint(line X)    {        //this:a->b   X:X.a->X.b        if ((a==X.a)||(a==X.b))     return a;        if ((b==X.a)||(b==X.b))     return b;        point v(b.x-a.x,b.y-a.y);  point w(X.b.x-X.a.x,X.b.y-X.a.y);        point u(a.x-X.a.x,a.y-X.a.y);        double t=Cross(w,u)/Cross(v,w);        point ans(a.x+t*v.x,a.y+t*v.y);        return ans;    }    bool PointOnSeg(point p)    {        //p   a->b        point tx(a.x-p.x,a.y-p.y);        point ty(b.x-p.x,b.y-p.y);        //if ((p==a) || (p==b))  return true;        return dcmp(Cross(tx,ty))==0 && dcmp(Dot(tx,ty))<0 ;    }
View Code

 

<complex>类型