/* Johannes Heinsoo EIO valikvoor 2007*/ #include #include #define PI 3.14159265 #define POLE_OLEMAS 2001 #define L6IKEPUNKTE 20 #define SUUR 10000000 #define DEBUG 0 #define EPS 0.00001 #define NIHE 0; struct Spunkt{double x; double y;}; struct Skolmnurk{struct Spunkt a,b,c;}; struct Skolmnurk kolmnurk[2]; void stop(void); double pindala(); double VK(struct Spunkt a,struct Spunkt b); double ABS(double a); void lisaL6ikepunkt(struct Spunkt a); char vasakul(struct Spunkt a,struct Spunkt b, struct Spunkt c); double pindala(); struct Spunkt l6ikepunkt[L6IKEPUNKTE]; double VK(struct Spunkt a,struct Spunkt b){ return(a.x*b.y-a.y*b.x); } double ABS(double a){ if (a<0) return(-a); else return(a); } double pindala(){ double k; double vK=SUUR*5; double vvK=-1; int vKi=0; int eKi=-1,vvKi=-1; double pindala=0; double keskmineX=0, keskmineY=0; int i; // NULLPUNKT ARITMEETILISSE KESKMISESSE! //Leiame hulknurga kordinaatide summa for(i=0;i1)printf("- PINDALA: K = %9.lf (%10.lf | %10.lf)",k ,l6ikepunkt[i].x, l6ikepunkt[i].y); if(((kvvK))||((k==vK)&&(ABS(l6ikepunkt[vKi].x)>ABS(l6ikepunkt[i].x))&&((ABS(l6ikepunkt[vvKi].x)>ABS(l6ikepunkt[i].x))||ABS(l6ikepunkt[vvKi].y)>ABS(l6ikepunkt[i].y)))) { if(DEBUG>1)printf(" +\n"); vK=k; vKi=i; } else if(DEBUG>1)printf(" -\n"); } // Kui kõik if (vKi==vvKi) break; // Kui alles esimen if (vvKi==-1){vvK=vK; eKi=vvKi=vKi; continue;} // Võtame pindala if(DEBUG)printf("- PINDALA: Vaatan punkte kylge %d %d\n", vvKi, vKi); pindala=pindala-VK(l6ikepunkt[vvKi],l6ikepunkt[vKi])/2; if(DEBUG)printf("- PINDALA: Uus pindala on %.1lf\n", pindala); vvK=vK; vvKi=vKi; continue; } if(eKi!=-1){ if(DEBUG)printf("- PINDALA: Vaatan viimaseid %d %d\n", vKi, eKi); pindala=pindala-VK(l6ikepunkt[vKi],l6ikepunkt[eKi])/2; if(DEBUG)printf("- PINDALA: Uus pindala on %.1lf\n", pindala);} if(DEBUG&&pindala<0)printf(" ____________________________________ \n"); if(DEBUG&&pindala<0)printf("- HOIATUS: PINDALA ON NEGATIIVNE %.1lf \n", pindala); return(ABS(pindala)); } void lisaL6ikepunkt(struct Spunkt a){ int i; for(i=0; ic.x)&&(varu.x>d.x))||((varu.xa.x)&&(varu.x>b.x))||((varu.xc.y)&&(varu.y>d.y))||((varu.ya.y)&&(varu.y>b.y))||((varu.yc.x)&&(varu.x>d.x))||((varu.xa.x)&&(varu.x>b.x))||((varu.xc.y)&&(varu.y>d.y))||((varu.ya.y)&&(varu.y>b.y))||((varu.y=0) && (vasakul(A.b,A.c,a)>=0) && (vasakul(A.c,A.a,a)>=0)) lisaL6ikepunkt(a); if (DEBUG>1) printf("- SEES: Vaatame kas punkt (%.1lf,%.1lf) on kolmnurga sees.\n",a.x,a.y); return; } char vasakul(struct Spunkt a,struct Spunkt b, struct Spunkt c){ b.x=b.x-a.x; b.y=b.y-a.y; c.x=c.x-a.x; c.y=c.y-a.y; double varu=VK(b,c); if(DEBUG>1)printf("- SEES: varu=%lf (%lf | %lf) (%lf | %lf) (%lf | %lf)\n",varu, a.x, a.y, (b.x+a.x), (b.y+a.y), c.x+a.x, c.y+a.y); if (varu>0) varu= 1; else if (varu<0) varu=-1; else varu= 0; //else if printf(" %.1lf\n",varu); return(varu); } void stop(void){ fflush(stdin); if(DEBUG)getchar(); return; } int main(void){ int i; FILE *sf, *vf; sf=fopen("kk.sis","r"); vf=fopen("kk.val","w"); fscanf(sf, "%lf %lf\n",&kolmnurk[0].a.x, &kolmnurk[0].a.y); fscanf(sf, "%lf %lf\n",&kolmnurk[0].b.x, &kolmnurk[0].b.y); fscanf(sf, "%lf %lf\n",&kolmnurk[0].c.x, &kolmnurk[0].c.y); fscanf(sf, "%lf %lf\n",&kolmnurk[1].a.x, &kolmnurk[1].a.y); fscanf(sf, "%lf %lf\n",&kolmnurk[1].b.x, &kolmnurk[1].b.y); fscanf(sf, "%lf %lf\n",&kolmnurk[1].c.x, &kolmnurk[1].c.y); kolmnurk[0].a.x+=NIHE; kolmnurk[0].a.y+=NIHE; kolmnurk[0].b.x+=NIHE; kolmnurk[0].b.y+=NIHE; kolmnurk[0].c.x+=NIHE; kolmnurk[0].c.y+=NIHE; kolmnurk[1].a.x+=NIHE; kolmnurk[1].a.y+=NIHE; kolmnurk[1].b.x+=NIHE; kolmnurk[1].b.y+=NIHE; kolmnurk[1].c.x+=NIHE; kolmnurk[1].c.y+=NIHE; for(i=0; i