计算几何-球和直线交点
Posted wengsy150943
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算几何-球和直线交点相关的知识,希望对你有一定的参考价值。
如果要求球和线段交点的话,再判一下点是否在线段上即可。
const double eps=1e-8; int sgn(double x) return fabs(x) < eps ? 0 : (x > 0 ? 1 : -1); struct P double x,y,z; P(double x=0,double y=0,double z=0):x(x),y(y),z(z) ; ; P operator-(const P &a,const P&b) return P(a.x-b.x,a.y-b.y,a.z-b.z); P operator/(const P&a,double k) return P(a.x/k,a.y/k,a.z/k); bool operator==(const P&a,const P&b) return a.x==b.x&&a.y==b.y&&a.z==b.z; double dot(const P&a,const P&b) return a.x*b.x+a.y*b.y+a.z*b.z; double dist(const P&p) return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); vector<P> c_l_intersection(const P&o,const P&s,const P&t,double r) vector<P>ret; if(s==t) return ret; P vec=(t-s)/dist(t-s); P onew=o-s; double dotov=dot(onew,vec); double delta=4*(dotov*dotov-dist(onew)*dist(onew)+r*r); delta=sqrt(delta); if(sgn(delta)<0) return ret; double t1=dotov+delta/2; ret.push_back(P(s.x+t1*vec.x,s.y+t1*vec.y,s.z+t1*vec.z)); if(sgn(delta)>0) double t2=t1-delta; ret.push_back(P(s.x+t2*vec.x,s.y+t2*vec.y,s.z+t2*vec.z)); return ret;
以上是关于计算几何-球和直线交点的主要内容,如果未能解决你的问题,请参考以下文章