Frage zur bestimmung der Anzahl von Werten
-
Hi,
und guten Morgen. Ich hab da ne frage zu dem Code:
#include <math.h> #include <fstream> #include <iostream> #include <string> #include<vector> #define sqr(x) ((x)*(x)) #define sin_d(x) (sin((x)*M_PI/180)) #define cos_d(x) (cos((x)*M_PI/180)) #define tan_d(x) (tan((x)*M_PI/180)) #define asin_d(x) (asin(x)*180/M_PI) #define acos_d(x) (acos(x)*180/M_PI) #define atan_d(x) (atan(x)*180/M_PI) using namespace std; int main() { double x; double y; double z; double r = 1.0; std::ofstream myFile; myFile.open ("c:/ErstellteKugel3.vtk"); myFile << "# vtk DataFile Version 2.0\n" << "Kugel example\n" << "ASCII\n" << "DATASET POLYDATA\n"; int step_phi, step_theta; int nloop, nloop_phi, nloop_theta; step_phi = 20; step_theta = 10; nloop_phi = 359/step_phi + 1; // = 17 + 1 = 18 nloop_theta = (179-step_theta)/step_theta + 1; // = 16 + 1 = 17 nloop = nloop_theta * nloop_phi; // = 17 * 18 = 306 nloop = nloop + 2; myFile << "POINTS" << " " << nloop << " float\n"; x = r * cos_d(0) * sin_d(0); myFile << x <<" "; y = r * sin_d(0) * sin_d(0); myFile << y << " "; z = r * cos_d(0); myFile << z << "\n"; for( int phi = step_phi; phi < 180; phi += step_phi ) { for( int theta = 0; theta < 360; theta += step_theta ) { double x = r * cos_d(theta) * sin_d(phi); myFile << x <<" "; double y = r * sin_d(theta) * sin_d(phi); myFile << y << " "; double z = r * cos_d(phi); myFile << z << "\n"; } } x = r * cos_d(0) * sin_d(180); myFile << x <<" "; y = r * sin_d(0) * sin_d(180); myFile << y << " "; z = r * cos_d(180); myFile << z << "\n"; myFile << "POLYGONS 612 2448\n"; for(x=1; x<= (nloop_phi - 1) ; x++) { myFile << 3 << " " << 0 << " " << x << " " << x + 1 << "\n"; } myFile << 3 << " " << 0 << " " << nloop_phi << " " << 1 << "\n"; myFile << 3 << " " << nloop_phi << " " << 1 << " " << (nloop_phi + 1) << "\n"; myFile << 3 << " " << nloop_phi << " " << (nloop_phi * 2) << " " << (nloop_phi + 1) << "\n"; for(x=1, y=(nloop_phi +1); x<=(nloop_phi - 1)&&y<=(nloop_phi * 2); x++, y++) { myFile << 3 << " " << x << " " << y << " " << y + 1 << std::endl << 3 << " " << x << " " << x + 1 << " " << y + 1 << std::endl; } for(x=(nloop_phi +1), y=(nloop_phi * 2); x<=(nloop - (nloop_phi + 2))&&y<=(nloop -4); x++, y++) { myFile << 3 << " " << x << " " << y << " " << y + 1 << std::endl << 3 << " " << x << " " << x + 1 << " " << y + 1 << std::endl; } myFile << 3 << " " << (nloop - (nloop_phi + 2)) << " " << (nloop -3) << " " << (nloop - 2) << "\n"; myFile << 3 << " " << (nloop - (nloop_phi + 2)) << " " << (nloop - nloop_phi + 1) << " " << (nloop - 2) << "\n"; for(x=(nloop - nloop_phi), y=(nloop - nloop_phi + 1); x<=(nloop -3)&&y<=(nloop - 2); x++, y++) { myFile << 3 << " " << 307 << " " << x << " " << y << "\n"; } myFile << 3 << " " << (nloop - 1) << " " << (nloop - nloop_phi - 1) << " " << (nloop - nloop_phi) << "\n"; myFile << 3 << " " << (nloop - 1) << " " << (nloop - 2) << " " << (nloop - nloop_phi - 1); }myFile << "POLYGONS 612 2448\n";<--- Die 612 ist hier die Anzahl, der Werte die in den Schleifen darunter ins File geschrieben werden. Die 2448 ist das ganze mal 4. Das ist auf das VTK Fileformat bezogen und nicht wichtig. Also die Frage ist wie bekomme ich den die 612 raus bevor die Schleifen durchgelaufen sind?
Da ich ja
myFile << "POLYGONS 612 2448\n";die 612 schon vorher Eintragen muss.
Danke
Gruß GT
-
Du könntest die Polygone erst in einen vector<> packen und anschließend dessen Elementanzahl mit .size() abfragen.
-
Genau das hab ich mir auch gedacht. Danke!
Könntest du mir bei der Umsetzung helfen?
-
Ohne jetzt den Quelltext en detail gelesen zu haben, scheint mir die 612 ein Vielfaches von 306 (nloop) zu sein.
Gruß...
Heiko
-
Das ist jetzt nur hier so. Aber die 2448 ist das 4 fache von 612 und wär auch immer das 4 fache der Zahl.
Des weitern ist die Zahl sowieso jetzt falsch da es im Moment nicht 306 sonder 612 ist.
Man müsste step_phi auf 20 setzen dann wäre es wieder richtig. Die Anzahl entspricht im Moment mit der 10 der Zahl 1220 was wieder nichts mit 306 oder 612 zu tun hat und deswegen da kein zusammenhang besteht. Das mit dem Vector scheint die beste Lösung zu sein.
Code ist jetzt geändert Das es geht!!!
-
Da du, verglichen mit dem anderen thread, aus dem die Kommentare stammen, step_phi auf 10 reduziert hast, IST nloop doch genau 612. Es war doch zweck der Uebung im anderen Thread, die Anzahl der Schleifendurchlaeufe zu bestimmen, damit hast du doch schon die gesuchte Zahl.
Ich ahbe mir deine Schleifen jetzt nicht genauer angeschaut, allerdings siehts so aus, als ob auch hier die Zahl der Schleifendurchlaeufe wieder vorher feststeht, also auch auszurechnen ist. Setz dich doch mal mit Zettel und Stift hin und ueberlege, wie die Anzahl der Schreibvorgaenge bzw. Schleifendurchlaeufe von deinen Variablen abhaengt. Schliesslich kommst du nur sehr langsam voran, wenn das bei jeder for-schleife jemand aus dem Forum fuer dich machen soll...
-
@ pumuckl: Stimmt schon. Aber die 612 ist nur in diesem Fall richtig. Deswege brache ich ja den flexibelen Wert.
Im Prinzip würd ich nur wissen wollen wie das mit dem Vector und dem .size vom Vector geht.
-
GT schrieb:
Genau das hab ich mir auch gedacht. Danke!
Könntest du mir bei der Umsetzung helfen?
habe ich das richtig verstanden, daß diese 612 der Anzahl der "myfile<<3<<...<<\n" Ausgaben ist? Wenn ja, brauchst du am besten eine struct, die ein einzelnes Polygon darstellt und einen vector für derartige structs - und dann kannst du jede Ausgabe ersetzen durch ein push_back() in den vector:
struct polygon { int p1,p2,p3; polygon(int i1,int i2,int i3) : p1(i1),p2(i2),p3(i3) {} }; ... vector<polygon> polydata; for(x=1; x<= (nloop_phi - 1) ; x++) //myFile << 3 << " " << 0 << " " << x << " " << x + 1 << "\n"; polydata.push_back(polygon(0,x,x+1)); polydata.push_back(polygon(0,nloop_phi,1) polydata.push_back(polygon(nloop_phi,1,(nloop_phi + 1)); polydata.push_Back(polygon(nloop_phi,(nloop_phi * 2),(nloop_phi + 1))) ... myFile<<"POLYGONS "<<polydata.size()<<" "<<4*polydata.size()<<"\n"; for(int i=0;i<polydata.size();++i) myFile<<3<<" "<<polydata[i].p1<<" "<<polydata[i].p2<<" "<<polydata[i].p3<<"\n";
-
@ CStoll: Ja genau (da ich jetzt oben den Code wieder geändert hab) ist die Anzahl der Werte 612 die dann ins File mit myFile geschrieben werden.
Ok und mit dem schreib ich ja dann die einzelnen Werte.
myFile<<"POLYGONS "<<polydata.size()<<" "<<4*polydata.size()<<"\n"; for(int i=0;i<polydata.size();++i) myFile<<3<<" "<<polydata[i].p1<<" "<<polydata[i].p2<<" "<<polydata[i].p3<<"\n";Ich probiers mal aus schon mal vielen Dank. Des weitern sollte ich mir die Vector sache noch mal genau anschaun. (scheint in meinem Fall sehr nützlich zu sein)