ВУЗ:
Составители:
Основы компьютерной графики для программистов 19
____________________________________________________________________________________________________________________
http://www.ksu.ru/persons/9134.ru.html
function InTriS(x,y,AX,AY,BX,BY,CX,CY: Single): boolean;
var
Res1,Res2: Single;
ReI1: Integer absolute Res1;
ReI2: Integer absolute Res2;
begin
Res1:= (y-ay)*(cx-ax)-(x-ax)*(cy-ay);
Res2:= (y-cy)*(bx-cx)-(x-cx)*(by-cy);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false //дальше не вычисляем
else
begin
Res2:= (y-by)*(ax-bx)-(x-bx)*(ay-by);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false
else
Result:= true;
end;
end;//function InTriS
Версия функции InTri для входных параметров типа Double.
function InTriD(x,y,AX,AY,BX,BY,CX,CY: Double): boolean;
var
Res1,Res2: Double;
ReI1: Int64 absolute Res1;
ReI2: Int64 absolute Res2;
begin
Res1:= (y-ay)*(cx-ax)-(x-ax)*(cy-ay);
Res2:= (y-cy)*(bx-cx)-(x-cx)*(by-cy);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false //дальше не вычисляем
else
begin
Res2:= (y-by)*(ax-bx)-(x-bx)*(ay-by);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false
else
Result:= true;
end;
end;//function InTriD
В результате, как можно видеть по тексту приведенных процедур, задача решается в
худшем случае за 6 операций умножения и 15 операций вычитания, а в лучшем случае
всего за 4 операции умножения и 10 операций вычитания.
Основы компьютерной графики для программистов 19
____________________________________________________________________________________________________________________
function InTriS(x,y,AX,AY,BX,BY,CX,CY: Single): boolean;
var
Res1,Res2: Single;
ReI1: Integer absolute Res1;
ReI2: Integer absolute Res2;
begin
Res1:= (y-ay)*(cx-ax)-(x-ax)*(cy-ay);
Res2:= (y-cy)*(bx-cx)-(x-cx)*(by-cy);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false //дальше не вычисляем
else
begin
Res2:= (y-by)*(ax-bx)-(x-bx)*(ay-by);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false
else
Result:= true;
end;
end;//function InTriS
Версия функции InTri для входных параметров типа Double.
function InTriD(x,y,AX,AY,BX,BY,CX,CY: Double): boolean;
var
Res1,Res2: Double;
ReI1: Int64 absolute Res1;
ReI2: Int64 absolute Res2;
begin
Res1:= (y-ay)*(cx-ax)-(x-ax)*(cy-ay);
Res2:= (y-cy)*(bx-cx)-(x-cx)*(by-cy);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false //дальше не вычисляем
else
begin
Res2:= (y-by)*(ax-bx)-(x-bx)*(ay-by);
// if (Res1>0)and(Res2<0)or(Res1<0)and(Res2>0) then
if ReI1 XOR ReI2 < 0 then
Result:= false
else
Result:= true;
end;
end;//function InTriD
В результате, как можно видеть по тексту приведенных процедур, задача решается в
худшем случае за 6 операций умножения и 15 операций вычитания, а в лучшем случае
всего за 4 операции умножения и 10 операций вычитания.
http://www.ksu.ru/persons/9134.ru.html
Страницы
- « первая
- ‹ предыдущая
- …
- 17
- 18
- 19
- 20
- 21
- …
- следующая ›
- последняя »
