Aktualizacja: 23.06.2005  Wersja: 0.4.48
Szukaj ::..
Temat ::..

..:: HOME ::..

  ::..:: INTERNETOWY SERWIS PROGRAMISTYCZNY ::..::

 

 

TURTORIAL 6
Pobieranie danych z pliku

Przechowywanie danych dotyczących wykreowanego ?wiata 3D wewnątrz naszego programu sprawiam że staje się on bardzo skomplikowany i rozległy. Analiza takiego programu oraz wprowadzanie zmian do ?wiata 3D czy chociażby kreowanie nowego ?wiata stają się po pewnym czasie bardzo trudne. Możliwo?ć pobierania ?wiata 3D z osobnego przeznaczonego do tego pliku czy dysku daje dużo więcej możliwo?ci programi?cie. Istnieje wówczas możliwo?ć ingerencji w ?wiat 3D bez ingerencji w program główny, co daje możliwo?ć tworzenia (zmian, poprawek) osobom nie mającym nic wspólnego z programem oraz samym programowaniem. Po dokonaniu zmian przekompilowany program pobierze dane ze zmienionego pliku i wygeneruje okre?lone sektory. Programista ma możliwo?ć testowania niezliczonej liczby wykreowanych ?wiatów 3D bez obawy uszkodzenia programu głównego.
Najprostszym typem danych służących do przechowywania informacji o stworzonym ?wiecie 3D jest zwykły tekst. Jest on łatwy w redagowaniu a plik, w którym przechować można dane jest zwykłym plikiem tekstowym.


Rys.  Przykładowy plik tekstowy ze zdefiniowanym ?wiatem 3D

Po pierwsze trzeba okre?lić sposób pobierania danych z naszego pliku tekstowego. Podstawą jest stworzenie nowej funkcji TworzSwiat(). Należy zdefiniować plik jako filein i otworzyć go z parametrem rt okre?lającym możliwo?ć czytania z tego pliku. Nie należy zapominać o zamknięciu pliku po zakończeniu wykonywania operacji na nim przy pomocy polecenia fclose. Fragment kodu przedstawiający przykładową funkcję TworzSwiat() może być następujący:

// Należy zadeklarować w programie głównym : char* swiatfile = "dane\swiat.txt";
void TworzSwiat() // funkcja TworzSwiat
{
FILE *filein; // plik jako filein
filein = fopen(swiatfile, "rt"); // otwarcie naszego pliku 
...
(wczytanie naszych danych z pliku)
...
fclose(filein); // zamknięcie pliku
return; 
}

Kolejnym etapem jest rozważenie problemu wczytywanie danych z poszczególnych linii pliku do odpowiednich zmiennych okre?lających nasz ?wiat 3D. Może to następować w okre?lonej liczbie dróg. Należy brać pod uwagę jedynie interesujące nas informacje zawarte w pliku tekstowym. Je?li w pliku znajdują się linie puste, komentarze lub inne słowa nieistotne dla tworzonego ?wiata3D to nie powinny być one brane pod uwagę. Należy stworzyć osobną funkcję, która będzie czytała tylko znaczące dla nas linie tekstu do zainicjalizowanego łańcucha. Przykładowa postać takiej funkcji o nazwie czytajstr() może być następująca:

void czytajstr(FILE *f,char *string) // czytanie lini tekstu 
{
do // Start pętli
{
fgets(string, 255, f); // czytanie jednej linii
} while ((string[0] == "/") || (string[0] == "\n")); // warunek przerwania czytania 
return; 
}

Na podstawie powyższych informacji istnieje możliwo?ć stworzenia silnika 3D pracującego w oparciu o pojedyncze sektory , lecz stworzenie silnika multi-sektorowego jest możliwe do wykonania bez większych trudno?ci. Powracając do funkcji TworzSwiat() należy zauważyć, że nasz program musi mieć okre?loną liczbę trójkątów w naszym sektorze. Należy zatem w naszym pliku to uwzględnić i umie?cić następującą deklarację definiującą liczbę trójkątów :

TROJKATOW n 

Parametr n będzie liczbą typu integer okre?lającą liczbę trójkątów. 
Oto przykładowy kod do wczytywania liczby trójkątów:

int liczbatrojkatow; // liczba trójkątów sektora
char jednalinia[255]; // łańcuch do danych wej?ciowych
...
readstr(filein,jednalinia); // pobranie jednej linii pliku
sscanf(jednalinia, "TROJKATOW %d\n", &liczbatrojkatow);// czytanie liczby trójkątów

Reszta procesu ładowania naszego ?wiata 3D przebiega zawsze według tych samych zasad. Następnie należy zainicjować nasz sektor i wczytać dane do niego z naszego pliku tekstowego. Pobieranie danych opiera się o dwie główne pętle. Pierwsza odpowiada za pobieranie takiej ilo?ci punktów jak zadeklarowano w zmiennej na początku pliku tzn. je?li na początku pliku zdefiniowano 12 trójkątów to pętla odpowiada za pobranie 36 punktów. Należy pobrać dane i zapamiętać je w naszym zadeklarowanym sektorze do czego potrzeba dodatkowych zmiennych okre?lających numer punktu i numer trójkąta. Dla dwunastu trójkątów numer trójkąta zmieniał się będzie od 1 do 12 a każdy z tych trójkątów będzie posiadał punkty o numerach od 1do 3. Zatem druga pętla wewnątrz pierwszej musi okre?lać numer punktu od 1 do 3, na podstawie których powstanie trójkąt. Przykładowy kod wykonujący te na pozór skomplikowane operacje przedstawiam poniżej:

// Należy zadeklarować w programie głównym : SEKTOR sektor1;
char jednalinia[255]; // łańcuch do przchowywania danych
int liczbatrojkatow; // liczba trójkątów sektorze
float x, y, z, u, v; // współrzędne w 3D
...
// Alokacja pamięci dla liczby trójkątów I ustawienie wska?nika
sektor1.TROJKAT = new TROJKAT[liczbatrojkatow]; 
// definiowanie liczby trójkątów sektorze 1
sektor1.liczbatrojkatow = liczbatrojkatow; 
// Pętla przez każdy trójkąt w sektorze
for (int ptrojkatow = 0; ptrojkatow < liczbatrojkatow; ptrojkatow++) 
{
// Pętla przez każdy wierzchołek w trójkącie
for (int pwierzch = 0; pwierzch < 3; pwierzch++) 
{
// Wczytanie jednej lini tekstu z pliku 
readstr(filein,jednalinia); 
// Przypisanie zmiennym wierzchołka danych pobranych z pliku
sscanf(jednalinia, "%f %f %f %f %f", &x, &y, &z, &u, &v);
// Przypisanie warto?ci do poszczególnych wierzchołków
// Sektor 1, trójkąt ptrojkatow, wierzchołek pwierzch, x warto?ć = x
sektor1.TROJKAT[ptrojkatow].WIERZCHOLEK[pwierzch].x = x; 
// Sektor 1, trójkąt ptrojkatow, wierzchołek pwierzch, y warto?ć = y
sektor1. TROJKAT[ptrojkatow].WIERZCHOLEK[pwierzch].y = y; 
// Sektor 1, trójkąt ptrojkatow, wierzchołek pwierzch, z warto?ć = z 
sektor1. TROJKAT[ptrojkatow]. WIERZCHOLEK[pwierzch].z = z; 
// Sektor 1, trójkąt ptrojkatow, wierzchołek pwierzch, u warto?ć = u
sektor1. TROJKAT[ptrojkatow].WIERZCHOLEK[pwierzch].u = u; 
// Sektor 1, trójkąt ptrojkatow, wierzchołek pwierzch, v warto?ć = v
sektor1. TROJKAT[ptrojkatow]. WIERZCHOLEK[pwierzch].v = v; 
}
}

Każdy trójkąt w naszym pliku tekstowym zadeklarowany jest następująco:

X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3

Zatem plik tekstowy ma następującą postać (Przykład Rys. X):

//początek pliku tekstowego
TROJKATOW n
// trójkąt 1
X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3
...
// trójkąt n
X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3
//koniec pliku tekstowego

 


PP
...

TYP I NAZWA PLIKÓW  DO POBRANIA:
.....
...
...
FORMAT ARCHIWUM:
...
...

<-- TURTORIAL 5   TURTORIAL 7-->

 

Strona poświęcona jest technologiom programowania C++ z wykorzystaniem pakietu Visual C++, Pascal, DELPHI, C oraz technologiom tworzenia grafiki komputerowej z wykorzystaniem OpenGl i innych technik.
Wszelkie materiały zamieszczone zostały na stronie w celach dydaktycznych. Autor nie ponosi odpowiedzialności za treści materiałów oraz skutki wywołane ich wykorzystaniem.

(c) P.PARDEL 2001-2005 gg:1991389

Serwis znajduje się na serwerze www.friko.pl ..::..::..