Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Collision Detection   Найти похожие ветки 

 
@!!ex ©   (2007-01-02 09:31) [0]

Пишу 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-02 11:06) [1]

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


 
ors_archangel ©   (2007-01-03 04:28) [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-03 09:26) [3]


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
2-1201538510
MVanya
2008-01-28 19:41
2008.02.24
вопрос про интерфейсы


15-1201188142
Anatoly Podgoretsky
2008-01-24 18:22
2008.02.24
Что хотят, то и творят.


2-1201812356
owa
2008-01-31 23:45
2008.02.24
последний элемент массива


2-1201684718
Lex-85
2008-01-30 12:18
2008.02.24
Ошибка в Maskedit


2-1201538438
ComboBox
2008-01-28 19:40
2008.02.24
Шрифт в ComboBox