All pastes #386993 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-03-09 00:43 UTC
rendered paste body
/* Johannes Heinsoo EIO valikvoor 2007*/
#include <stdio.h>
#include <math.h>

#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;i<L6IKEPUNKTE;i++){
      if(l6ikepunkt[i].x==POLE_OLEMAS)break;
      keskmineX+=l6ikepunkt[i].x;
      keskmineY+=l6ikepunkt[i].y;
   }
   //jagame nurkade arvuga
   keskmineX=keskmineX/i;
   keskmineY=keskmineY/i;
   // Ja nihutame nullpunkti hulknurga aritmeetilisse keskmisesse
   if(DEBUG)printf("- INFO: Keskpunkti kordinaadid on (%lf;%lf)\n",keskmineX,keskmineY);
      for(i=0;i<L6IKEPUNKTE;i++){
      if(l6ikepunkt[i].x==POLE_OLEMAS)break;
      l6ikepunkt[i].x-=keskmineX;
      l6ikepunkt[i].y-=keskmineY;
   }
   
   //Vaatame igat hulknurga külge tõusu järgi alguspunkti ja arvtame pisikest kolmnurkade pindalad vektrorkorrutistega
   while(1){
      vK=SUUR*5;
      for(i=0;i<L6IKEPUNKTE;i++){
         if(l6ikepunkt[i].x==POLE_OLEMAS) continue;
         k=(atan2(l6ikepunkt[i].x,l6ikepunkt[i].y))*180/PI;
         if(k<0)k=360+k;
         if(DEBUG>1)printf("- PINDALA: K = %9.lf (%10.lf | %10.lf)",k ,l6ikepunkt[i].x, l6ikepunkt[i].y);
         if(((k<vK)&&(k>vvK))||((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&#262;ƒ&#256;µik
      if (vKi==vvKi) break;
      // Kui alles esimen
      if (vvKi==-1){vvK=vK; eKi=vvKi=vKi; continue;}
      // V&#262;ƒ&#256;µ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; i<L6IKEPUNKTE; i++){
      if(l6ikepunkt[i].x==POLE_OLEMAS)break;
      if((l6ikepunkt[i].x==a.x)&&(l6ikepunkt[i].y==a.y))return;
   }
   if (i==L6IKEPUNKTE) printf("- KRIITILINE VIGA: L6ikepunkte tuli rohkem kui %d\n", L6IKEPUNKTE);
   l6ikepunkt[i].x=a.x; 
   l6ikepunkt[i].y=a.y;
   if(DEBUG) printf("- INFO: Lisasin l6ikepunkti %d kordinaatidega %.1lf %.1lf\n", i, a.x, a.y);
   return;
}

void ristuvad(struct Spunkt a,struct Spunkt b, struct Spunkt c,struct Spunkt d){
   struct Spunkt varu;
   double adx, ady, cdx, cdy, ak, ck, ab, cb;
   adx=a.x-b.x;
   ady=a.y-b.y;
   cdx=c.x-d.x;
   cdy=c.y-d.y;
   if(adx) {ak=ady/adx; ab=-ak*a.x+a.y;} else {ak=POLE_OLEMAS;}
   if(cdx) {ck=cdy/cdx; cb=-ck*c.x+c.y;} else {ck=POLE_OLEMAS;}
   
   if ((ak==POLE_OLEMAS)&&(ck==POLE_OLEMAS)){
      return;
   }
   else if ((ak==POLE_OLEMAS)||(ck==POLE_OLEMAS)){
      if       (ak==POLE_OLEMAS) {varu.y=ck*a.x+cb; varu.x=a.x;}
      else if (ck==POLE_OLEMAS) {varu.y=ak*c.x+ab; varu.x=c.x;}
      if(((varu.x>c.x)&&(varu.x>d.x))||((varu.x<c.x)&&(varu.x<d.x))) return;
      if(((varu.x>a.x)&&(varu.x>b.x))||((varu.x<a.x)&&(varu.x<b.x))) return;
      if(((varu.y>c.y)&&(varu.y>d.y))||((varu.y<c.y)&&(varu.y<d.y))) return;
      if(((varu.y>a.y)&&(varu.y>b.y))||((varu.y<a.y)&&(varu.y<b.y))) return;
      lisaL6ikepunkt(varu);
      return;
   }
   else {
      if (ak==ck) return;
      varu.x=(ab-cb)/(ck-ak);
      if(((varu.x>c.x)&&(varu.x>d.x))||((varu.x<c.x)&&(varu.x<d.x))) return;
      if(((varu.x>a.x)&&(varu.x>b.x))||((varu.x<a.x)&&(varu.x<b.x))) return;
      varu.y=ck*varu.x+cb; 
      if(((varu.y>c.y)&&(varu.y>d.y))||((varu.y<c.y)&&(varu.y<d.y))) return;
      if(((varu.y>a.y)&&(varu.y>b.y))||((varu.y<a.y)&&(varu.y<b.y))) return;
      lisaL6ikepunkt(varu);
      return;
   }
}

void sees(struct Skolmnurk A,struct Spunkt a){
   if      ((vasakul(A.a,A.b,a)<=0) && (vasakul(A.b,A.c,a)<=0) && (vasakul(A.c,A.a,a)<=0)) lisaL6ikepunkt(a);
   else if ((vasakul(A.a,A.b,a)>=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<L6IKEPUNKTE; i++){
      l6ikepunkt[i].x=POLE_OLEMAS;
      l6ikepunkt[i].y=POLE_OLEMAS;
   }
    /*
   kolmnurk[0].a.x=3;
   kolmnurk[0].a.y=4;
   kolmnurk[0].b.x=5;
   kolmnurk[0].b.y=4;
   kolmnurk[0].c.x=3;
   kolmnurk[0].c.y=6;*/
   //printf("Pindala on %.3lf\n", pindala(&kolmnurk[0]));


   //Kas k&#262;ƒ&#256;¼ljed ristuvad
   if(DEBUG)printf("- SYSTEEM: ristuvad\n");
   ristuvad(kolmnurk[0].a,kolmnurk[0].b,kolmnurk[1].a,kolmnurk[1].b);
   ristuvad(kolmnurk[0].a,kolmnurk[0].b,kolmnurk[1].b,kolmnurk[1].c);
   ristuvad(kolmnurk[0].a,kolmnurk[0].b,kolmnurk[1].c,kolmnurk[1].a);

   ristuvad(kolmnurk[0].b,kolmnurk[0].c,kolmnurk[1].a,kolmnurk[1].b);
   ristuvad(kolmnurk[0].b,kolmnurk[0].c,kolmnurk[1].b,kolmnurk[1].c);
   ristuvad(kolmnurk[0].b,kolmnurk[0].c,kolmnurk[1].c,kolmnurk[1].a);

   ristuvad(kolmnurk[0].c,kolmnurk[0].a,kolmnurk[1].a,kolmnurk[1].b);
   ristuvad(kolmnurk[0].c,kolmnurk[0].a,kolmnurk[1].b,kolmnurk[1].c);
   ristuvad(kolmnurk[0].c,kolmnurk[0].a,kolmnurk[1].c,kolmnurk[1].a);

   //Kas m&#262;ƒ&#256;µni punkt on teise sees
   if(DEBUG)printf("- SYSTEEM: sees\n");
   sees(kolmnurk[0],kolmnurk[1].a);
   sees(kolmnurk[0],kolmnurk[1].b);
   sees(kolmnurk[0],kolmnurk[1].c);

   sees(kolmnurk[1],kolmnurk[0].a);
   sees(kolmnurk[1],kolmnurk[0].b);
   sees(kolmnurk[1],kolmnurk[0].c);

   fprintf(vf,"%lf", pindala());
   return(0);
}