码迷,mamicode.com
首页 > 其他好文 > 详细

<complex>类型

时间:2015-01-29 17:23:06      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

刷计算几何的时候在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>类型

标签:

原文地址:http://www.cnblogs.com/pdev/p/4260298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!