#include #include #include //PROGRAM DZIALA PRAWIDLOWO DLA WARTOSCI W PLIKU STL PODANYCH WE FLOATACH - PRZY ZAPISIE LICZB NAUKOWYM GUBI SIE - obejście tego wymagałoby drugie tyle linijek... struct vertex{ float x; float y; float z; };
struct element{ int liczba; char *nazwa; int lp;//liczba plaszczyzn w bryle struct solid bryla; struct element *next; struct element *prev; };//tworzymy podstawowa jednostke skladajaca sie z liczby, nazwy oraz wskaznikow na poprzedni i nastepny element
struct element *first = NULL;//na poczatku nie ma ani pierwszego ani ostatniego elementu tak wiec trzeba to zaznaczyc struct element *last = NULL;
int dodaj(FILE **fp) { char tab[100]; char trash[100]; struct element *nowy; float j;//zabezpieczenie przed literami int pom=0;//liczba plaszczyzn if((nowy=(struct element*)malloc(sizeof(struct element)))==NULL)//zabezpieczenie przed przepełnieniem pamięci { printf("BLAD! BRAK PAMIECI\n"); return 1; } nowy->nazwa=(char*)malloc(100*sizeof(char)); printf("Podaj liczbe calkowita...\n");//podanie przez uzytkownika wartosci nowej komorki while(scanf("%f",&j)==0) { fflush(stdin); printf("Podaj prawidlowa liczbe...\n"); } fflush(stdin); nowy->liczba=j; //scanf("%d",&nowy->liczba);//przypisanie wartosci printf("Podaj nazwe pliku...\n"); fflush(stdin); gets(nowy->nazwa);
if(first==NULL)//gdy lista nie posiada zadnych elementow { nowy->next=NULL;//dodawany element staje sie jednoczesie pierwszym i ostatnim elementem nowy->prev=NULL; first=nowy; last=nowy; } else { nowy->next=NULL;//nowy element trafia na koniec listy zatem nastepny element musi wskazywac na null nowy->prev=last;//poprzedni element wskazuje na ostatni przed dodaniem nowego last->next=nowy;//nastepny po ostatnim to teraz nowy last=nowy;//nowy staje sie nowym ostatnim } return 0; }
void wyswietl() { struct element *pom;//element pomocniczy int i=1; int n; pom=first;//zaczynamy od poczatku if(pom==NULL) printf("Brak elementow do wyswietlenia...\n"); while(pom!=NULL) { printf("%d. Liczba: %d Tekst: %s\n",i,pom->liczba,pom->nazwa); for(n=0;nlp;n=n+1) { printf("vertex: %f %f %f\n",pom->bryla.W[n].punkty[0].x, pom->bryla.W[n].punkty[0].y, pom->bryla.W[n].punkty[0].z); printf("vertex: %f %f %f\n",pom->bryla.W[n].punkty[1].x, pom->bryla.W[n].punkty[1].y, pom->bryla.W[n].punkty[1].z); printf("vertex: %f %f %f\n",pom->bryla.W[n].punkty[2].x, pom->bryla.W[n].punkty[2].y, pom->bryla.W[n].punkty[2].z); printf("\n"); } pom=pom->next;//nastepnie przechodzimy do nastepnego elementu i=i+1; } printf("\n"); }
void doukladu()//sprowadzenie wszystkich elementow do wspolnego ukladu(srodek ciezkosci kazdej bryly) { struct element *pom;//element pomocniczy int i; int j; float tab[3]; pom=first;//zaczynamy od poczatku if(pom==NULL) { printf("Brak elementow do przesuniecia...\n"); return; } while(pom!=NULL) { tab[0]=0; tab[1]=0; tab[2]=0; for(i=0;ilp;i=i+1) { tab[0]=pom->bryla.W[i].punkty[0].x+pom->bryla.W[i].punkty[1].x+pom->bryla.W[i].punkty[2].x; tab[1]=pom->bryla.W[i].punkty[0].y+pom->bryla.W[i].punkty[1].y+pom->bryla.W[i].punkty[2].y; tab[2]=pom->bryla.W[i].punkty[0].z+pom->bryla.W[i].punkty[1].z+pom->bryla.W[i].punkty[2].z;
void szereg()//ustawienie bryl w szereg { struct element *pom;//element pomocniczy int i; int j; int k=0; float x; pom=first;//zaczynamy od poczatku if(pom==NULL) { printf("Brak elementow do przesuniecia...\n"); return; } printf("Podaj wartosc odstepu miedzy kolejnymi brylami...\n"); scanf("%f",&x); while(pom!=NULL) { for(i=0;ilp;i=i+1) { for(j=0;j<3;j=j+1) { pom->bryla.W[i].punkty[j].x=pom->bryla.W[i].punkty[j].x-x*k; } } pom=pom->next; k=k+1; } printf("Bryly rozsunieto o %f",x); }
struct element *szukaj(int szukana) { struct element *pom; pom=first; if(pom!=NULL) { do { if(pom->liczba==szukana) { return pom; } pom=pom->next; }while(pom!=NULL); return pom; } else printf("Blad...\n"); }
void usun(struct element *pozycja) { if(pozycja==NULL) { printf("Nie znaleziono elementu...\n"); return; } if(first==last) { first=NULL; last=NULL; free(pozycja); printf("Poprawnie usunieto element\n"); return; } else if(pozycja==first) { first=pozycja->next;//pierwszym elementem staje sie ten za aktaulnym miejscem first->prev=NULL;//a poprzedniego elementu nie ma free(pozycja); printf("Poprawnie usunieto element\n"); return; } else if(pozycja==last) { last=pozycja->prev;//ostatnim elementem staje sie ten poprzedni last->next=NULL;//a nastepnego juz nie ma; free(pozycja); printf("Poprawnie usunieto element\n"); return; } else { pozycja->prev->next=pozycja->next;//nastepnym elementem staje sie element po pozycji pozycja->next->prev=pozycja->prev;//poprzednim elementem staje sie element przed pozycja free(pozycja); printf("Poprawnie usunieto element\n"); return; } }
void sprawdznormalne() { float wk1[3];//wektory pomocnicze float wk2[3]; float vekt[3]; struct element *pom;//element pomocniczy int i; int j; pom=first;//zaczynamy od poczatku if(pom==NULL) { printf("Brak bryl do sprawdzenia...\n"); return; } while(pom!=NULL) { j=0; for(i=0;ilp;i=i+1) { wk1[0]=pom->bryla.W[i].punkty[1].x-pom->bryla.W[i].punkty[0].x;//vektor z 1 do 2 wk1[1]=pom->bryla.W[i].punkty[1].y-pom->bryla.W[i].punkty[0].y; wk1[2]=pom->bryla.W[i].punkty[1].z-pom->bryla.W[i].punkty[0].z;
wk2[0]=pom->bryla.W[i].punkty[2].x-pom->bryla.W[i].punkty[0].x;//vektor z 1 do 3 wk2[1]=pom->bryla.W[i].punkty[2].y-pom->bryla.W[i].punkty[0].y; wk2[2]=pom->bryla.W[i].punkty[2].z-pom->bryla.W[i].punkty[0].z;
vekt[0]=(wk1[1]*wk2[2])-(wk2[1]*wk1[2]);//wyliczenie z macierzy wartosci wektora normalnego vekt[1]=(wk2[0]*wk1[2])-(wk1[0]*wk2[2]); vekt[2]=(wk1[0]*wk2[1])-(wk2[0]*wk1[1]);
if(vekt[0]-pom->bryla.W[i].vector[0]>0.3 || vekt[0]-pom->bryla.W[i].vector[0]<-0.3) { j=j+1; } else if(vekt[1]-pom->bryla.W[i].vector[1]>0.3 || vekt[1]-pom->bryla.W[i].vector[1]<-0.3) { j=j+1; } else if(vekt[2]-pom->bryla.W[i].vector[2]>0.3 || vekt[2]-pom->bryla.W[i].vector[2]<-0.3) { j=j+1; } } printf("Bryla o nazwie %s posiada %d blednych trojkotow z %d posiadanych\n",pom->nazwa,j,pom->lp); pom=pom->next; }
}
void menu()//wyswietlenie menu { printf("1 - dodaj pozycje\n2 - odczytaj\n3 - usun\n4 - szukaj\n5 - przesuniecie bryl do poczatku ich ukladu wspolrzednych\n6 - rozsuniecie bryl wzdluz osi x o zadany przez uzytkownika parametr\n7 - zapisanie bryl do jednego pliku\n8 - sprawdzenie poprawnosci wektora normalnego\n9 - KONIEC PROGRAMU\n"); }
int main() { int j=0; float i;//zabezpieczenie przed literami int szukana; FILE *fp; char *nazwa;//nazwa lokalizacji z pliki_stl pliku FILE *fpom;//plik z lokalizacji pliki_stl char tab[100]; nazwa=(char*)malloc(100*sizeof(char)); menu(); while(j!=9) { printf("Opcja nr:"); while(scanf("%f",&i)==0) { fflush(stdin); printf("Podaj prawidlowa opcje..."); } fflush(stdin); j=i; switch(j) { case 1: system("cls"); printf("Podaj nazwe pliku wejsciowego: "); gets(tab); if ((fp=fopen(tab, "r"))==NULL) { printf ("Nie moge otworzyc pliku!\n"); menu();break; } while(!feof(fp)) { fscanf(fp,"%[^'\n']\n",tab); printf("%s\n",tab); if((fpom=fopen(tab, "r"))==NULL) { printf ("Nie moge otworzyc pliku!\n"); } else { dodaj(&fpom); fclose(fpom); } } fclose(fp); menu();break; case 2:system ("cls"); printf("\n"); wyswietl(); menu();break; case 3:system ("cls"); printf("\nUsun pozycje zawierajaca liczbe: "); scanf("%d",&szukana); if(first==NULL) { printf ("Blad! Brak elementow w tablicy\n"); menu();break; } usun(szukaj(szukana)); menu();break; case 4:system ("cls"); printf("\nPodaj szukana liczbe: "); scanf("%d",&szukana); pokaz(szukaj(szukana)); menu();break; case 5:system ("cls"); printf("\nPrzesuwanie bryl...\n"); doukladu(); menu();break; case 6:system ("cls"); szereg(); menu();break; case 7:system ("cls"); zapisz(); menu();break; case 8:system ("cls"); sprawdznormalne(); menu();break; case 9:system ("cls"); printf("\nKONIEC\n");break; default: printf("Takiej opcji nie przewidziano...\n");break; } } return 0; }