Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Collision Detection


@!!ex ©   (2007-01-02 09:31:00) 

Пишу Col Detect на базе вот этой статьи:
http://www.gamedev.ru/articles/?id=30123

Наверно все ее не раз читали.

Все замечательно...
Но стоит подойти к краю полигона на расстояни меньше чем Radius
и InsidePolygon начинает возвращать False.....
Никак не могу понятЬ. почему.
function InsidePolygon(const Intersection:vector; const P:TColPolygon): Boolean;
var
   Angle: Single;
   vA, vB: vector;
begin
 Angle:=0;

 vA := SubVector(P.V1, Intersection);
 vB := SubVector(P.V2, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 vA := SubVector(P.V2, Intersection);
 vB := SubVector(P.V3, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 vA := SubVector(P.V3, Intersection);
 vB := SubVector(P.V1, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 if Angle >= (MATCH_FACTOR * (2.0 * PI)) then
 begin
  Result := True;
  Exit;
 end;

 Result := False;
end;


@!!ex   (2007-01-03 09:26:00) [1]


> ors_archangel ©   (03.01.07 04:28) [2]

Согласен.
Но Сейчас пока не до оптимизации.
ИМХО оптимизировать надо полностью работающий код. :))


ors_archangel   (2007-01-03 04:28:00) [2]

Код [0] дважды вычисляет длину каждого вектора :( Лучше так:

function InsideTri(const tri: TTri; const pt: TVertex): boolean;
var
 a,b,c: TVector;
 alen,blen,clen: single;
 angle, sum: single;
begin
 a := vdiff(tri[0],pt);
 b := vdiff(tri[1],pt);
 c := vdiff(tri[2],pt);
 alen := sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
 blen := sqrt(b.x*b.x + b.y*b.y + b.z*b.z);
 clen := sqrt(c.x*c.x + c.y*c.y + c.z*c.z);
 angle := arccos((a.x*b.x + a.y*b.y + a.z*b.z) / (alen*blen));
 if isnan(angle) then sum := 0 else sum := angle;
 angle := arccos((b.x*c.x + b.y*c.y + b.z*c.z) / (blen*clen));
 if not isnan(angle) then sum := sum + angle;
 angle := arccos((c.x*a.x + c.y*a.y + c.z*a.z) / (clen*alen));
 if not isnan(angle) then sum := sum + angle;
 result := (sum >= 0.9999 * 2.0*pi);
end;


@!!ex   (2007-01-02 11:06:00) [3]

Вс нашел, все исправил.
Народ, кто будет в дальнейшем пользоваться этой статьей:
MATCH_FACTOR = 0.9 слишком большая величина.
Я поставил 0.99999 и все сразу стало значительно лучше.


Наверх

Титульная страница Поиск, карта сайта Написать письмо