Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<math.h>
- #include<stdlib.h>
- struct Tacka{
- int x,y;
- };
- int jesu_jednaki(double broj1, double broj2, double eps){
- return (fabs(broj1-broj2)<=eps*(broj1+broj2));
- }
- struct Tacka transliraj(struct Tacka tacka, int deltaX, int deltaY){
- //printf("Tacka: (%d, %d)\n",tacka.x+deltaX,tacka.y+deltaY);
- return (struct Tacka){tacka.x+deltaX,tacka.y+deltaY};
- }
- int preklapanje_tacaka(struct Tacka A, struct Tacka B){
- return (A.x==B.x) && (A.y==B.y);
- }
- int skalarni_produkt(struct Tacka vec1, struct Tacka vec2){
- return vec1.x*vec2.x+vec1.y*vec2.y;
- }
- struct Tacka unos_tacke(){
- int x,y;
- scanf("%d%d",&x,&y);
- return (struct Tacka){x,y};
- }
- struct Cetverougao{
- struct Tacka A,B,C,D;
- };
- struct Cetverougao unos_cetverougla(){
- struct Cetverougao cet;
- int i;
- cet.A=unos_tacke();
- cet.B=unos_tacke();
- cet.C=unos_tacke();
- cet.D=unos_tacke();
- return cet;
- }
- double pitagora(struct Tacka A, struct Tacka B){
- return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
- }
- // U ovo funkciji AB || CD && AD || B||C, probat cemo translirati D u A, i C u B
- int redoslijed(struct Tacka A, struct Tacka B, struct Tacka C, struct Tacka D){
- int deltaX=A.x-D.x;
- int deltaY=A.y-D.y;
- int deltaX2=A.x-B.x;
- int deltaY2=A.y-B.y;
- 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));
- }
- int pravougaonik(struct Cetverougao cet){
- //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
- int tip1=redoslijed(cet.A,cet.B,cet.C,cet.D);
- //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
- int tip2=redoslijed(cet.A,cet.C,cet.B,cet.D);
- int tip3=redoslijed(cet.A,cet.B,cet.D,cet.C);
- int tip4=redoslijed(cet.A,cet.D,cet.B,cet.C);
- int tip5=redoslijed(cet.A,cet.D,cet.C,cet.B);
- int tip6=redoslijed(cet.A,cet.C,cet.D,cet.B);
- // printf("%d %d %d %d %d %d\n",tip1,tip2,tip3,tip4,tip5,tip6);
- return tip1 || tip2 || tip3 || tip4 || tip5 || tip6;
- }
- void ispisi_tacku(struct Tacka tacka){
- printf("(%d, %d) ",tacka.x,tacka.y);
- }
- int kvadrat(struct Cetverougao cet){
- double eps=0.000001;
- //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
- int tip1=redoslijed(cet.A,cet.B,cet.C,cet.D) && jesu_jednaki(pitagora(cet.A,cet.D),pitagora(cet.A,cet.B),eps);
- //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
- int tip2=redoslijed(cet.A,cet.C,cet.B,cet.D) && jesu_jednaki(pitagora(cet.A,cet.D),pitagora(cet.A,cet.C),eps);
- int tip3=redoslijed(cet.A,cet.B,cet.D,cet.C) && jesu_jednaki(pitagora(cet.A,cet.C),pitagora(cet.A,cet.B),eps);
- int tip4=redoslijed(cet.A,cet.D,cet.B,cet.C) && jesu_jednaki(pitagora(cet.A,cet.C),pitagora(cet.A,cet.D),eps);
- int tip5=redoslijed(cet.A,cet.D,cet.C,cet.B) && jesu_jednaki(pitagora(cet.A,cet.B),pitagora(cet.A,cet.D),eps);
- int tip6=redoslijed(cet.A,cet.C,cet.D,cet.B) && jesu_jednaki(pitagora(cet.A,cet.B),pitagora(cet.A,cet.C),eps);
- return tip1 || tip2 || tip3 || tip4 || tip5 ||tip6;
- }
- void sortiraj_tacka(struct Tacka *niz, int vel){
- struct Tacka koordinatni={0,0};
- int i,min;
- for(int i=0;i<vel;i++){
- double mini=pitagora(niz[i],koordinatni);
- min=i;
- int j=i;
- for(;j<vel;j++)
- if(mini>pitagora(niz[j],koordinatni)){
- mini=pitagora(niz[j],koordinatni);
- min=j;
- }
- struct Tacka pomoc=niz[i];
- niz[i]=niz[min];
- niz[min]=pomoc;
- }
- }
- double prava(struct Tacka pocetak, struct Tacka kraj, struct Tacka dot){
- int predznak=1;
- //Granicni slucaj nagib 90
- if(pocetak.x==kraj.x)
- return (dot.x-pocetak.x);
- if(((double)(pocetak.y-kraj.y)/(pocetak.x-kraj.x))<0)predznak=-1;
- return predznak*(dot.y-kraj.y-((double)(pocetak.y-kraj.y)/(pocetak.x-kraj.x))*(dot.x-kraj.x));
- }
- int jel_unutra(struct Tacka A, struct Tacka B,struct Tacka C, struct Tacka D, struct Tacka dot){
- //AB
- double pravaDonja=prava(A,B,dot);
- //DC
- double pravaGornja=prava(D,C,dot);
- //AD
- double pravaLijevo=prava(A,D,dot);
- //BC
- double pravaDesno=prava(B,C,dot);
- return (pravaDesno*pravaLijevo)<0 && (pravaDonja*pravaGornja)<0;
- }
- int provejeri_jel_unutra4ugla(struct Cetverougao cet, struct Tacka dot){
- //pravougaonik oblika A-B-C-D => AB=CD && CD==AB (A==trans(D) && B==trans(C))
- int tip1=jel_unutra(cet.A,cet.B,cet.C,cet.D,dot);
- //pravougaonik oblika A-C-B-D => (A==trans(C) && B==trans(D))
- int tip2=jel_unutra(cet.A,cet.C,cet.B,cet.D,dot);
- int tip3=jel_unutra(cet.A,cet.B,cet.D,cet.C,dot);
- int tip4=jel_unutra(cet.A,cet.D,cet.B,cet.C,dot);
- int tip5=jel_unutra(cet.A,cet.D,cet.C,cet.B,dot);
- int tip6=jel_unutra(cet.A,cet.C,cet.D,cet.B,dot);
- return tip1 || tip2 || tip3 || tip4 || tip5 || tip6;
- }
- int filtriraj_tacke(struct Tacka *niz, int vel, struct Cetverougao cet){
- int i,j;
- for(i=0;i<vel;i++)
- if(!provejeri_jel_unutra4ugla(cet,niz[i])){
- //int j=i;
- for(j=i;j<vel-1;j++)
- niz[j]=niz[j+1];
- vel--;
- i--;
- }
- return vel;
- }
- int main(){
- /* Provjera funkcija pravougaonik i kvadrat za (1,1)-(1,2)-(2,1)-(2,2)? */
- /* Iz geometrije: "Pravougaonik cije su sve stranice jednake naziva se kvadrat." */
- /* Niz tacaka (2,2) i (0,2) filtriramo po kvadratu
- (1,1)-(1,3)-(3,1)-(3,3) - treba ostati samo (2,2) */
- struct Cetverougao c;
- c.A.x=1;
- c.A.y=1;
- c.B.x=1;
- c.B.y=3;
- c.C.x=3;
- c.C.y=1;
- c.D.x=3;
- c.D.y=3;
- struct Tacka t1[2];
- t1[0].x=2; t1[0].y=2;
- t1[1].x=0; t1[1].y=2;
- int vel,i;
- vel = filtriraj_tacke(t1, 2, c);
- /* Ispis svih tacaka u nizu */
- for (i=0; i<vel; i++)
- printf("(%d,%d),", t1[i].x, t1[i].y);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement