#include #include #include #include #define PI 3.14159 #include class PUNCT { public: double x ,y; PUNCT(double xx, double yy) { x=xx; y=yy; } PUNCT() { x=0; y=0; } int operator ==(PUNCT a) { if ((x==a.x)&&(y==a.y)) return 1; return 0; } friend ostream& operator <<(ostream &, PUNCT); friend istream& operator >>(istream &, PUNCT &); }; ostream& operator <<(ostream & iesire, PUNCT p) { iesire<<"\nOx= "<>(istream & intrare, PUNCT &p) { cout<<"\nOx= "; intrare>>p.x; cout<<"\nOy= "; intrare>>p.y; return intrare; } class FIG_GEOM { public: int n; PUNCT p[100]; FIG_GEOM(int nr, PUNCT pp[100]) { int i; n=nr; for(i=0;it.x) t.x=p[i].x; } for(i=1;i<=n-1;i++) { if(p[i].y>t.y) t.y=p[i].y; } drept=new Dreptunghi(z,t); return drept; } int In_Triunghi(PUNCT a, PUNCT b, PUNCT c, PUNCT d) { if ((Aria(a,b,c)<=Aria(a,b,d)+Aria(a,d,c)+Aria(b,d,c)+0.2)&& (Aria(a,b,c)>=Aria(a,b,d)+Aria(a,d,c)+Aria(b,d,c)-0.2)) return 1; else return 0; } int FIG_GEOM::Apartine(PUNCT a) { for(int i=0;i=a.x)&&(c.x<=b.x)&&(c.y>=a.y)&&(c.y<=b.y)) vb=1; if((m==0)&&(c.x<=a.x)&&(c.x>=b.x)&&(c.y<=a.y)&&(c.y>=b.y)) vb=1; return vb; } //vede si daca ambele puncte sunt comune,sau numai unul este PUNCT ** Punct_Comun(PUNCT a,PUNCT b,PUNCT c,PUNCT d) { int vb=0; PUNCT **rez=new PUNCT*[2]; PUNCT *rez1=new PUNCT; PUNCT *rez2=new PUNCT; if(Pe_Dreapta(a,b,c)) { *rez1=c; vb=1; } if(Pe_Dreapta(a,b,d)) { *rez2=d; vb=1; } if(Pe_Dreapta(c,d,a)) { *rez1=a; vb=1; } if(Pe_Dreapta(c,d,b)) { *rez2=b; vb=1; } if((vb==0)&&(a.x==b.x)&&(c.x==d.x)) { delete rez1; delete rez2; *rez=NULL; return rez; } if((vb==0)&&(a.x!=b.x)&&(c.x!=d.x)) //daca nu sunt perpend. pe Ox { double pc; double m=(b.y-a.y)/(b.x-a.x); double n=(c.y-d.y)/(c.x-d.x); if(m!=n) { //din eq dreptei y-y1=m*(x-x1) pc=(m*a.x+a.y-n*c.x+c.y)/(m-n);//x-ul pc de intersectie //trebuie sa fie intre cele doua puncte if(((pc>a.x)&&(pcb.x))) { rez1->x=pc; rez1->y=a.y+m*(rez1->x-a.x); if (rez2) delete rez2; rez[0]=rez2; rez[1]=NULL; return rez;; } } else { delete rez1; delete rez2; rez[0]=rez[1]=NULL;; return rez;; } } if((a.x==b.x)&&(c.x!=d.x)&&(((c.xa.x))||((c.x>a.x)&&(d.xa.y)&&(c.yb.y)&&(c.yx=a.x; rez1->y=c.y+(d.y-c.y)*(rez1->x-c.x)/(d.x-c.x); delete rez2; rez[0]=rez1; rez[1]=NULL; return rez;; } if((c.x==d.x)&&(a.x!=b.x)&&(((a.xc.x))||((a.x>c.x)&&(b.xd.y)&&(c.y>a.y)))) { rez1->x=c.x; rez1->y=a.y+(b.y-a.y)*(rez1->x-a.x)/(b.x-a.x); delete rez2; rez[0]=rez1; rez[1]=NULL; return rez; } rez[1]=rez[0]=NULL; return rez; } PUNCT ** FIG_GEOM::Intersect(PUNCT a,PUNCT b) { PUNCT **rez1=new PUNCT*[2]; PUNCT **rez2=new PUNCT*[2]; for(int i=0;ix; figura3.p[figura3.n].y=pintersect1[0]->y; figura3.n++; if (pintersect1[1]!=NULL) { figura3.p[figura3.n].x=pintersect1[1]->x; figura3.p[figura3.n].y=pintersect1[1]->y; figura3.n++; } } } // ultimul punct daca apartine if (figura2.Apartine(p[n-1])) { figura3.p[figura3.n]=p[n-1]; figura3.n++; } //ulitma latura daca se intersecteaza pintersect1=figura2.Intersect(p[n-1], p[0]); if (pintersect1[0]) { figura3.p[figura3.n].x=pintersect1[0]->x; figura3.p[figura3.n].y=pintersect1[0]->y; figura3.n++; if (pintersect1[1]!=NULL) { figura3.p[figura3.n].x=pintersect1[1]->x; figura3.p[figura3.n].y=pintersect1[1]->y; figura3.n++; } } // cautam daca fig2 inclus in fig1, numai cu varfuri for (i=0;i>opt; while(opt!=0) { switch(opt) { case 1: { meniu_una(); int ales; cout<<"\nIntroduceti operatia pentru o figura:"; cin>>ales; while(ales!=0) { switch(ales) { case 1: { system("cls"); cout<<"\nOperatii pe fig. oarecare"; cout<<"\nDati nr de puncte al figurii: "; cin>>nrp; while(nrp<3) { cout<<"\nFigura trebuie sa aiba cel putin 3 puncte"; cout<<"\nReintroduceti numarul de puncte: "; cin>>nrp; } cout<<"\nCoordonatele punctelor:"; for(int i=0;i>pp[i]; } FIG_GEOM *fig=new FIG_GEOM(nrp,pp); FIG_GEOM *Aflare_dreptunghi=new FIG_GEOM(4); Aflare_dreptunghi=fig->Aflare_dreptunghi(); cout<<"\nIncadrare in dreptunghiul:"<p[0]<p[2]; cout<<"\nAria: "<Aria(); cout<<"\nPerimetrul: "<Perimetru(); cout<<"\n"; meniu_una(); break; } case 2: { system("cls"); cout<<"\nOperatii pe cerc"; cout<<"\nSe dau 2 puncte -> paralela cu Ox"; cout<<"\nEle reprezinta diametrul"; cout<<"\nDati punctele"; vb=0; while(vb==0) { cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; if(a.y==b.y) vb=1; else cout<<"\nReintroduceti(nu e o dreapta paralela):"; } Cerc *cerc=new Cerc(a,b); cout<<"\nLungimea cercului(perimetrul) este:"<Lungime_Cerc(); cout<<"\nAria este:"<Aria(); FIG_GEOM *Aflare_dreptunghi=new FIG_GEOM(4); Aflare_dreptunghi=cerc->Aflare_dreptunghi(); cout<<"\nIncadrare in patratul:"<p[0]<p[2]; Dreptunghi dr2=(Dreptunghi)(*cerc); cout<<"\nAria acestui patrat:"<>a; cout<<"\nPentru al doilea punct:"; cin>>b; Dreptunghi *dreptunghi=new Dreptunghi(a,b); cout<<"\nPerimetrul:"<Perimetru(); cout<<"\nAria:"<Aria(); meniu_una(); break; } case 4: { system("cls"); cout<<"\nOperatii pe triunghi"; cout<<"\nSe introduc cele 3 puncte"; cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; cout<<"\nPentru al treilea punct:"; cin>>c; Triunghi *triunghi=new Triunghi(a,b,c); cout<<"\nPerimetrul:"<Perimetru(); cout<<"\nAria:"<Aria(); FIG_GEOM *Aflare_dreptunghi=new FIG_GEOM(4); FIG_GEOM *test=new FIG_GEOM(3); test=triunghi; Aflare_dreptunghi=test->Aflare_dreptunghi(); cout<<"\nIncadrare in dreptunghiul:"<p[0]<p[2]; meniu_una(); break; } case 5: { system("cls"); cout<<"\nOperatii pe trapez"; cout<<"\nSe introduc dreptele paralele cu Ox"; cout<<"\nPrima dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>a; cout<<"\nAl doilea punct:"; cin>>b; if(a.y!=b.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(a.y==b.y) vb=1; } cout<<"\nA doua dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>c; cout<<"\nAl doilea punct:"; cin>>d; if(c.y!=d.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(c.y==d.y) vb=1; } Trapez *trapez=new Trapez(a,b,c,d); cout<<"\nPerimetrul este "<Perimetru(); cout<<"\nAria este "<Aria(); FIG_GEOM *Aflare_dreptunghi=new FIG_GEOM(4); Aflare_dreptunghi=trapez->Aflare_dreptunghi(); cout<<"\nIncadrare in dreptunghiul:"<p[0]<p[2]; meniu_una(); break; } case 6: { system("cls"); cout<<"Adaugare punct la o figura"; cout<<"\nDati nr de puncte al figurii: "; cin>>nrp; while(nrp<3) { cout<<"\nFigura trebuie sa aiba cel putin 3 puncte"; cout<<"\nReintroduceti numarul de puncte: "; cin>>nrp; } cout<<"\nCoordonatele punctelor:"; for(int i=0;i>pp[i]; } FIG_GEOM *fig=new FIG_GEOM(nrp,pp); cout<<"\nAria: "<Aria(); cout<<"\nPerimetrul: "<Perimetru(); cout<<"\n"; cout<<"\nPunctele din care a fost alcatuita figura au fost:"; for(i=0;i>a; while(fig->Apartine(a)) { cout<<"\nPoligon concav!\nReintroduceti:"; cin>>a; } FIG_GEOM *fig1=(a+*fig); cout<<"\nAcum figura are punctele: "; for(i=0;i<(*fig1).n;i++) { cout<<"\nPunctul "<Aria(); cout<<"\nNoul Perimetru: "<Perimetru(); meniu_una(); break; } case 7: { system("cls"); cout<<"\nDati nr de puncte al figurii: "; cin>>nrp; while(nrp<4) { cout<<"\nFigura trebuie sa aiba cel putin 4 puncte pentru "; cout<<"\na putea elimina unul din ele."; cout<<"\nReintroduceti numarul de puncte: "; cin>>nrp; } cout<<"\nCoordonatele punctelor:"; for(int i=0;i>pp[i]; } FIG_GEOM *fig=new FIG_GEOM(nrp,pp); cout<<"\nAria: "<Aria(); cout<<"\nPerimetrul: "<Perimetru(); cout<<"\nEliminare punct din figura"; cout<<"\nVa fi eliminat ultimul punct"; FIG_GEOM *fig1=-(*fig); cout<<"\nAcum figura are punctele: "; for(i=0;iAria(); cout<<"\nNoul perimetru: "<Perimetru(); meniu_una(); break; } default:{cout<<"\nReintroduceti:";break;} } cout<<"\nIntroduceti operatia pentru o figura:"; cin>>ales; } break; } case 2: { system("cls"); meniu_doua(); int ales; cout<<"\n\n Introduceti optiunea pentru doua figuri:"; cin>>ales; if((ales==0)||(ales>4)) break; while(ales!=0) { switch(ales) { case 1: { system("cls"); cout<<"\nCoordonatele primului dreptunghi "; cout<<"\nSe dau punctele de pe diagonala dreptunghiului"; cout<<"\nDati punctele"; cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; Dreptunghi *dreptunghi1=new Dreptunghi(a,b); cout<<"\nCoordonatele celui de al doilea dreptunghi "; cout<<"\nSe dau punctele de pe diagonala dreptunghiului"; cout<<"\nDati punctele"; cout<<"\nPentru primul punct:"; cin>>c; cout<<"\nPentru al doilea punct:"; cin>>d; Dreptunghi *dreptunghi2=new Dreptunghi(c,d); rez=*dreptunghi1&*dreptunghi2; cout<<"\nSuprafata comuna: "<Aria()+dreptunghi2->Aria()-rez; cout<<"\nFigura 1 fara figura 2: "<Aria()-rez; meniu_doua(); break; } case 2: { system("cls"); cout<<"\nCoordonatele dreptunghiului "; cout<<"\nSe dau punctele de pe diagonala dreptunghiului"; cout<<"\nDati punctele"; cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; Dreptunghi *dreptunghi=new Dreptunghi(a,b); cout<<"\nCoordonatele triunghiului "; cout<<"\nDati primul punct:"; cin>>c; cout<<"\nAl doilea punct:"; cin>>d; cout<<"Al treilea punct:"; cin>>e; Triunghi *triunghi=new Triunghi(c,d,e); rez=*dreptunghi&*triunghi; cout<<"\nSuprafata comuna: "<Aria()+triunghi->Aria()-rez; cout<<"\nFigura 1 fara figura 2: "<Aria()-rez; meniu_doua(); break; } case 3: { system("cls"); cout<<"\nCoordonatele dreptunghiului "; cout<<"\nSe dau punctele de pe diagonala dreptunghiului"; cout<<"\nDati punctele"; cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; Dreptunghi *dreptunghi=new Dreptunghi(a,b); cout<<"\nPentru trapez:"; cout<<"\nSe introduc dreptele paralele cu Ox"; cout<<"\nPrima dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>a; cout<<"\nAl doilea punct:"; cin>>b; if(a.y!=b.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(a.y==b.y) vb=1; } cout<<"\nA doua dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>c; cout<<"\nAl doilea punct:"; cin>>d; if(c.y!=d.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(c.y==d.y) vb=1; } Trapez *trapez=new Trapez(a,b,c,d); rez=*dreptunghi&*trapez; cout<<"\nSuprafata comuna: "<Aria()+trapez->Aria()-rez; cout<<"\nFigura 1 fara figura 2: "<Aria()-rez; meniu_doua(); break; } case 4: { system("cls"); cout<<"\nCoordonatele triunghiului:"; cout<<"\nPentru primul punct:"; cin>>a; cout<<"\nPentru al doilea punct:"; cin>>b; cout<<"\nPentru al treilea punct:"; cin>>c; Triunghi *triunghi=new Triunghi(a,b,c); cout<<"\nPentru trapez:"; cout<<"\nSe introduc dreptele paralele cu Ox"; cout<<"\nPrima dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>a; cout<<"\nAl doilea punct:"; cin>>b; if(a.y!=b.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(a.y==b.y) vb=1; } cout<<"\nA doua dreapta"; vb=0; while(vb==0) { cout<<"\nPrimul punct:"; cin>>c; cout<<"\nAl doilea punct:"; cin>>d; if(c.y!=d.y) {vb=0;cout<<"\nDreapta nu este paralela cu Ox.\nReintroduceti:";} if(c.y==d.y) vb=1; } Trapez *trapez=new Trapez(a,b,c,d); rez=*triunghi&*trapez; cout<<"\nSuprafata comuna: "<Aria()+trapez->Aria()-rez; cout<<"\nFigura 1 fara figura 2: "<Aria()-rez; meniu_doua(); break; } default: {cout<<"\nReintroduceti";break;} } cout<<"\n\n Introduceti optiunea pentru doua figuri:"; cin>>ales; } meniu_doua(); break; } default:{cout<<"\nReintroduceti:";break;} } meniu_principal(); cout<<"\nIntroduceti optiunea:"; cin>>opt; } }