标签:
刷计算几何的时候在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 ; }
标签:
原文地址:http://www.cnblogs.com/pdev/p/4260298.html