计算几何-球和直线交点

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;
  

 

以上是关于计算几何-球和直线交点的主要内容,如果未能解决你的问题,请参考以下文章

计算几何学习5

计算几何

HDU - 4793 思维计算几何直线和圆交点

计算几何:直线与圆的交点 三角形的内切圆和外接圆(5252: Triangle to Hexagon)

BZOJ 1007 水平可见直线 | 计算几何

计算几何学习7