stl


#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 facet{
struct vertex punkty[3];
float vector[3];
};

struct solid{
struct facet *W;
};

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);

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 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;

}
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;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-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 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 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;ilp;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;nlp;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 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]);

//printf("%f %f %f\n",vekt[0],vekt[1],vekt[2]);

/*if(vekt[0]!=pom->bryla.W[i].vector[0] || vekt[1]!=pom->bryla.W[i].vector[1] || vekt[2]!=pom->bryla.W[i].vector[2])
{
j=j+1;
}*/
if(vekt[0]!=0 && vekt[0]>0)//sprowadzenie do wersorow
{
vekt[0]=vekt[0]/vekt[0];
vekt[1]=vekt[1]/vekt[0];
vekt[2]=vekt[2]/vekt[0];
}
else if(vekt[1]!=0 && vekt[1]>0)
{
vekt[0]=vekt[0]/vekt[1];
vekt[1]=vekt[1]/vekt[1];
vekt[2]=vekt[2]/vekt[1];
}
else if(vekt[2]!=0 && vekt[2]>0)
{
vekt[0]=vekt[0]/vekt[2];
vekt[1]=vekt[1]/vekt[2];
vekt[2]=vekt[2]/vekt[2];
}
else if(vekt[0]!=0 && vekt[0]<0)
{
vekt[0]=(-1)*vekt[0]/vekt[0];
vekt[1]=(-1)*vekt[1]/vekt[0];
vekt[2]=(-1)*vekt[2]/vekt[0];
}
else if(vekt[1]!=0 && vekt[1]<0)
{
vekt[0]=(-1)*vekt[0]/vekt[1];
vekt[1]=(-1)*vekt[1]/vekt[1];
vekt[2]=(-1)*vekt[2]/vekt[1];
}
else if(vekt[2]!=0 && vekt[2]<0)
{
vekt[0]=(-1)*vekt[0]/vekt[2];
vekt[1]=(-1)*vekt[1]/vekt[2];
vekt[2]=(-1)*vekt[2]/vekt[2];
}

//printf("%f %f %f\n",vekt[0],vekt[1],vekt[2]);

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;
}

Wyszukiwarka

Podobne podstrony:
stl w03
Wykład 9 2 Programowanie w STL
Cwiczenia w STL
STL Leksykon kieszonkowy stllk
c programowanie STL
stl introduction
stl
Cwiczenia w STL
wykl08 stl
Wykład 9 1 Programowanie w STL (2)
stl index?t
stl
Wykład 8 Podstawy STL(1)
stl index
Programowanie w STL
STL w praktyceP sposobow?ektywnego wykorzystania stlpra

więcej podobnych podstron