Advertisement
BORUTO-121

rectangleAndSquareTester

Sep 16th, 2021
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.69 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4.  
  5. struct Tacka{
  6.   int x,y;
  7. };
  8.  
  9. int jesu_jednaki(double broj1, double broj2, double eps){
  10.   return (fabs(broj1-broj2)<=eps*(broj1+broj2));
  11. }
  12.  
  13. struct Tacka transliraj(struct Tacka tacka, int deltaX, int deltaY){
  14.   //printf("Tacka: (%d, %d)\n",tacka.x+deltaX,tacka.y+deltaY);
  15.   return (struct Tacka){tacka.x+deltaX,tacka.y+deltaY};
  16. }
  17.  
  18. int preklapanje_tacaka(struct Tacka A, struct Tacka B){
  19.   return (A.x==B.x) && (A.y==B.y);
  20. }
  21.  
  22. int skalarni_produkt(struct Tacka vec1, struct Tacka vec2){
  23.   return vec1.x*vec2.x+vec1.y*vec2.y;
  24. }
  25.  
  26.  
  27. struct Tacka unos_tacke(){
  28.   int x,y;
  29.   scanf("%d%d",&x,&y);
  30.   return (struct Tacka){x,y};
  31. }
  32.  
  33. struct Cetverougao{
  34.   struct Tacka A,B,C,D;
  35. };
  36.  
  37. struct Cetverougao unos_cetverougla(){
  38.   struct Cetverougao cet;
  39.   int i;
  40.   cet.A=unos_tacke();
  41.   cet.B=unos_tacke();
  42.   cet.C=unos_tacke();
  43.   cet.D=unos_tacke();
  44.   return cet;
  45. }
  46.  
  47. double pitagora(struct Tacka A, struct Tacka B){
  48.   return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
  49. }
  50.  
  51.  
  52. // U ovo funkciji AB || CD && AD || B||C, probat cemo translirati D u A, i C u B
  53. int redoslijed(struct Tacka A, struct Tacka B, struct Tacka C, struct Tacka D){
  54.   int deltaX=A.x-D.x;
  55.   int deltaY=A.y-D.y;
  56.   int deltaX2=A.x-B.x;
  57.   int deltaY2=A.y-B.y;
  58.   return skalarni_produkt((struct Tacka){deltaX,deltaY},(struct Tacka){deltaX2,deltaY2})==0 && preklapanje_tacaka(A,transliraj(D,deltaX,deltaY)) && preklapanje_tacaka(B,transliraj(C,deltaX,deltaY));
  59. }
  60.  
  61. int pravougaonik(struct Cetverougao cet){
  62.   //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
  63.   int tip1=redoslijed(cet.A,cet.B,cet.C,cet.D);
  64.   //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
  65.   int tip2=redoslijed(cet.A,cet.C,cet.B,cet.D);
  66.   int tip3=redoslijed(cet.A,cet.B,cet.D,cet.C);
  67.   int tip4=redoslijed(cet.A,cet.D,cet.B,cet.C);
  68.   int tip5=redoslijed(cet.A,cet.D,cet.C,cet.B);
  69.   int tip6=redoslijed(cet.A,cet.C,cet.D,cet.B);
  70.  // printf("%d %d %d %d %d %d\n",tip1,tip2,tip3,tip4,tip5,tip6);
  71.   return tip1 || tip2 || tip3 || tip4 || tip5 || tip6;
  72. }
  73.  
  74. void ispisi_tacku(struct Tacka tacka){
  75.   printf("(%d, %d) ",tacka.x,tacka.y);
  76. }
  77.  
  78. int kvadrat(struct Cetverougao cet){
  79.   double eps=0.000001;
  80.   //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
  81.   int tip1=redoslijed(cet.A,cet.B,cet.C,cet.D) && jesu_jednaki(pitagora(cet.A,cet.D),pitagora(cet.A,cet.B),eps);
  82.   //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
  83.   int tip2=redoslijed(cet.A,cet.C,cet.B,cet.D) && jesu_jednaki(pitagora(cet.A,cet.D),pitagora(cet.A,cet.C),eps);
  84.   int tip3=redoslijed(cet.A,cet.B,cet.D,cet.C) && jesu_jednaki(pitagora(cet.A,cet.C),pitagora(cet.A,cet.B),eps);
  85.   int tip4=redoslijed(cet.A,cet.D,cet.B,cet.C) && jesu_jednaki(pitagora(cet.A,cet.C),pitagora(cet.A,cet.D),eps);
  86.   int tip5=redoslijed(cet.A,cet.D,cet.C,cet.B) && jesu_jednaki(pitagora(cet.A,cet.B),pitagora(cet.A,cet.D),eps);
  87.   int tip6=redoslijed(cet.A,cet.C,cet.D,cet.B) && jesu_jednaki(pitagora(cet.A,cet.B),pitagora(cet.A,cet.C),eps);
  88.  
  89.   return tip1 || tip2 || tip3 || tip4 || tip5 ||tip6;
  90. }
  91.  
  92. void sortiraj_tacka(struct Tacka *niz, int vel){
  93.   struct Tacka koordinatni={0,0};
  94.   int i,min;
  95.   for(int i=0;i<vel;i++){
  96.     double mini=pitagora(niz[i],koordinatni);
  97.     min=i;
  98.     int j=i;
  99.     for(;j<vel;j++)
  100.       if(mini>pitagora(niz[j],koordinatni)){
  101.         mini=pitagora(niz[j],koordinatni);
  102.         min=j;
  103.       }
  104.       struct Tacka pomoc=niz[i];
  105.       niz[i]=niz[min];
  106.       niz[min]=pomoc;
  107.   }
  108. }
  109.  
  110. double prava(struct Tacka pocetak, struct Tacka kraj, struct Tacka dot){
  111.   int predznak=1;
  112.   //Granicni slucaj nagib 90
  113.   if(pocetak.x==kraj.x)
  114.     return (dot.x-pocetak.x);
  115.  
  116.     if(((double)(pocetak.y-kraj.y)/(pocetak.x-kraj.x))<0)predznak=-1;
  117.  
  118.   return predznak*(dot.y-kraj.y-((double)(pocetak.y-kraj.y)/(pocetak.x-kraj.x))*(dot.x-kraj.x));
  119. }
  120.  
  121. int jel_unutra(struct Tacka A, struct Tacka B,struct Tacka C, struct Tacka D, struct Tacka dot){
  122.   //AB
  123.   double pravaDonja=prava(A,B,dot);
  124.   //DC
  125.   double pravaGornja=prava(D,C,dot);
  126.   //AD
  127.   double pravaLijevo=prava(A,D,dot);
  128.   //BC
  129.   double pravaDesno=prava(B,C,dot);
  130.   return (pravaDesno*pravaLijevo)<0 && (pravaDonja*pravaGornja)<0;
  131. }
  132.  
  133. int provejeri_jel_unutra4ugla(struct Cetverougao cet, struct Tacka dot){
  134.   //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
  135.   int tip1=jel_unutra(cet.A,cet.B,cet.C,cet.D,dot);
  136.   //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
  137.   int tip2=jel_unutra(cet.A,cet.C,cet.B,cet.D,dot);
  138.   int tip3=jel_unutra(cet.A,cet.B,cet.D,cet.C,dot);
  139.   int tip4=jel_unutra(cet.A,cet.D,cet.B,cet.C,dot);
  140.   int tip5=jel_unutra(cet.A,cet.D,cet.C,cet.B,dot);
  141.   int tip6=jel_unutra(cet.A,cet.C,cet.D,cet.B,dot);
  142.   return tip1 || tip2 || tip3 || tip4 || tip5 || tip6;
  143. }
  144.  
  145. int filtriraj_tacke(struct Tacka *niz, int vel, struct Cetverougao cet){
  146.   int i,j;
  147.   for(i=0;i<vel;i++)
  148.     if(!provejeri_jel_unutra4ugla(cet,niz[i])){
  149.       //int j=i;
  150.       for(j=i;j<vel-1;j++)
  151.         niz[j]=niz[j+1];
  152.       vel--;
  153.       i--;
  154.     }
  155.   return vel;
  156. }
  157.  
  158.  
  159. int main(){
  160.   /* Provjera funkcija pravougaonik i kvadrat za (1,1)-(1,2)-(2,1)-(2,2)? */
  161.   /* Iz geometrije: "Pravougaonik cije su sve stranice jednake naziva se kvadrat." */
  162.   /* Niz tacaka (2,2) i (0,2) filtriramo po kvadratu
  163.   (1,1)-(1,3)-(3,1)-(3,3) - treba ostati samo (2,2) */
  164.   struct Cetverougao c;
  165.   c.A.x=1;
  166.   c.A.y=1;
  167.   c.B.x=1;
  168.   c.B.y=3;
  169.   c.C.x=3;
  170.   c.C.y=1;
  171.   c.D.x=3;
  172.   c.D.y=3;
  173.   struct Tacka t1[2];
  174.   t1[0].x=2; t1[0].y=2;
  175.   t1[1].x=0; t1[1].y=2;
  176.   int vel,i;
  177.   vel = filtriraj_tacke(t1, 2, c);
  178.   /* Ispis svih tacaka u nizu */
  179.   for (i=0; i<vel; i++)
  180.   printf("(%d,%d),", t1[i].x, t1[i].y);
  181. }
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement