Показать сообщение отдельно
Старый 26.11.2008, 00:36
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 9  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
SenCher, имеешь в виду исходник о котором я говорил? Тогда вот. Еле нашёл) Страшно смотреть как я кодил пару лет назад)
Код:
function CirCollision(x1,y1,r1,a1,s1,x2,y2,r2,a2,s2:single; var t:single):boolean;
var ABx,ABy,COSA,SINA,K,A,B,D,CABx,SABy,t1,t2:single;
begin
  Result:=true;
  ABx:=x1-x2;
  ABy:=y1-y2;
  COSA:=cos(a1)*s1-cos(a2)*s2;
  SINA:=sin(a1)*s1-sin(a2)*s2;
  K:=sqr(ABx)+sqr(ABy)-sqr(r1+r2);
  CABx:=2*COSA*ABx;
  SABy:=2*SINA*ABy;
  A:=sqr(COSA) + sqr(SINA);
  B:=CABx+SABy;
  // Получаем квадратное уравнение A*t^2+B*t+K=0
  D:=B*B-4*A*K;
  if (D < 0) or (A = 0) then // Уравнение не имеет корней или A=0, что маловероятно (:
    begin
      Result:=false;
      t:=0;
      Exit;
    end;
  t1:=(-B-sqrt(D))/(2*A);
  t2:=(-B+sqrt(D))/(2*A);
  if t1<t2 then
    t:=t1
  else t:=t2;
  if t<0 then
    Result:=false; 
end;
Извини, он на Delphi и переводить мне лень (:
"var t:single" - это значит примерно то же что передача параметра по ссылке в AS.
Оказывается я здесь выводил немного другое уравнение движения, с учётом угла движения, а не вектора. Вообщем, функция проверяет сталкиваются ли две окружности, начальная позиция которых x1,y1 и x2,y2; радиусы r1,r2; углы под которыми они двигаются a1 и a2; скорости s1 и s2. Углы, как видно, в радианах.
Уравнение движения таких окружностей должны быть вида
Код:
X=X0+cos(Angle)*Speed*t;
Y=Y0+sin(Angle)*Speed*t;
Иначе работать не будет) t, который получаем на выходе - это время, через которое столкнутся. Если от 0 до 1 - значит, на этом "ходу" столкнулись. Больше 1 - вероятно столкнуться в будущем, если курс не поменяют.
Даже не знаю, получится ли тебе её адаптировать под свою ситуацию.
__________________
while(1) {}


Последний раз редактировалось Division; 26.11.2008 в 00:49.