Вот пример программы для нахождения выпуклой оболочки. Используется векторное умножение, если кому интересно.
Код на Pascal Program tochky; uses crt,graph; const kil=20; type TKoord=array [1..2] of integer; TMaskoord=array [1..kil] of TKoord; var xy:TMaskoord; per,n,i,j,k:integer; driver,mode:integer; max,maxb:real; nmax1,nmax2,opukla:integer; vec1,vec2:TKoord; procedure liniya(n1,n2:integer); begin if ((xy[n1,2]<0) and (xy[n2,2]<0)) then line(xy[n1,1]+320,-xy[n1,2]+240,xy[n2,1]+320,-xy[n2,2]+240) {obudvi vid'emni} else begin if (xy[n1,2]<0) then line(xy[n1,1]+320,-xy[n1,2]+240,xy[n2,1]+320,240-xy[n2,2]) {persha vid'emna} else if (xy[n2,2]<0) then line(xy[n1,1]+320,240-xy[n1,2],xy[n2,1]+320,-xy[n2,2]+240) {druga vid'emna} else line(xy[n1,1]+320,240-xy[n1,2],xy[n2,1]+320,240-xy[n2,2]); end end; begin {VVODUMO KOORDYNATY TOCHOK*************************************************} textcolor(yellow); per:=0; i:=0; repeat i:=i+1; read(xy[i,1],xy[i,2]); write('Exit - ? '); readln(per); until per=1; n:=i; {v n kilkist tochok} driver:=detect; initgraph(driver,mode,'A:\'); {MALUEMO KOORDYNATNI OSI****************************************************} setcolor(red); line(320,0,320,480); line(0,240,640,240); line(320,0,310,10); line(320,0,330,10); line(310,10,330,10); line(640,240,630,230); line(640,240,630,250); line(630,230,630,250); setfillstyle(1,red); floodfill(319,9,red); floodfill(321,9,red); floodfill(631,239,red); floodfill(631,241,red); outtextxy(335,10,'Y'); outtextxy(620,220,'X'); {VYZNACHAEMO MAXUMALNU VIDSTAN************************************************} max:=0; for i:=1 to n do for j:=1 to n do begin maxb:=sqrt(sqr(xy[j,2]-xy[i,2])+sqr(xy[j,1]-xy[i,1])); if maxb>max then begin max:=maxb; nmax1:=i; nmax2:=j; end; end; {mogna korustuvatysia zminnumu per,nmax1,nmax2:integer; max,maxb:real} {BUDUEMO OPUKLU OBOLONKU******************************************************} {v n - kilkist tochok} setcolor(lightblue); setlinestyle(0,blue,1); k:=nmax1; for i:=1 to n do begin per:=0; if i=k then i:=i+1; if i=n+1 then break; vec1[1]:=xy[i,1]-xy[k,1]; vec1[2]:=xy[i,2]-xy[k,2]; for j:=1 to n do begin vec2[1]:=xy[j,1]-xy[i,1]; vec2[2]:=xy[j,2]-xy[i,2]; max:=vec1[1]*vec2[2]-vec1[2]*vec2[1]; if max<0 then begin per:=1; break; end;{if max<0} end; {cykl po j} if per=0 then begin {z'ednuemo i i k tochku} liniya(i,k); k:=i; opukla:=i; i:=1; if opukla=nmax1 then break; end;{umova perevirku per=0} end;{cykl po i} liniya(nmax1,opukla); {ziednuemo ostanni tochky} setcolor(white); setlinestyle(3,white,1); liniya(nmax1,nmax2); {maluemo naibilshu vidstan} for i:=1 to n do if xy[i,2]<0 then putpixel(xy[i,1]+320,-xy[i,2]+240,yellow) else putpixel(xy[i,1]+320,240-xy[i,2],yellow); {POBUDUVALY TOCHKY,OPUKLU OBOLONKU I NAIBILSHU VIDSTAN****************************} readln; end.
|