#include #define WIN32_LEAN_AND_MEAN #include #include #include #include #include using namespace std; #define STYLOKNAGLOWNEGO ( WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX ) std::string g_strKlasaOkna = "Figury"; char info[100]; int akcja=0; int mouse_x=0; int mouse_y=0; int index; RECT ekran; typedef struct typObiekt { int ilpunktow; int illinii; vector punkt; vector linia; } OBIEKT; OBIEKT obiekt1; // tworzenie obiektu testowego void readstr(FILE *f,char *string) // czyta linie tekstu z pliku pomijajac komentarze { do { fgets(string, 255, f); } while ((string[0] == '/') || (string[0] == '\n')); return; } int WczytajObiekt(OBIEKT &ob) // wczytuje obiekt z pliku { int x, y; int indeks1, indeks2; int ilpunktow =0; int illinii =0; FILE *plikdanych; char linia[255]; if ((plikdanych = fopen("Dane/obiekt.obj", "rt")) == NULL) {return 0;}; // Plik z danymi readstr(plikdanych,linia); sscanf(linia, "PUNKTY %d\n", &ilpunktow); if (ilpunktow<=0) {return 0;}; ob.punkt.clear(); ob.linia.clear(); ob.ilpunktow = ilpunktow; for (int petla = 0; petla < ilpunktow; petla++) // punkty { readstr(plikdanych,linia); sscanf(linia, "%d %d", &x, &y); ob.punkt.push_back(x); ob.punkt.push_back(y); } readstr(plikdanych,linia); sscanf(linia, "LINIE %d\n", &illinii); ob.illinii = illinii; for ( petla = 0; petla < illinii; petla++) // linie { readstr(plikdanych,linia); sscanf(linia, "%d %d", &indeks1, &indeks2); ob.linia.push_back( ob.punkt[2*indeks1-2]); ob.linia.push_back( ob.punkt[2*indeks1-1]); ob.linia.push_back( ob.punkt[2*indeks2-2]); ob.linia.push_back( ob.punkt[2*indeks2-1]); } fclose(plikdanych); return 1; } void DodajPunkt(int xx, int yy,OBIEKT &ob) // dodawanie nowego punktu { ob.ilpunktow++; ob.punkt.push_back(xx); ob.punkt.push_back(yy); }; int UsunPunkt(int xx, int yy,OBIEKT &ob) // dodawanie nowego punktu { int sukces=0; for (int i=0; i<2*ob.ilpunktow; i+=2) // rysowanie punktow { if ( abs(ob.punkt[i] - xx)<6 && abs(ob.punkt[i+1] -yy)<6) { for (int b=0; b<4*ob.illinii; b+=2) // rysowanie linii { if ((ob.linia[b] == ob.punkt[i]) && (ob.linia[b+1] == ob.punkt[i+1])) { ob.linia.erase( ob.linia.begin()+(b/4)*4 ); ob.linia.erase( ob.linia.begin()+(b/4)*4 ); ob.linia.erase( ob.linia.begin()+(b/4)*4 ); ob.linia.erase( ob.linia.begin()+(b/4)*4 ); b=-2; ob.illinii--; }} ob.punkt.erase(ob.punkt.begin() + i); ob.punkt.erase(ob.punkt.begin() + i); ob.ilpunktow--; sukces = 1; }} return sukces; }; int ZaznaczPunkt(int xx, int yy,OBIEKT &ob) // dodawanie nowego punktu { int sukces=0; for (int i=0; i<2*ob.ilpunktow; i+=2) { if ( abs(ob.punkt[i] - xx)<6 && abs(ob.punkt[i+1] -yy)<6) { index=i; sukces = 1; }} return sukces; }; int PrzesunPunkt(int xx, int yy,OBIEKT &ob) // dodawanie nowego punktu { int sukces=1; for (int i=0; i<2*ob.ilpunktow; i+=2) // rysowanie punktow { if ( ob.punkt[i] == ob.punkt[index] && ob.punkt[i+1] == ob.punkt[index+1]) { for (int b=0; b<4*ob.illinii; b+=2) // rysowanie linii { if ((ob.linia[b] == ob.punkt[index]) && (ob.linia[b+1] == ob.punkt[index+1])) { ob.linia[b] = xx; ob.linia[b+1] = yy; }} ob.punkt[i] = xx; ob.punkt[i+1] = yy; sukces = 1; }} return sukces; }; int WstawLinie(int xx, int yy,OBIEKT &ob) // dodawanie nowego punktu { int sukces=0; for (int i=0; i<2*ob.ilpunktow; i+=2) { if ( abs(ob.punkt[i] - xx)<6 && abs(ob.punkt[i+1] -yy)<6) { for (int b=0; b<2*ob.ilpunktow; b+=2) { if ( ob.punkt[b] == ob.punkt[index] && ob.punkt[b+1] == ob.punkt[index+1]) { ob.linia.push_back(ob.punkt[b]); ob.linia.push_back(ob.punkt[b+1]); b=2*ob.ilpunktow+10; }} ob.linia.push_back(ob.punkt[i]); ob.linia.push_back(ob.punkt[i+1]); i=2*ob.ilpunktow+10; ob.illinii++; sukces = 1; }} return sukces; }; void PodswietlPunkt(HDC kont,int xx, int yy,OBIEKT ob) // dodawanie nowego punktu { HPEN czerwony; czerwony = CreatePen(PS_SOLID,1,RGB(255,0,0)); for (int i=0; i<2*ob.ilpunktow; i+=2) // rysowanie punktow { if ( abs(ob.punkt[i] - xx)<6 && abs(ob.punkt[i+1] -yy)<6) { SelectObject(kont,czerwony); Ellipse(kont,ob.punkt[i]-5,ob.punkt[i+1]-5,ob.punkt[i]+5,ob.punkt[i+1]+5); }} }; void PodswietlLinie(HDC kont,int xx, int yy,OBIEKT ob) // podswietlenie linii { HPEN czerwony; czerwony = CreatePen(PS_SOLID,3,RGB(255,0,0)); float B = 1; for (int i=0; i<4*ob.illinii; i+=4) { float Y1=ob.linia[i+1]; float Y2=ob.linia[i+3]; float X1=ob.linia[i]; float X2=ob.linia[i+2]; float A; float C; if ((X2/X1)!=0) { A= (Y2 - Y1)/(X2 - X1)*(-1); C = (((Y2 - Y1)/(X2 - X1) * X1) - Y1); } else { A= (Y2 - Y1)/0.0001*(-1); C = (((Y2 - Y1)/0.0001 * X1) - Y1); } float d = (abs( A*xx + B*yy + C))/ sqrt(A*A + 1); //sprintf(info,"%f",d); // debugowanie if (d <=10) { float odl1= sqrt( (X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1) ); float odl2= sqrt( (X2-xx)*(X2-xx) + (Y2-yy)*(Y2-yy) ); float odl3= sqrt( (xx-X1)*(xx-X1) + (yy-Y1)*(yy-Y1) ); if ((odl1> odl2) && (odl1 > odl3)) { SelectObject(kont,czerwony); MoveToEx(kont,ob.linia[i],ob.linia[i+1],NULL); LineTo(kont,ob.linia[i+2],ob.linia[i+3]); index=i; }}} }; int UsunLinie(OBIEKT &ob) // usuwanie linii { ob.linia.erase( ob.linia.begin()+index ); ob.linia.erase( ob.linia.begin()+index ); ob.linia.erase( ob.linia.begin()+index ); ob.linia.erase( ob.linia.begin()+index ); ob.illinii--; return 1; }; void RysujObiekt(HDC kont, OBIEKT ob, int xx, int yy) { for (int i=0; i<2*ob.ilpunktow; i+=2) // rysowanie punktow { Ellipse(kont,ob.punkt[i]-2,ob.punkt[i+1]-2,ob.punkt[i]+2,ob.punkt[i+1]+2); } for ( i=0; i<4*ob.illinii; i+=4) // rysowanie linii { MoveToEx(kont,ob.linia[i],ob.linia[i+1],NULL); LineTo(kont,ob.linia[i+2],ob.linia[i+3]); } TextOut(kont,10,35,info,strlen(info)); // informacja if ((akcja==2) || (akcja==3) || (akcja==6) || (akcja==8)) { PodswietlPunkt(kont,xx,yy,ob); }; if (akcja==10) { PodswietlLinie(kont,xx,yy,ob); }; } void ZapiszZmiany(OBIEKT &ob) // dodawanie nowego punktu { FILE *plikdanych; char buffor[100]; plikdanych = fopen("Dane/obiekt.obj", "w"); fprintf( plikdanych,"PUNKTY %d\n\n", ob.ilpunktow); for (int i=0; i< 2*ob.ilpunktow; i+=2) { fprintf( plikdanych,"%d %d\n",ob.punkt[i],ob.punkt[i+1]); } fprintf( plikdanych,"\nLINIE %d\n\n", ob.illinii); for (i=0; i< 4*ob.illinii; i+=4) { for (int b=0; b(msgKomunikat.wParam); }