Listing ORIGAMI.PAS 



type punct=record x,y:Real    end; 
 const fisint='ORIGAMI.IN';    
 fisout='ORIGAMI.OUT'; 
 eps=0.2; 
 var linii:array[1..10,1..2]    of punct; 
 { linii de pliere } 
 nrlinii,nrpuncte:Integer; 
 { numar de puncte si numar    de linii date } 
 f,g:Text; 
 i:Integer; 
 b:punct; 
 
 function stanga(b,p1,p2:punct):Boolean;    
 var det:Real; 
 begin 
 det:=p1.x*(p2.y-b.y)+b.x*(p1.y-p2.y)    
 +p2.x*(b.y-p1.y); 
 stanga:=det>0 
 end; 
 
 procedure desface(var b:punct;    p1,p2:punct); 
 { il transforma pe b be    baza simetriei } 
 var intersect,rezultat:punct;    
 t:Real; 
 begin 
 t:=-((p2.x-p1.x)*(p1.x-b.x)+(p2.y-p1.y)*    
 (p1.y-b.y))/(Sqr(p2.x-p1.x)+Sqr(p2.y-p1.y));    
 intersect.x:=p1.x+(p2.x-p1.x)*t; 
 intersect.y:=p1.y+(p2.y-p1.y)*t; 
 rezultat.x:=2*intersect.x-b.x; 
 rezultat.y:=2*intersect.y-b.y; 
 b:=rezultat 
 end; 
 
 function calcul(b:punct; n:Integer):Integer;    
 var suma:Integer; 
 begin 
 if n=0 
 then 
 begin { hartia nu a fost pliata,    verificam } 
 { daca punctul se afla    in patrat } 
 if (b.x>0) and (b.x<100)    and (b.y>0) 
 and (b.y<100)    
 then calcul:=1 else calcul:=0    
 end 
 else 
 
begin 
{ hartia a fost pliata    cel putin o data } 
 if stanga(b,linii[n,1],linii[n,2])    
 then 
 begin 
 suma:=calcul(b,n-1); 
 desface(b,linii[n,1],linii[n,2]);    
 suma:=suma+calcul(b,n-1); 
 calcul:=suma 
 end 
 else calcul:=0 { punctul    b se afla in } 
 { partea dreapta a liniei    de pliere } 
 end 
 end; 
 
 procedure init; 
 var i,j:integer; 
 begin 
 Assign(f,fisint); Reset(f); 
 Assign(g,fisout); Rewrite(g); 
 Readln(f,nrlinii); 
 for i:=1 to nrlinii    do 
 begin 
 for j:=1 to 2 do    
 Read(f,linii[i,j].x,linii[i,j].y)    
 end; 
 Readln(f,nrpuncte) 
 end; 
 
 Begin 
 init; 
 for i:=1 to nrpuncte    do 
 begin 
 Readln(f,b.x,b.y); 
 Writeln(g,calcul(b,nrlinii)) 
 end; 
 Close(f); Close(g) 
 End. 

[cuprins]