http://mathworld.wolfram.com/Circle-...ersection.html
http://local.wasp.uwa.edu.au/~pbourk...ry/sphereline/
И реализация на c++
bool IntersectCircleLine(const Vec2¢er,float radius,const Vec2&p1,const Vec2&p2)
{
float x01=p1.x-center.x;
float y01=p1.y-center.y;
float x02=p2.x-center.x;
float y02=p2.y-center.y;
float dx=x02-x01;
float dy=y02-y01;
float a=dx*dx+dy*dy;
float b=2.0f*(x01*dx+y01*dy);
float c=x01*x01+y01*y01-radius*radius;
if(-b<0)return (c<0);
if(-b<(2.0f*a))return (4.0f*a*c-b*b<0);
return (a+b+c<0);
}
Перевести думаю не трудно.
Upd. Хмм... А у меня тут оказывается в закромах лежит такой алгоритм:
Function LineToCircle( lx1#, ly1#, lx2#, ly2#, cx#, cy#, r#)
dx# = lx2 - lx1
dy# = ly2 - ly1
ld# = Sqr((dx*dx) + (dy*dy))
lux# = dx / ld
luy# = dy / ld
lnx# = luy
lny# = -lux
dx1# = cx - (lx1 - lux*r)
dy1# = cy - (ly1 - luy*r)
d# = Sqr((dx1*dx1) + (dy1*dy1))
dx1 = dx1 / d
dy1 = dy1/ d
dx2# = cx - (lx2 + lux * r)
dy2# = cy - (ly2 + luy*r)
d = Sqr((dx2*dx2) + (dy2*dy2))
dx2 = dx2 / d
dy2 = dy2 / d
dot1# = (dx1 * lux) + (dy1 * luy)
dot2# = (dx2 * lux) + (dy2 * luy)
px#=lx1-cx
py#=ly1-cy
distsq# = Abs((dx * py - px * dy) / ld )
;Следуещее можно разкоментарить и выводить точку пересечения в глобалы
;LineColX# = cx - lnx * sqr(distsq)
;LineColY# = cy - lny * sqr(distsq)
Return (( dot1>=0 And dot2<=0) Or (dot1<=0 And dot2>=0)) And (distsq <= r)
End Function
Грубо перевёл с блицмакса, но оно работает.