stl, Politechnika Wrocławska, PWR - W10- Automatyka i Robotyka, Sem3, infa

[ Pobierz całość w formacie PDF ]
#include<stdio.h>#include<stdlib.h>#include<string.h>//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 facet{struct vertex punkty[3];float vector[3];};struct solid{struct facet *W;};struct element{int liczba;char *nazwa;int lp;//liczba plaszczyzn w brylestruct solid bryla;struct element *next;struct element *prev;};//tworzymy podstawowa jednostke skladajaca sie z liczby, nazwy oraz wskaznikow na poprzedni i nastepny elementstruct element *first = NULL;//na poczatku nie ma ani pierwszego ani ostatniego elementu tak wiec trzeba to zaznaczycstruct element *last = NULL;int dodaj(FILE **fp){char tab[100];char trash[100];struct element *nowy;float j;//zabezpieczenie przed literamiint pom=0;//liczba plaszczyznif((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 komorkiwhile(scanf("%f",&j)==0){fflush(stdin);printf("Podaj prawidlowa liczbe...\n");}fflush(stdin);nowy->liczba=j;//scanf("%d",&nowy->liczba);//przypisanie wartosciprintf("Podaj nazwe pliku...\n");fflush(stdin);gets(nowy->nazwa);while(!feof(*fp)){fscanf(*fp,"%s",tab);if(strcmp(tab, "endloop")==0){pom=pom+1;}}nowy->bryla.W=(struct facet*)malloc(pom*sizeof(struct facet));rewind(*fp);nowy->lp=pom;pom=0;while(!feof(*fp)){fscanf(*fp,"%s",tab);if(strcmp(tab, "normal")==0){fscanf(*fp,"%f %f %f", &nowy->bryla.W[pom].vector[0], &nowy->bryla.W[pom].vector[1], &nowy->bryla.W[pom].vector[2]);}else if(strcmp(tab, "loop")==0){fscanf(*fp,"%s %f %f %f",trash, &nowy->bryla.W[pom].punkty[0].x, &nowy->bryla.W[pom].punkty[0].y, &nowy->bryla.W[pom].punkty[0].z);fscanf(*fp,"%s %f %f %f",trash, &nowy->bryla.W[pom].punkty[1].x, &nowy->bryla.W[pom].punkty[1].y, &nowy->bryla.W[pom].punkty[1].z);fscanf(*fp,"%s %f %f %f",trash, &nowy->bryla.W[pom].punkty[2].x, &nowy->bryla.W[pom].punkty[2].y, &nowy->bryla.W[pom].punkty[2].z);pom=pom+1;}}if(first==NULL)//gdy lista nie posiada zadnych elementow{nowy->next=NULL;//dodawany element staje sie jednoczesie pierwszym i ostatnim elementemnowy->prev=NULL;first=nowy;last=nowy;}else{nowy->next=NULL;//nowy element trafia na koniec listy zatem nastepny element musi wskazywac na nullnowy->prev=last;//poprzedni element wskazuje na ostatni przed dodaniem nowegolast->next=nowy;//nastepny po ostatnim to teraz nowylast=nowy;//nowy staje sie nowym ostatnim}return 0;}void wyswietl(){struct element *pom;//element pomocniczyint i=1;int n;pom=first;//zaczynamy od poczatkuif(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;n<pom->lp;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 elementui=i+1;}printf("\n");}void doukladu()//sprowadzenie wszystkich elementow do wspolnego ukladu(srodek ciezkosci kazdej bryly){struct element *pom;//element pomocniczyint i;int j;float tab[3];pom=first;//zaczynamy od poczatkuif(pom==NULL){printf("Brak elementow do przesuniecia...\n");return;}while(pom!=NULL){tab[0]=0;tab[1]=0;tab[2]=0;for(i=0;i<pom->lp;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;}tab[0]=tab[0]/(3*pom->lp);tab[1]=tab[1]/(3*pom->lp);tab[2]=tab[1]/(3*pom->lp);printf("Przesuniecie nastapi o wektor x: %f; y: %f; z: %f;\n",tab[0],tab[1],tab[2]);for(i=0;i<pom->lp;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-tab[0];pom->bryla.W[i].punkty[j].y=pom->bryla.W[i].punkty[j].y-tab[1];pom->bryla.W[i].punkty[j].z=pom->bryla.W[i].punkty[j].z-tab[2];}}pom=pom->next;}}void szereg()//ustawienie bryl w szereg{struct element *pom;//element pomocniczyint i;int j;int k=0;float x;pom=first;//zaczynamy od poczatkuif(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;i<pom->lp;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;}elseprintf("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 miejscemfirst->prev=NULL;//a poprzedniego elementu nie mafree(pozycja);printf("Poprawnie usunieto element\n");return;}else if(pozycja==last){last=pozycja->prev;//ostatnim elementem staje sie ten poprzednilast->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 pozycjipozycja->next->prev=pozycja->prev;//poprzednim elementem staje sie element przed pozycjafree(pozycja);printf("Poprawnie usunieto element\n");return;}}void zapisz(){FILE *fp;struct element *pom;char tab[100];int i;pom=first;if(pom==NULL){printf("Brak plikow do zapisania...\n");return;}printf("Podaj nazwe pliku wyjsciowego: ");gets(tab);if ((fp=fopen(tab, "w"))==NULL){printf ("Nie moge stworzyc pliku!\n");return;}fprintf(fp,"solid bryly\n");while(pom!=NULL){for(i=0;i<pom->lp;i=i+1){fprintf(fp," facet normal %f %f %f\n",pom->bryla.W[i].vector[0], pom->bryla.W[i].vector[1], pom->bryla.W[i].vector[2]);fprintf(fp," outer loop\n");fprintf(fp," vertex %f %f %f\n",pom->bryla.W[i].punkty[0].x, pom->bryla.W[i].punkty[0].y, pom->bryla.W[i].punkty[0].z);fprintf(fp," vertex %f %f %f\n",pom->bryla.W[i].punkty[1].x, pom->bryla.W[i].punkty[1].y, pom->bryla.W[i].punkty[1].z);fprintf(fp," vertex %f %f %f\n",pom->bryla.W[i].punkty[2].x, pom->bryla.W[i].punkty[2].y, pom->bryla.W[i].punkty[2].z);fprintf(fp," endloop\n");fprintf(fp," endfacet\n");}pom=pom->next;}fprintf(fp,"endsolid");fclose(fp);printf("Pomyslnie zapisano plik!\n");}void pokaz(struct element *wsk)//pokazanie elementu{int n;if(wsk==NULL){printf("Nie znaleziono elementu...\n");return;}printf("Liczba: %d Tekst: %s\n",wsk->liczba,wsk->nazwa);printf("\n"); printf("\n");for(n=0;n<wsk->lp;n=n+1){printf("vertex: %f %f %f\n",wsk->bryla.W[n].punkty[0].x, wsk->bryla.W[n].punkty[0].y, wsk->bryla.W[n].punkty[0].z);printf("vertex: %f %f %f\n",wsk->bryla.W[n].punkty[1].x, wsk->bryla.W[n].punkty[1].y, wsk->bryla.W[n].punkty[1].z);printf("vertex: %f %f %f\n",wsk->bryla.W[n].punkty[2].x, wsk->bryla.W[n].punkty[2].y, wsk->bryla.W[n].punkty[2].z);printf("\n");}}void sprawdznormalne(){float wk1[3];//wektory pomocniczefloat wk2[3];float vekt[3];struct element *pom;//element pomocniczyint i;int j;pom=first;//zaczynamy od poczatkuif(pom==NULL){printf("Brak bryl do sprawdzenia...\n");return;}while(pom!=NULL){j=0;for(i=0;i<pom->lp;i=i+1){wk1[0]=pom->bryla.W[i].punkty[1].x-pom->bryla.W[i].punkty[0].x;//vektor z 1 do 2wk1[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 3wk2[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 normalneg... [ Pobierz całość w formacie PDF ]