const MaxN = 1000; Nekonecno = 1E10; {"nekonečné" t u průsečíku - prostě nenalezen} type Vektor = record X,Y:real; end; var Kanon:array[1..2] of Vektor; Vrcholy:array[0..MaxN] of Vektor; Vrcholu:integer; PozadovanyObsah:real; Spojnice:Vektor; Normala:Vektor; C:real; {poslední parametr k popisu přímky spojující kanóny} t:real; {t průsečíku} i:integer; {index ...} NejlepsiNalezenyObsah,SoucasnyObsah:real; VhodnyVrchol:integer; {vrchol, který zatím dosáhl nejpřesnějšího obsahu} function SkalarniSoucin(V1,V2:Vektor):real; begin SkalarniSoucin:=V1.X*V2.X+V1.Y*V2.Y; end; function Prusecik(P,Q:Vektor;Normala:Vektor;c:real):real; {spočtě t průsečíku úsečky spojující body P a Q s přímkou určenou normálou a c} var Jmenovatel:real; SmerovyVektor:Vektor; begin SmerovyVektor.X:=Q.X-P.X; SmerovyVektor.Y:=Q.Y-P.Y; Jmenovatel:=SkalarniSoucin(SmerovyVektor,Normala); if Jmenovatel=0 then Prusecik:=Nekonecno {rovnoběžky - nezajímavé} else Prusecik:=-(c+SkalarniSoucin(P,Normala))/Jmenovatel; end; procedure NactiVstup; var i:integer; begin readln(Kanon[1].X,Kanon[1].Y); readln(Kanon[2].X,Kanon[2].Y); readln(PozadovanyObsah); if PozadovanyObsah<0 then PozadovanyObsah:=0; {záporný obsah by dělal dále potíže} readln(Vrcholu); for i:=1 to Vrcholu do readln(Vrcholy[i].x,Vrcholy[i].Y); Vrcholy[0]:=Vrcholy[Vrcholu]; {speciální příapad úsečky spojující první a poslední vrchol} end; begin NactiVstup; Spojnice.X:=Kanon[2].X-Kanon[1].X; Spojnice.Y:=Kanon[2].Y-Kanon[1].Y; Normala.X :=-Spojnice.Y; Normala.Y :=+Spojnice.X; C:=-SkalarniSoucin(Kanon[1],Normala); for i:=1 to Vrcholu do begin t:=Prusecik(Vrcholy[i],Vrcholy[i-1],Normala,C+2*PozadovanyObsah); {průsečík s rovnoběžkou} if (t>=0) and (t<=1) then begin {průsečík existuje} writeln(Vrcholy[i].X*(1-t)+Vrcholy[i-1].X*t,',',Vrcholy[i].Y*(1-t)+Vrcholy[i-1].Y*t); exit; end; t:=Prusecik(Vrcholy[i],Vrcholy[i-1],Normala,C-2*PozadovanyObsah); {průsečík s rovnoběžkou} if (t>=0) and (t<=1) then begin {průsečík existuje} writeln(Vrcholy[i].X*(1-t)+Vrcholy[i-1].X*t,',',Vrcholy[i].Y*(1-t)+Vrcholy[i-1].Y*t); exit; end; end; {žádný průsečík nenalezen, projdeme tedy vrcholy znovu} NejlepsiNalezenyObsah:=abs(SkalarniSoucin(Vrcholy[1],Normala)+C)/2; VhodnyVrchol:=1; for i:=2 to Vrcholu do begin SoucasnyObsah:=abs(SkalarniSoucin(Vrcholy[i],Normala)+C)/2; if abs(SoucasnyObsah-PozadovanyObsah)