Показать сообщение отдельно
Старый 10.01.2011, 15:39   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,371
Написано 2,477 полезных сообщений
(для 6,865 пользователей)
Ответ: Метод попадания пуль

http://mathworld.wolfram.com/Circle-...ersection.html
http://local.wasp.uwa.edu.au/~pbourk...ry/sphereline/
И реализация на c++
bool IntersectCircleLine(const Vec2&center,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 LineToCirclelx1#, 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 
dy1d
dx2
# = cx - (lx2 + lux * r)
dy2# = cy - (ly2 + luy*r)
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>=And dot2<=0) Or (dot1<=And dot2>=0)) And (distsq <= r)


End Function 
Грубо перевёл с блицмакса, но оно работает.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
Hulk-DS (10.01.2011), impersonalis (10.01.2011)