Тема: PhysicsEngine
Показать сообщение отдельно
Старый 26.08.2010, 17:03   #2
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: PhysicsEngine

из старой pascal'евской игрушки:
function DistToBar(x1, y1, x2, y2, x0, y0 : Integer) : Boolean;
{находится ли точка (x0,y0) в прямоугольнике (x1,y1)-(x2,y2)}
Var
  dx, dy : Integer;
Begin
  dx := abs(x2-x1);
  dy := abs(y2-y1);
  if dx < 15 then  dx := 15;
  if dy < 15 then  dy := 15;
  DistToBar := (abs(x1-x0) <= dx) and (abs(x2-x0) <= dx)
           and (abs(y1-y0) <= dy) and (abs(y2-y0) <= dy);
End;

function DistToLine(x1, y1, x2, y2, x0, y0, maxDist : Integer) : Boolean;
{расстояние от точки (x0,y0) до отрезка (x1,y1, x2,y2)}
Var
  A, B, C : LongInt;
  dist    : Real;
Begin
  x1 := x1 - x0;
  y1 := y1 - y0;
  x2 := x2 - x0;
  y2 := y2 - y0;
  x0 := 0; {?}
  y0 := 0; {?}
  A := y1 - y2;
  B := x2 - x1;
  C := LongInt(y2)*x1 - LongInt(y1)*x2;
  dist := Sqrt(A*A + B*B);
  if dist <> 0 then  dist := abs(A*x0{?=0} + B*y0{?=0} + C) / dist;
  DistToLine := (dist <= maxDist);
End;

Function OnLine(x0, y0, dist, x1, y1, x2, y2 : Integer) : Boolean;
{проверка на пересечение линии на карте}
Begin
  OnLine := DistToBar(x1, y1, x2, y2, x0, y0)
        and DistToLine(x1, y1, x2, y2, x0, y0, dist);
End;
(Offline)
 
Ответить с цитированием