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 1
#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=sin(1);
k=atan2(l6ikepunkt[i].y,l6ikepunkt[i].x);
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Ƶ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", vKi, vvKi);
pindala=pindala-VK(l6ikepunkt[vKi],l6ikepunkt[vvKi])/2;
if(DEBUG)printf("- PINDALA: Uus pindala on %.1lf\n", pindala);
vvK=vK; vvKi=vKi;
continue;
}
if(DEBUG)printf("- PINDALA: Vaatan viimaseid %d %d\n", eKi, vKi);
if(eKi!=-1)pindala=pindala-VK(l6ikepunkt[eKi],l6ikepunkt[vKi])/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ü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Ƶ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);
}