000
17.06.2009, 22:17 Uhr
Yadgar
|
(anscheinend ist es wohl doch kein Linux-spezifisches Problem, also versuche ich mein Glück mal hier...)
High!
Da bin ich wieder... nachdem mein Projekt "Yadgar's Image Processor" (siehe auch www.khyberspace.de/comput-d.html) bis auf weiteres auf Eis liegt, versuche ich seit einigen Tagen, ein C++-Programm zur Erzeugung von PoV-Ray-Skripts zum Laufen zu bekommen.
Das Programm "makemm" (mm steht für "MyMaglev", ein futuristisches Kabinenbahnsystem für ein noch auszuprogrammierendes Science-Fiction-Stadtszenario - eine allererste kleine Animation habe ich bei YouTube eingestellt, www.youtube.com/watch?v=9eSzGZTBv44 ) erzeugt ausgehend von den beim Aufruf des Programmes übergebenen vier Parametern ( xyz-Koordinaten des Startpunkts der Bahnstrecke, azimutale Ausrichtung des ersten Streckensegments in Grad) und einem eingelesenen Beschreibungsskript für die Abfolge der Streckensegmente die PoV-Ray-Programmstruktur für eine Kamerafahrt entlang dieser Bahnstrecke (vorerst mit konstanter Geschwindigkeit, später soll noch eine externe Skriptsteuerung für die Geschwindigkeit hinzukommen).
Da sowohl PoV-Ray-Skripte als auch das Hilfsskript mit den Streckensegmenten einfacher ASCII-Text sind, öffne ich sowohl das Eingabe- wie das Ausgabefile ohne ios::binary. Trotzdem schreibt mein Programm aber anscheinend eine Binärdatei als Ausgabefile, denn wenn ich die vom Programm erzeugte Datei mit Kwrite öffne, bekomme ich eine Warnmeldung: "Die Datei ist binär, das Speichern wird zu einer fehlerhaften Datei führen". Wieso?
Hier der C++-Code:
C++: |
#include <iostream> #include <stdlib.h> #include <cstdlib> #include <fstream> #include <string> #include <vector> using namespace std;
int main(int argc, char* argv[]) { double x, y, z, d; x = atof(argv[1]); y = atof(argv[2]); z = atof(argv[3]); d = atof(argv[4]); ifstream track; string track_name; cout << "Track script? "; cin >> track_name; track.open(track_name.c_str()); if (!track) { cerr << track_name << " cannot be opened!\n"; exit (-1); } ofstream anim; string anim_name;
char ch; vector<char> puffer; short segments=1; // last line MUST NOT end with a \n ! while (track.get(ch)) { puffer.push_back(ch); if (ch == '\n') segments++; }; track.close(); cout << "Animation script? "; cin >> anim_name; anim.open(anim_name.c_str()); if (!anim) { cerr << anim_name << " cannot be opened!\n"; exit (-1); }
anim.write("#declare trans_general = <", 26); anim.write(argv[1], sizeof(argv[1])); anim.write(", ", 2); anim.write(argv[2], sizeof(argv[2])); anim.write(", ", 2); anim.write(argv[3], sizeof(argv[3])); anim.write(">;\n", 3); anim.write("#declare d_general = ", 21); anim.write(argv[4], sizeof(argv[4])); anim.put(EOF);
/* #declare i=0; // loop counter #declare trans=trans_general; // position of first rail segment (center of front side) #declare d=d_general; // orientation (degrees) of first rail segment */ return 0; }
|
Das Skript für die Streckensegmente:
0,20,0, 1,45,15, 0,15,0, 1,-45,15, 0,30,0, 1, 120, 15, 0, 25, 0, 0, 40, 0, 1, 60, 15, 0, 35, 0, 1, 90, 15, 0, 12.1495153401, 0, 1, -45, 15, 0, 20, 0, 1, -45, 15, 0, 40, 0, 1, 180, 15, 0, 25, 0, 1, -45, 15, 0, 15, 0, 1, 45, 15, 0, 13.0025254703, 0
(Zur Erklärung: die erste Zahl in jeder Zeile bezeichnet den Typ des Segments, 0 = Gerade, 1 = Kurve; die zweite Zahl bezeichnet bei Geraden die Länge in Metern, bei Kurven die Winkelgröße in Grad; die dritte Zahl wird bei Geraden ignoriert, bei Kurven bezeichnet sie den Radius in Metern)
Muss bei der gegenwärtigen Version des g++ bei Textdateien ein expliziter Schalter, etwa ios::text (oder so ähnlich) angegeben werden?
Bis bald im Khyberspace!
Yadgar
P. S. Meinen Avatar müsste ich auch mal aktualisieren... -- Flagmaker - ein Programmier-Blog Dieser Post wurde am 17.06.2009 um 22:17 Uhr von Yadgar editiert. |