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] |