Основы компьютерной графики для программистов. Казанцев А.В. - 19 стр.

UptoLike

Составители: 

Основы компьютерной графики для программистов 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