Version bumped to 1.0.0 for the initial release.
[wllib.git] / mop451.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <math.h>
5 #include <errno.h>
6 #include "wllib.h"
7
8 #ifdef FOR_X11
9 #include "mop451.xpm" /* Ikona pro X Window System$^{\def\fntmag{\magstep.2}\rm TM}$ */
10 #endif
11
12 struct {
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í */
16
17 void drawgfx(void)
18 { /* vykresli gfx */
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 */
21 }
22
23 int main(int argc,char **argv)
24 {
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ê. */
37                         }
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 */
41 #undef A
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 */
44                         }
45                 }
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 */
50 }