9 #include "mop451.xpm" /* Ikona pro X Window System$^{\def\fntmag{\magstep.2}\rm TM}$ */
13 long x,y; /* Souêadnice v~gfx */
14 } *ar; /* Pole vîech bodû */
15 unsigned N,p; /* $N$, souçasný bod pêi kreslení */
19 for (p=0;p<=N;p++) /* pro vîechny body dokola (první 2-krát) */
20 wl_line(ar[p==N?0:p].x,ar[p==N?0:p].y); /* spoj çáru */
23 int main(int argc,char **argv)
25 int i,j,rot=0,nkvx=0; /* pomocné, pomocné, smër uhýbání, není konvexní */
26 long x,y; /* pro naçítání (zdrojové souê.) */
27 float k=sin((float)60);
28 wl_init(&argc,argv,"MOP451"); /* inicializuj gfx */
29 if (scanf("%u",&N)!=1) iofailn(EINVAL); /* naçti $N$ */
30 if (N<3) iofailn(EINVAL); /* chceme mnohoúhelník */
31 if (!(ar=malloc(N*sizeof(*ar)))) iofail(); /* pole bodû */
32 for (i=0;i<N+1;i++) { /* na konci otestujeme jeîtë první body */
33 if (i<N) { /* jsme-li jeîtë v~naçítání */
34 if (scanf("%ld %ld",&x,&y)!=2) iofailn(EINVAL);
35 x<<=4; y<<=4; /* pro zvëtîení pêesnosti vykreslování */
36 ar[i].x=x+y/2; ar[i].y=rint(k*y); /* pêeveð na pravoúhlé souê. */
38 #define A(q) ar[(q)>=N?(q)-N:(q)] /* pole se zrcadlem */
39 if (i>=2&&!nkvx) if ((j=(A(i-1).x-A(i-2).x)*(A(i).y-A(i-2).y)
40 -(A(i-1).y-A(i-2).y)*(A(i).x-A(i-2).x))) { /* do \var j dej zatoçení souç. bodu */
42 if (rot) nkvx|=j!=rot; /* víme-li jiù, kam zatáçíme, otestuj konvexnost */
43 else rot=j; /* nyní jiù víme, kam zatáçíme */
46 if (!rot) iofailn(EINVAL); /* vîechny body náleùely pêímce */
47 printf("Zadaný %u-úhelník %s konvexní.\n",N,nkvx?"není":"je");
48 wl_done(); /* gfx okno */
49 return(nkvx); /* hotovo */