Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- const double e=0.001;
- const int CAP=50;
- struct Tacka{
- double x,y;
- };
- struct Kruznica{
- struct Tacka centar;
- double radijus;
- };
- struct Pravougaonik{
- struct Tacka dole_lijevo;
- double sirina,visina;
- };
- struct Trougao{
- struct Tacka A,B,C;
- };
- enum TipOblika{
- TACKA,KRUZNICA,PRAVOUGAONIK,TROUGAO
- };
- struct GenerickiOblici{
- void* pok;
- enum TipOblika oblik;
- };
- //Pomocne fije za provjeru da li je tacka unutar TipOblika
- int tackaUpravougaoniku(struct Tacka t,struct Pravougaonik p){
- return (t.x>=p.dole_lijevo.x && t.y>=p.dole_lijevo.y) && (t.x<=p.dole_lijevo.x+p.sirina && t.y<=p.dole_lijevo.y+p.visina);
- }
- int tackaUkruznici(struct Tacka t, struct Kruznica k){
- return fabs(t.x-k.centar.x)-k.radijus<=0 && fabs(t.y-k.centar.y)-k.radijus<=0;
- }
- int tackaUtrouglu(struct Tacka t, struct Trougao k);
- int obuhvata(void* oblik1, enum TipOblika to1, void* oblik2, enum TipOblika to2);
- ///Oblik1 obuhvata oblik2
- void unesiTacku(struct GenerickiOblici* dot){
- dot->pok=(struct Tacka*)malloc(sizeof(struct Tacka));
- printf("Unesite tacku: koordinate x,y: ");
- scanf("%lf,%lf",&((struct Tacka*)(dot->pok))->x,&((struct Tacka*)(dot->pok))->y);
- dot->oblik=TACKA;
- }
- void unesiKruznicu(struct GenerickiOblici* dot){
- dot->pok=(struct Kruznica*)malloc(sizeof(struct Kruznica));
- printf("Unesite centar kruznice: koordinate x,y: ");
- scanf("%lf,%lf",&((struct Kruznica*)(dot->pok))->centar.x,&((struct Kruznica*)(dot->pok))->centar.y);
- printf("Unesite poluprecnik kruznice: ");
- scanf("%lf",&((struct Kruznica*)(dot->pok))->radijus);
- dot->oblik=KRUZNICA;
- }
- void unesitePravougaonik(struct GenerickiOblici* dot){
- dot->pok=(struct Pravougaonik*)malloc(sizeof(struct Pravougaonik));
- printf("Unesite donji lijevi ugao: koordinate x,y: ");
- scanf("%lf,%lf",&((struct Pravougaonik*)(dot->pok))->dole_lijevo.x,&((struct Pravougaonik*)(dot->pok))->dole_lijevo.y);
- printf("Unesite sirinu: ");scanf("%lf",&((struct Pravougaonik*)(dot->pok))->sirina);
- printf("Unesite visinu: ");scanf("%lf",&((struct Pravougaonik*)(dot->pok))->visina);
- dot->oblik=PRAVOUGAONIK;
- }
- void unesiTrougao(struct GenerickiOblici* dot){
- dot->pok=(struct Trougao*)malloc(sizeof(struct Trougao));
- printf("Unesite prvi vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->A.x,&((struct Trougao*)(dot->pok))->A.y);
- printf("Unesite drugi vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->B.x,&((struct Trougao*)(dot->pok))->B.y);
- printf("Unesite treci vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->C.x,&((struct Trougao*)(dot->pok))->C.y);
- dot->oblik=TROUGAO;
- }
- typedef void (*funkcije)(struct GenerickiOblici*);
- int main(){
- funkcije unesi[4]={unesiTacku,unesiKruznicu,unesitePravougaonik,unesiTrougao};
- struct GenerickiOblici niz[CAP];
- int vel;
- printf("Unesite broj oblika: ");scanf("%d",&vel);
- int i, tip;
- for(i=0;i<vel;i++){
- printf("Odaberite tip %d. oblika (1 - tacka, 2 - kruznica, 3 - pravougaonik, 4 - trougao): ",i+1);
- scanf("%d",&tip);
- if(tip==1) unesi[tip-1](&niz[i]);
- else if(tip==2) unesi[tip-1](&niz[i]);
- else if(tip==3) unesi[tip-1](&niz[i]);
- else if(tip==4) unesi[tip-1](&niz[i]);
- else{
- printf("Nepoznat tip oblika %d!\n",tip);
- i--;
- }
- }
- /*for(i=0;i<vel;i++){
- if(niz[i].oblik==TACKA)
- printf("Tacka: %lf,%lf\n",((struct Tacka*)(niz[i].pok))->x,((struct Tacka*)(niz[i].pok))->y);
- else if(niz[i].oblik==KRUZNICA)
- printf("Centar je (%lf,%lf), a radiju %lf\n",((struct Kruznica*)(niz[i].pok))->centar.x,((struct Kruznica*)(niz[i].pok))->centar.y,((struct Kruznica*)(niz[i].pok))->radijus);
- else if(niz[i].oblik==PRAVOUGAONIK)
- printf("Donji lijevi ugao je (%lf,%lf), a sirina je %lf, a visina je %lf\n",((struct Pravougaonik*)(niz[i].pok))->dole_lijevo.x,((struct Pravougaonik*)(niz[i].pok))->dole_lijevo.y,((struct Pravougaonik*)(niz[i].pok))->sirina,((struct Pravougaonik*)(niz[i].pok))->visina);
- else if(niz[i].oblik==TROUGAO)
- printf("A(%lf,%lf), B(%lf,%lf), C(%lf,%lf)\n",((struct Trougao*)(niz[i].pok))->A.x,((struct Trougao*)(niz[i].pok))->A.y,((struct Trougao*)(niz[i].pok))->B.x,((struct Trougao*)(niz[i].pok))->B.y,((struct Trougao*)(niz[i].pok))->C.x,((struct Trougao*)(niz[i].pok))->C.y);
- }*/
- //brisanje
- int j;
- for(i=0;i<vel;i++){
- for(j=0;j<vel;j++){
- if(i==j)continue;
- if(obuhvata(niz[i].pok,niz[i].oblik,niz[j].pok,niz[j].oblik))
- printf("Oblik %d obuhvata oblik %d.\n",i+1,j+1);
- }
- }
- for(i=0;i<vel;i++)
- free(niz[i].pok);
- return 0;
- }
- int tackaUtrouglu(struct Tacka t, struct Trougao k){
- double D=(k.B.x-k.A.x)*(k.C.y-k.A.y) - (k.B.y-k.A.y)*(k.C.x-k.A.x);
- return D*((k.B.x-k.A.x)*(t.y-k.A.y) - (k.B.y-k.A.y)*(t.x-k.A.x))>=0 && D*((k.C.x-k.B.x)*(t.y-k.B.y) - (k.C.y-k.B.y)*(t.x-k.B.x))>=0 &&
- D*((k.A.x-k.C.x)*(t.y-k.C.y) - (k.A.y-k.C.y)*(t.x-k.C.x))>=0;
- }
- int obuhvata(void* oblik1, enum TipOblika to1, void* oblik2, enum TipOblika to2){
- //Dvije tacke
- if(to1==TACKA && to2==TACKA) return ((struct Tacka*)oblik1)->x==((struct Tacka*)oblik2)->x && ((struct Tacka*)oblik1)->y==((struct Tacka*)oblik2)->y;
- //Oblik1 je KRUZNICA
- if(to1==KRUZNICA && to2==TACKA) return tackaUkruznici(*((struct Tacka*)oblik2),*((struct Kruznica*)oblik1));
- if(to1==KRUZNICA && to2==KRUZNICA){
- struct Tacka c1=((struct Kruznica*)oblik1)->centar,c2=((struct Kruznica*)oblik2)->centar;
- double duz=sqrt((c1.x-c2.x)*(c1.x-c2.x)-(c1.y-c2.y)*(c1.y-c2.y));
- return duz+((struct Kruznica*)oblik2)->radijus<=((struct Kruznica*)oblik1)->radijus;
- }
- if(to1==KRUZNICA && to2==PRAVOUGAONIK){
- struct Tacka t1,t2,t3,t4;
- t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
- t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
- t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
- return tackaUkruznici(t1,*((struct Kruznica*)oblik1)) && tackaUkruznici(t2,*((struct Kruznica*)oblik1)) && tackaUkruznici(t3,*((struct Kruznica*)oblik1)) && tackaUkruznici(t4,*((struct Kruznica*)oblik1));
- }
- if(to1==KRUZNICA && to2==TROUGAO)return tackaUkruznici(((struct Trougao*)oblik2)->A,*((struct Kruznica*)oblik1)) && tackaUkruznici(((struct Trougao*)oblik2)->B,*((struct Kruznica*)oblik1)) && tackaUkruznici(((struct Trougao*)oblik2)->C,*((struct Kruznica*)oblik1));
- //Oblik1 je PRAVOUGAONIK
- if(to1==PRAVOUGAONIK && to2==TACKA) return tackaUpravougaoniku(*((struct Tacka*)oblik2),*((struct Pravougaonik*)oblik2));
- if(to1==PRAVOUGAONIK && to2==KRUZNICA){
- double razY=((struct Kruznica*)oblik2)->centar.y-((struct Pravougaonik*)oblik1)->dole_lijevo.y;
- double razS=((struct Kruznica*)oblik2)->centar.x-((struct Pravougaonik*)oblik1)->dole_lijevo.x;
- return razY+((struct Kruznica*)oblik2)->radijus<=((struct Pravougaonik*)oblik1)->visina && razS+((struct Kruznica*)oblik2)->radijus<=((struct Pravougaonik*)oblik1)->sirina;
- }
- if(to1==PRAVOUGAONIK && to2==PRAVOUGAONIK){
- struct Tacka t1,t2,t3,t4;
- t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
- t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
- t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
- return tackaUpravougaoniku(t1,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t2,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t3,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t4,*((struct Pravougaonik*)oblik2));
- }
- if(to1==PRAVOUGAONIK && to2==TROUGAO) return tackaUpravougaoniku(((struct Trougao*)oblik2)->A,*((struct Pravougaonik*)oblik1)) && tackaUpravougaoniku(((struct Trougao*)oblik2)->B,*((struct Pravougaonik*)oblik1)) && tackaUpravougaoniku(((struct Trougao*)oblik2)->C,*((struct Pravougaonik*)oblik1));
- //Oblik1 je TROUGAO
- if(to1==TROUGAO && to2==TACKA) return tackaUtrouglu(*((struct Tacka*)oblik2),*((struct Trougao*)oblik1));
- if(to1==TROUGAO && to2==KRUZNICA);
- if(to1==TROUGAO && to2==PRAVOUGAONIK) {
- struct Tacka t1,t2,t3,t4;
- t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
- t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
- t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
- return tackaUtrouglu(t1,*((struct Trougao*)oblik1)) && tackaUtrouglu(t2,*((struct Trougao*)oblik1)) && tackaUtrouglu(t3,*((struct Trougao*)oblik1)) && tackaUtrouglu(t4,*((struct Trougao*)oblik1));
- }
- if(to1==TROUGAO && to2==TROUGAO)
- return tackaUtrouglu(((struct Trougao*)oblik2)->A,*((struct Trougao*)oblik1)) && tackaUtrouglu(((struct Trougao*)oblik2)->B,*((struct Trougao*)oblik1)) && tackaUtrouglu(((struct Trougao*)oblik2)->C,*((struct Trougao*)oblik1));
- return 0;
- }
Add Comment
Please, Sign In to add comment