BORUTO-121

geometry_problem

Feb 12th, 2022 (edited)
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.04 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. const double e=0.001;
  6. const int CAP=50;
  7.  
  8. struct Tacka{
  9.     double x,y;
  10. };
  11.  
  12. struct Kruznica{
  13.     struct Tacka centar;
  14.     double radijus;
  15. };
  16.  
  17. struct Pravougaonik{
  18.     struct Tacka dole_lijevo;
  19.     double sirina,visina;
  20. };
  21.  
  22. struct Trougao{
  23.     struct Tacka A,B,C;
  24. };
  25.  
  26. enum TipOblika{
  27.     TACKA,KRUZNICA,PRAVOUGAONIK,TROUGAO
  28. };
  29.  
  30. struct GenerickiOblici{
  31.     void* pok;
  32.     enum TipOblika oblik;
  33. };
  34. //Pomocne fije za provjeru da li je tacka unutar TipOblika
  35.  
  36. int tackaUpravougaoniku(struct Tacka t,struct Pravougaonik p){
  37.   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);
  38. }
  39. int tackaUkruznici(struct Tacka t, struct Kruznica k){
  40.   return fabs(t.x-k.centar.x)-k.radijus<=0 && fabs(t.y-k.centar.y)-k.radijus<=0;
  41. }
  42. int tackaUtrouglu(struct Tacka t, struct Trougao k);
  43.  
  44. int obuhvata(void* oblik1, enum TipOblika to1, void* oblik2, enum TipOblika to2);
  45. ///Oblik1 obuhvata oblik2
  46.  
  47. void unesiTacku(struct GenerickiOblici* dot){
  48.     dot->pok=(struct Tacka*)malloc(sizeof(struct Tacka));
  49.     printf("Unesite tacku: koordinate x,y: ");
  50.    scanf("%lf,%lf",&((struct Tacka*)(dot->pok))->x,&((struct Tacka*)(dot->pok))->y);
  51.    dot->oblik=TACKA;
  52. }
  53.  
  54. void unesiKruznicu(struct GenerickiOblici* dot){
  55.     dot->pok=(struct Kruznica*)malloc(sizeof(struct Kruznica));
  56.     printf("Unesite centar kruznice: koordinate x,y: ");
  57.     scanf("%lf,%lf",&((struct Kruznica*)(dot->pok))->centar.x,&((struct Kruznica*)(dot->pok))->centar.y);
  58.     printf("Unesite poluprecnik kruznice: ");
  59.     scanf("%lf",&((struct Kruznica*)(dot->pok))->radijus);
  60.     dot->oblik=KRUZNICA;
  61. }
  62.  
  63. void unesitePravougaonik(struct GenerickiOblici* dot){
  64.     dot->pok=(struct Pravougaonik*)malloc(sizeof(struct Pravougaonik));
  65.     printf("Unesite donji lijevi ugao: koordinate x,y: ");
  66.     scanf("%lf,%lf",&((struct Pravougaonik*)(dot->pok))->dole_lijevo.x,&((struct Pravougaonik*)(dot->pok))->dole_lijevo.y);
  67.     printf("Unesite sirinu: ");scanf("%lf",&((struct Pravougaonik*)(dot->pok))->sirina);
  68.     printf("Unesite visinu: ");scanf("%lf",&((struct Pravougaonik*)(dot->pok))->visina);
  69.     dot->oblik=PRAVOUGAONIK;
  70. }
  71.  
  72. void unesiTrougao(struct GenerickiOblici* dot){
  73.     dot->pok=(struct Trougao*)malloc(sizeof(struct Trougao));
  74.     printf("Unesite prvi vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->A.x,&((struct Trougao*)(dot->pok))->A.y);
  75.     printf("Unesite drugi vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->B.x,&((struct Trougao*)(dot->pok))->B.y);
  76.     printf("Unesite treci vrh: koordinate x,y: ");scanf("%lf,%lf",&((struct Trougao*)(dot->pok))->C.x,&((struct Trougao*)(dot->pok))->C.y);
  77.     dot->oblik=TROUGAO;
  78. }
  79.  
  80. typedef void (*funkcije)(struct GenerickiOblici*);
  81.  
  82. int main(){
  83.     funkcije unesi[4]={unesiTacku,unesiKruznicu,unesitePravougaonik,unesiTrougao};
  84.     struct GenerickiOblici niz[CAP];
  85.     int vel;
  86.     printf("Unesite broj oblika: ");scanf("%d",&vel);
  87.  
  88.     int i, tip;
  89.     for(i=0;i<vel;i++){
  90.         printf("Odaberite tip %d. oblika (1 - tacka, 2 - kruznica, 3 - pravougaonik, 4 - trougao): ",i+1);
  91.         scanf("%d",&tip);
  92.         if(tip==1) unesi[tip-1](&niz[i]);
  93.         else if(tip==2) unesi[tip-1](&niz[i]);
  94.         else if(tip==3) unesi[tip-1](&niz[i]);
  95.         else if(tip==4) unesi[tip-1](&niz[i]);
  96.         else{
  97.             printf("Nepoznat tip oblika %d!\n",tip);
  98.             i--;
  99.         }
  100.     }
  101.     /*for(i=0;i<vel;i++){
  102.       if(niz[i].oblik==TACKA)
  103.         printf("Tacka: %lf,%lf\n",((struct Tacka*)(niz[i].pok))->x,((struct Tacka*)(niz[i].pok))->y);
  104.       else if(niz[i].oblik==KRUZNICA)
  105.         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);
  106.       else if(niz[i].oblik==PRAVOUGAONIK)
  107.         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);
  108.  
  109.       else if(niz[i].oblik==TROUGAO)
  110.       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);
  111.     }*/
  112.  
  113.     //brisanje
  114.  
  115.     int j;
  116.  
  117.     for(i=0;i<vel;i++){
  118.       for(j=0;j<vel;j++){
  119.         if(i==j)continue;
  120.         if(obuhvata(niz[i].pok,niz[i].oblik,niz[j].pok,niz[j].oblik))
  121.         printf("Oblik %d obuhvata oblik %d.\n",i+1,j+1);
  122.       }
  123.     }
  124.  
  125.     for(i=0;i<vel;i++)
  126.       free(niz[i].pok);
  127.     return 0;
  128. }
  129.  
  130. int tackaUtrouglu(struct Tacka t, struct Trougao k){
  131.   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);
  132.  
  133.   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 &&
  134.          D*((k.A.x-k.C.x)*(t.y-k.C.y) - (k.A.y-k.C.y)*(t.x-k.C.x))>=0;
  135. }
  136.  
  137. int obuhvata(void* oblik1, enum TipOblika to1, void* oblik2, enum TipOblika to2){
  138.   //Dvije tacke
  139.   if(to1==TACKA && to2==TACKA) return ((struct Tacka*)oblik1)->x==((struct Tacka*)oblik2)->x && ((struct Tacka*)oblik1)->y==((struct Tacka*)oblik2)->y;
  140.   //Oblik1 je KRUZNICA
  141.   if(to1==KRUZNICA && to2==TACKA) return tackaUkruznici(*((struct Tacka*)oblik2),*((struct Kruznica*)oblik1));
  142.   if(to1==KRUZNICA && to2==KRUZNICA){
  143.     struct Tacka c1=((struct Kruznica*)oblik1)->centar,c2=((struct Kruznica*)oblik2)->centar;
  144.     double duz=sqrt((c1.x-c2.x)*(c1.x-c2.x)-(c1.y-c2.y)*(c1.y-c2.y));
  145.     return duz+((struct Kruznica*)oblik2)->radijus<=((struct Kruznica*)oblik1)->radijus;
  146.   }
  147.   if(to1==KRUZNICA && to2==PRAVOUGAONIK){
  148.     struct Tacka t1,t2,t3,t4;
  149.     t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
  150.     t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
  151.     t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
  152.     return tackaUkruznici(t1,*((struct Kruznica*)oblik1)) && tackaUkruznici(t2,*((struct Kruznica*)oblik1)) && tackaUkruznici(t3,*((struct Kruznica*)oblik1)) && tackaUkruznici(t4,*((struct Kruznica*)oblik1));
  153.   }
  154.   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));
  155.  
  156.   //Oblik1 je PRAVOUGAONIK
  157.   if(to1==PRAVOUGAONIK && to2==TACKA) return tackaUpravougaoniku(*((struct Tacka*)oblik2),*((struct Pravougaonik*)oblik2));
  158.   if(to1==PRAVOUGAONIK && to2==KRUZNICA){
  159.     double razY=((struct Kruznica*)oblik2)->centar.y-((struct Pravougaonik*)oblik1)->dole_lijevo.y;
  160.     double razS=((struct Kruznica*)oblik2)->centar.x-((struct Pravougaonik*)oblik1)->dole_lijevo.x;
  161.     return razY+((struct Kruznica*)oblik2)->radijus<=((struct Pravougaonik*)oblik1)->visina && razS+((struct Kruznica*)oblik2)->radijus<=((struct Pravougaonik*)oblik1)->sirina;
  162.   }
  163.   if(to1==PRAVOUGAONIK && to2==PRAVOUGAONIK){
  164.     struct Tacka t1,t2,t3,t4;
  165.     t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
  166.     t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
  167.     t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
  168.     return tackaUpravougaoniku(t1,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t2,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t3,*((struct Pravougaonik*)oblik2)) && tackaUpravougaoniku(t4,*((struct Pravougaonik*)oblik2));
  169.   }
  170.   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));
  171.  
  172.   //Oblik1 je TROUGAO
  173.   if(to1==TROUGAO && to2==TACKA) return tackaUtrouglu(*((struct Tacka*)oblik2),*((struct Trougao*)oblik1));
  174.   if(to1==TROUGAO && to2==KRUZNICA);
  175.   if(to1==TROUGAO && to2==PRAVOUGAONIK) {
  176.     struct Tacka t1,t2,t3,t4;
  177.     t1=((struct Pravougaonik*)oblik2)->dole_lijevo;t2=t1;t3=t1;t4=t1;
  178.     t2.x+=((struct Pravougaonik*)oblik2)->sirina; t3.y+=((struct Pravougaonik*)oblik2)->visina;
  179.     t4.x+=((struct Pravougaonik*)oblik2)->sirina; t4.y+=((struct Pravougaonik*)oblik2)->visina;
  180.     return tackaUtrouglu(t1,*((struct Trougao*)oblik1)) && tackaUtrouglu(t2,*((struct Trougao*)oblik1)) && tackaUtrouglu(t3,*((struct Trougao*)oblik1)) && tackaUtrouglu(t4,*((struct Trougao*)oblik1));
  181.     }
  182.   if(to1==TROUGAO && to2==TROUGAO)
  183.     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));
  184.  
  185.   return 0;
  186. }
  187.  
Add Comment
Please, Sign In to add comment