| |
|
|
| |
| Author |
Message |
|
Hypothraxer
|
Posted: 01.10.2007 19:09
Post subject: Lustiges Programmieren mit Hypo (Teil n-1)
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Es ist mal wieder soweit: Ich habe mich entschieden, wieder mal ein wenig zu programmieren (oh was für ein Fehler...). Und natürlich gibt's jetzt schon Probleme  Es darf gelacht werden.
In einem ersten Schritt, soll ein Textfile, das aus Photomodeler exportiert wurde, umformatiert werden, so dass nur die Kameraparameter und die Bildnamen stehen bleiben. Das funktioniert soweit so gut - bist auf das extrahieren des Bildnamens. Mit dem untenstehenden Code gibt es nämlich folgenden Fehler:
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr
Die Idee wäre es, nur den Pfad zu erhalten (also z.B. D:\zeug\Schule\8. Semester\Close-Range Photogrammetry\kirche\DSC00961.JPG) - momentan steht eben auf der Zeile noch eine Ziffer vor dem Pfad, die ich nicht brauche.
Das Programm lässt sich kompilieren (mit g++ unter Fedora 7 aus der Eclipse IDE heraus) und startet auch, nur gibt's dann eben den oben genannten Fehler. Hat jemand Tipps?
Code: #include <iostream.h> #include <fstream.h> #include <string.h> #include <math.h> #include <iomanip.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #include <libxml/encoding.h> #include <libxml/xmlwriter.h> #define MaxDigits 24 using namespace std;
/* Definition of the variables of the interior and exterior orientaion parameters as well as the additional parameters */
struct Variablen { // Imagenames string imname; // Numbering double imnr; double ptnr; // E.O. double omega; double phi; double kappa; double X0; double Y0; double Z0; // I.O. double xo; double yo; double zo; // A.P's. double k1; double k2; double k3; double p1; double p2; double a; double s; // Measurements } vars;
int main()
{ fstream parameters; parameters.open("parameters.txt", ios::out); parameters << setprecision(8); fstream input; input.open("photo.txt", ios::in); input << setprecision(8); parameters << "--== Parameter File ==-- \n"; string tempname; size_t pos; int i = 0; double imnrminus = -1; while (!input.eof()) { while (i <= 4) { getline(input, tempname); i++; }
getline(input, tempname); //cout << tempname; pos = tempname.find('D'); vars.imname = tempname.substr(pos); input >> vars.imnr; input >> vars.X0; input >> vars.Y0; input >> vars.Z0; input >> vars.kappa; input >> vars.phi; input >> vars.omega; if (vars.imnr > imnrminus) { parameters << vars.imname << " " << vars.imnr << " " << vars.X0 << " " << vars.Y0 << " " << vars.Z0 << " " << vars.omega << " " << vars.phi << " " << vars.kappa << "\n"; i = 0; imnrminus = vars.imnr; } else { parameters.close(); input.close(); } } }
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 02.10.2007 08:11
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Hier noch ein Beispielfile, das eingelesen wird (für alle, die das mal laufen lassen wollen):
Code: Bundle Soln 0.005000 20 1.00000 0.10000 10.00000 100.00000 100.00000 100.00000 20.00000 20.00000 20.00000 9.0000 3.0000 2.2500 6.00000 4.50000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00600 0.00450 0.500000 0.500000 0.001000 0.000100 0.000100 0.001000 0.001000 0 D:\zeug\Schule\8. Semester\Close-Range Photogrammetry\kirche\DSC00961.JPG 0 0.051 -0.010 0.029 0.233 0.456 0.090 0 1.0000 1.0000 1.0000 2.0000 2.0000 2.0000
0 5.700 2.880 2.145 5.76000 4.29000 0.00000 0.00000 0.00000 0.00000 0.00000 0 0.10000 0.00576 0.00429 0.500000 0.500000 0.001000 0.000100 0.000100 0.001000 0.001000 1 D:\zeug\Schule\8. Semester\Close-Range Photogrammetry\kirche\DSC00962.JPG 1 0.002 -1.298 -0.154 0.169 -0.174 14.829 1 1.0000 1.0000 1.0000 2.0000 2.0000 2.0000
1 5.700 2.880 2.145 5.76000 4.29000 0.00000 0.00000 0.00000 0.00000 0.00000 1 0.10000 0.00576 0.00429 0.500000 0.500000 0.001000 0.000100 0.000100 0.001000 0.001000 2 D:\zeug\Schule\8. Semester\Close-Range Photogrammetry\kirche\DSC00963.JPG 2 -0.054 -2.657 -0.892 0.149 -1.175 29.081 2 1.0000 1.0000 1.0000 2.0000 2.0000 2.0000
2 5.700 2.880 2.145 5.76000 4.29000 0.00000 0.00000 0.00000 0.00000 0.00000 2 0.10000 0.00576 0.00429 0.500000 0.500000 0.001000 0.000100 0.000100 0.001000 0.001000
1 0.71437 0.27820 -6.69035 0.002003 0.002813 0.009002 2 -0.17102 -1.79700 -5.40965 0.002432 0.002884 0.007356 3 -0.02691 -0.08119 -6.78864 0.001652 0.002526 0.009214 4 0.05849 0.93013 -6.24781 0.001533 0.003288 0.007922 5 0.45366 1.45012 -4.58297 0.002179 0.004338 0.005073 6 -0.22848 1.09201 -5.94691 0.001505 0.003346 0.007133 7 -0.15280 1.08079 -5.94672 0.001485 0.003335 0.007131 10 -1.08806 0.70237 -6.57472 0.003964 0.004403 0.019192 11 0.47901 -0.11847 -6.75040 0.001791 0.002452 0.008991 12 0.48335 0.40738 -6.67019 0.001846 0.002960 0.009063 13 -0.52337 0.36664 -6.96850 0.002020 0.003208 0.010429 17 0.32967 -1.03821 -6.51098 0.001521 0.001820 0.007753 20 1.28678 1.42997 -4.53375 0.002819 0.004231 0.004921 21 0.66248 1.45953 -4.55928 0.002280 0.004324 0.004993 22 -1.17226 1.44728 -4.64546 0.003114 0.004466 0.005489 23 -0.45021 -0.37149 -6.78000 0.001701 0.002246 0.008980 24 -0.59314 -0.52309 -6.74592 0.001745 0.002104 0.008753 25 1.71277 0.47087 -6.55380 0.003019 0.002811 0.008304 26 1.59963 -0.70535 -6.59597 0.002650 0.001933 0.007782 27 -1.89390 0.52801 -6.47112 0.003065 0.002801 0.008009 28 -1.20728 -0.86463 -6.61698 0.002186 0.001835 0.008066 29 0.53540 -1.72077 -5.36309 0.002452 0.002912 0.007588 30 -0.76095 -1.49554 -5.38147 0.002758 0.002608 0.007940 31 -2.22522 -0.12201 -6.36057 0.003432 0.002089 0.007509 32 1.30675 1.06353 -5.91132 0.002308 0.003184 0.006823 33 -1.48217 0.88412 -6.35306 0.002581 0.003198 0.007988
0 1 1707.0194 941.0000 1.00000 1.00000 0 2 1312.6877 1982.1688 1.00000 1.00000 0 3 1398.7554 1089.4432 1.00000 1.00000 0 4 1435.5496 640.2500 1.00000 1.00000 0 5 1677.3184 173.1250 1.00000 1.00000 0 6 1302.1768 542.8604 1.00000 1.00000 0 7 1337.9298 548.3782 1.00000 1.00000 0 10 951.4952 756.1250 1.00000 1.00000 0 11 1606.5133 1105.7500 1.00000 1.00000 0 12 1611.4770 886.2500 1.00000 1.00000 0 13 1202.2155 908.5390 1.00000 1.00000 0 17 1548.0847 1502.1104 1.00000 1.00000 0 20 2188.5000 176.5000 1.00000 1.00000 0 21 1805.3971 162.7500 1.00000 1.00000 0 22 707.4334 185.5000 1.00000 1.00000 0 23 1224.4843 1208.5162 1.00000 1.00000 0 24 1164.4286 1271.2857 1.00000 1.00000 0 25 2136.0048 857.7500 1.00000 1.00000 0 26 2084.3293 1358.0000 1.00000 1.00000 0 27 598.1719 825.3880 1.00000 1.00000 0 28 899.7458 1418.4026 1.00000 1.00000 0 29 1678.9286 1952.5114 1.00000 1.00000 0 30 1007.4697 1827.5000 1.00000 1.00000 0 31 437.5000 1105.0000 1.00000 1.00000 0 32 2021.5545 554.9042 1.00000 1.00000 0 33 764.1768 665.1266 1.00000 1.00000 1 1 1693.7300 1119.5260 1.00000 1.00000 1 2 1299.2034 2091.5000 1.00000 1.00000 1 3 1386.7470 1274.1055 1.00000 1.00000 1 4 1424.0944 798.0000 1.00000 1.00000 1 5 1654.5738 199.0000 1.00000 1.00000 1 6 1297.6489 681.5422 1.00000 1.00000 1 7 1331.3971 686.0568 1.00000 1.00000 1 10 947.3898 933.5227 1.00000 1.00000 1 11 1597.0690 1287.5032 1.00000 1.00000 1 12 1597.8765 1064.7127 1.00000 1.00000 1 13 1190.8402 1109.5000 1.00000 1.00000 1 17 1543.5000 1678.5000 1.00000 1.00000 1 20 2127.9153 195.7500 1.00000 1.00000 1 21 1772.4213 187.7500 1.00000 1.00000 1 22 752.0291 215.2500 1.00000 1.00000 1 23 1209.5182 1393.6640 1.00000 1.00000 1 24 1145.9092 1456.8701 1.00000 1.00000 1 25 2115.1816 1028.0000 1.00000 1.00000 1 26 2092.8741 1531.8198 1.00000 1.00000 1 27 597.0981 990.2532 1.00000 1.00000 1 28 869.1574 1600.5000 1.00000 1.00000 1 29 1696.1223 2049.4692 1.00000 1.00000 1 30 973.1840 1914.7451 1.00000 1.00000 1 31 414.4286 1255.5714 1.00000 1.00000 1 32 1988.3644 689.8750 1.00000 1.00000 1 33 768.8499 830.4870 1.00000 1.00000 2 22 759.3293 113.4594 1.00000 1.00000 2 5 1623.5472 94.1786 1.00000 1.00000 2 21 1736.3547 81.4838 1.00000 1.00000 2 20 2073.6901 85.2500 1.00000 1.00000 2 12 1579.5303 1112.5000 1.00000 1.00000 2 1 1679.5012 1165.8961 1.00000 1.00000 2 11 1583.9564 1333.7500 1.00000 1.00000 2 3 1361.6586 1325.3653 1.00000 1.00000 2 13 1157.0448 1184.4399 1.00000 1.00000 2 4 1400.5000 824.0000 1.00000 1.00000 2 7 1306.6683 691.5227 1.00000 1.00000 2 6 1273.2542 687.1753 1.00000 1.00000 2 17 1537.0508 1703.9123 1.00000 1.00000 2 2 1273.7240 1984.7500 1.00000 1.00000 2 23 1172.5012 1443.8669 1.00000 1.00000 2 24 1105.1162 1503.0682 1.00000 1.00000 2 25 2109.8571 1065.8571 1.00000 1.00000 2 26 2122.3039 1559.4919 1.00000 1.00000 2 27 547.2554 1022.4513 1.00000 1.00000 2 28 800.2990 1637.8799 1.00000 1.00000 2 29 1724.7700 1926.1055 1.00000 1.00000 2 30 908.7143 1786.4286 1.00000 1.00000 2 31 336.7312 1261.2808 1.00000 1.00000 2 32 1963.3051 691.5455 1.00000 1.00000 2 33 734.5872 863.0211 1.00000 1.00000
1 1 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 7 8 1 10 9 1 11 10 1 12 11 1 13 12 1 17 13 1 20 14 1 21 15 1 22 16 1 23 17 1 24 18 1 25 19 1 26 20 1 27 21 1 28 22 1 29 23 1 30 24 1 31 25 1 32 26 1 33
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 9 2 10 2 11 2 12 2 13 2 14 2 15 2 16 2 17 2 18 2 19 2 20 2 21 2 22 2 23 2 24 2 25 2 26
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 02.10.2007 14:00
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Ich hab das Problem gelöst. Scheinbar schmeckten dem Programm die Leerzeilen nach den Kameraparametern nicht so (das suchen in einem leeren String hat ihn wohl verwirrt?). Ich habe es jetzt mal umgeschrieben - und es funktioniert soweit. Die letzte Frage dürfte das aber nicht gewesen sein
Code: #include <iostream.h> #include <fstream.h> #include <string.h> #include <math.h> #include <iomanip.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #include <libxml/parser.h> #include <libxml/tree.h> #define MaxDigits 24 using namespace std;
/* Definition of the variables of the interior and exterior orientation parameters as well as the additional parameters */
struct Variablen { // Imagenames string imname; // Numbering double imnr; double ptnr; // E.O. double omega; double phi; double kappa; double X0; double Y0; double Z0; // I.O. double xo; double yo; double zo; // A.P's. double k1; double k2; double k3; double p1; double p2; double a; double s; // Measurements } vars;
int main()
{ fstream parameters; parameters.open("parameters.txt", ios::out); parameters << setprecision(8); fstream input; input.open("photo.txt", ios::in); input << setprecision(8); parameters << "--== Parameter File ==-- \n"; string tempname; int headerignore = 0; double imnrminus = -1; while (imnrminus != -2) { while (headerignore <= 4) { getline(input, tempname); headerignore++; } getline(input, tempname); input >> vars.imnr; input >> vars.X0; input >> vars.Y0; input >> vars.Z0; input >> vars.kappa; input >> vars.phi; input >> vars.omega; if (vars.imnr > imnrminus) { vars.imname = tempname.substr(5); parameters << vars.imname << "\n" << vars.imnr << " " << vars.X0 << " " << vars.Y0 << " " << vars.Z0 << " " << vars.omega << " " << vars.phi << " " << vars.kappa << "\n"; headerignore = 0; imnrminus = vars.imnr; } else { imnrminus = -2; } } parameters.close(); input.close(); }
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 03.10.2007 16:32
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Nach etwas umschreiben, liest das Ding nun ein Photomodeler Export File aus und schreibt die Kameraparameter in ein XML-File rein. Schauerlich programmiert
Code: #include <iostream.h> #include <fstream.h> #include <string.h> #include <math.h> #include <iomanip.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #include <libxml/parser.h> #include <libxml/tree.h> #define MaxDigits 24 using namespace std;
#if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
/* Definition of the variables of the interior and exterior orientation parameters as well as the additional parameters */
struct Variables { // Images string imname; int imnr; double w; double h; // E.O. double omega; double phi; double kappa; double X0; double Y0; double Z0; // I.O. double xh; double yh; double c; // A.P's. double k1; double k2; double k3; double p1; double p2; double a; double s; // Measurements } vars;
int main(int argc, char **argv)
{ // XML xmlDocPtr doc = NULL; /* document pointer */ xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */ xmlDtdPtr dtd = NULL; /* DTD pointer */ LIBXML_TEST_VERSION; /* * Creates a new document, a node and set it as a root node */ doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root_node); /* * Creates a DTD declaration. Isn't mandatory. */ dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd"); // Stream Input fstream parameters; parameters.open("parameters.txt", ios::out); parameters << setprecision(8); fstream input; input.open("photo.txt", ios::in); input << setprecision(8); parameters << "--== Parameter File ==-- \n"; string tempname; char buffer[128]; string file = "test.xml"; int headerignore = 0, dummy = 0, imnrminus = -1; while (imnrminus != -2) { while (headerignore <= 4) { getline(input, tempname); headerignore++; } getline(input, vars.imname); input >> vars.imnr; input >> vars.X0; input >> vars.Y0; input >> vars.Z0; input >> vars.kappa; input >> vars.phi; input >> vars.omega; getline(input, tempname); getline(input, tempname); input >> dummy; input >> vars.c; input >> vars.xh; input >> vars.yh; input >> vars.w; input >> vars.h; input >> vars.k1; input >> vars.k2; input >> vars.k3; input >> vars.p1; input >> vars.p2; if (vars.imnr > imnrminus) { vars.imname = vars.imname.substr(5); parameters << vars.imname << "\n" << vars.imnr << " " << vars.X0 << " " << vars.Y0 << " " << vars.Z0 << " " << vars.omega << " " << vars.phi << " " << vars.kappa << "\n" << vars.c << " " << vars.xh << " " << vars.yh << " " << vars.w << " " << vars.h << " " << vars.k1 << " " << vars.k2 << " " << vars.k3 << " " << vars.p1 << " " << vars.p2 << "\n"; // Building XML Tree // Build first node to make the different images distinguishable node = xmlNewChild(root_node, NULL, BAD_CAST "Image", BAD_CAST NULL); // Include Image Number, Path and size // Might produce memory leaks - check c_str() further node1 = xmlNewChild(node, NULL, BAD_CAST "Pfad", BAD_CAST vars.imname.c_str()); sprintf(buffer,"%d",vars.imnr); node1 = xmlNewChild(node, NULL, BAD_CAST "Imagenumber", BAD_CAST buffer); sprintf(buffer,"%f",vars.w); node1 = xmlNewChild(node, NULL, BAD_CAST "Width", BAD_CAST buffer); sprintf(buffer,"%f",vars.h); node1 = xmlNewChild(node, NULL, BAD_CAST "Height", BAD_CAST buffer); // Include I.O. node1 = xmlNewChild(node, NULL, BAD_CAST "Interior_Orientation", BAD_CAST NULL); sprintf(buffer,"%f",vars.c); node1 = xmlNewChild(node, NULL, BAD_CAST "c", BAD_CAST buffer); sprintf(buffer,"%f",vars.xh); node1 = xmlNewChild(node, NULL, BAD_CAST "xh", BAD_CAST buffer); sprintf(buffer,"%f",vars.yh); node1 = xmlNewChild(node, NULL, BAD_CAST "yh", BAD_CAST buffer); // Include E.0. node1 = xmlNewChild(node, NULL, BAD_CAST "Exterior_Orientation", BAD_CAST NULL); sprintf(buffer,"%f",vars.X0); node1 = xmlNewChild(node, NULL, BAD_CAST "X0", BAD_CAST buffer); sprintf(buffer,"%f",vars.Y0); node1 = xmlNewChild(node, NULL, BAD_CAST "Y0", BAD_CAST buffer); sprintf(buffer,"%f",vars.Z0); node1 = xmlNewChild(node, NULL, BAD_CAST "Z0", BAD_CAST buffer); sprintf(buffer,"%f",vars.omega); node1 = xmlNewChild(node, NULL, BAD_CAST "Omega", BAD_CAST buffer); sprintf(buffer,"%f",vars.phi); node1 = xmlNewChild(node, NULL, BAD_CAST "Phi", BAD_CAST buffer); sprintf(buffer,"%f",vars.kappa); node1 = xmlNewChild(node, NULL, BAD_CAST "Kappa", BAD_CAST buffer); // Include A.P's. node1 = xmlNewChild(node, NULL, BAD_CAST "Additional_Parameters", BAD_CAST NULL); sprintf(buffer,"%f",vars.k1); node1 = xmlNewChild(node, NULL, BAD_CAST "K1", BAD_CAST buffer); sprintf(buffer,"%f",vars.k2); node1 = xmlNewChild(node, NULL, BAD_CAST "K2", BAD_CAST buffer); sprintf(buffer,"%f",vars.k3); node1 = xmlNewChild(node, NULL, BAD_CAST "K3", BAD_CAST buffer); sprintf(buffer,"%f",vars.p1); node1 = xmlNewChild(node, NULL, BAD_CAST "P1", BAD_CAST buffer); sprintf(buffer,"%f",vars.p2); node1 = xmlNewChild(node, NULL, BAD_CAST "P2", BAD_CAST buffer); headerignore = 3; imnrminus = vars.imnr; } else { imnrminus = -2; } } parameters.close(); input.close();
/* * Dumping document to stdio or file */ xmlSaveFormatFileEnc(file.c_str(), doc, "UTF-8", 1); /* * Save to a file */ //xmlSaveFormatFile("xml", xmlDocPtr cur, 1); /*free the document */ xmlFreeDoc(doc);
/* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser();
/* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "tree support not compiled in\n"); exit(1); } #endif
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 08.10.2007 16:30
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Nächstes Problem: Ich habe ein File, in dem pro Zeile ein Punkt definiert wird (X,Y,Z Koordinate). Dies soll nun in einen mehrdimensionalen Array gepackt werden (pro Punkt eine Zeile - pro Zeile drei Zellen (X,Y,Z)). Da ich von vornherein nicht weiss, wie gross das File ist, muss ich das wohl einen Teil des Arrays dynamisch anpassen. Ich habe es geschafft, einen eindimensionalen Array dynamisch anzupassen - aber bei zwei Dimensionen versagt es bei mir komplett.
Um konkrete Tipps wäre ich froh - ich bin kurz davor, den Array statisch zu definieren, indem ich das File durchgehe, und die Zeilen zähle...
Code: #include <iostream.h> #include <fstream.h> #include <string.h> #include <math.h> #include <iomanip.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #define MaxDigits 24 using namespace std;
/* Definition of the variables of the interior and exterior orientation parameters as well as the additional parameters */
struct Variables {
} vars;
int main()
{ // Stream Input fstream sampled; sampled.open("sampled.xyz", ios::out); // Define sampled output file sampled << setprecision(16); fstream pointcloud; pointcloud.open("pointcloud.xyz", ios::in); // Define pointcloud input file pointcloud << setprecision(16); int linecount = 0; string temporary; int max = 250000; double *rows = new double [max]; //rows[0] = new int[3]; rows = (double *)calloc(max, sizeof(double)); if(NULL == rows) { printf("Not enough memory\n"); exit(0); } while (linecount != 2) { getline(pointcloud, temporary); linecount++; } linecount = 1; while (!pointcloud.eof()) { if (linecount > max - 2) { max = max + 250000; rows = (double *)realloc(rows,max*sizeof(double)); if(NULL == rows) { printf("Not enough memory\n"); exit(1); } printf("Speicherplatz reserviert " " (%d Bytes)\n",sizeof(double)*max); } pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount]; sampled << rows[linecount] << "\n"; /* cout << pcheap[linecount][1] << "\n"; cout << pcheap[linecount][2] << "\n"; cout << pcheap[linecount][3] << "\n"; cout << linecount << "\n"; */ linecount++; } //free(rows); // Define the grid according to the extents of the pointcloud
sampled.close(); pointcloud.close(); }
|
|
| Top |
|
 |
|
thewulf
|
Posted: 08.10.2007 17:23
Post subject:
|
|
|
Joined: 20.10.2004 01:57 Posts: 227 Location: Wien
|
Vorschlag Nummer 1:
Gehe zuerst das File durch und zähle die Zeilen (im Code, nicht manuell  ). Dann erst leg das Array an und lies die Daten ein. Somit ersparst du dir das Resizen.
Vorschlag Nummer 2:
Wenn ich mich nicht verlesen habe, legst du hier nie ein zweidimensionales Array an. Außerdem solltest du "new/delete" und "malloc/free" nie vermischen. Entweder - oder.
Möglichkeit eins (calloc):
Code: double *rows = calloc(nNumRows * 3, sizeof(double)); ... free(rows); Möglichkeit zwei (new) - sauberer: Code: double **rows = new double[nNumRows]; for (int i=0; i < nNumRows; i++) rows[i] = new double[3]; ... for (int i=0; i < nNumRows; i++) delete []rows[i];
delete []rows; Möglichkeit drei (new) - mit Structs: Code: struct TCoordinates { double x; double y; double z;
TCoordinates() { x = y = z = 0.0; } };
TCoordinates *rows = new TCoordinates[nNumRows]; ... delete []rows;
Letztere Methode ist die meiner Meinung nach die schönste und sauberste 
_________________ stillbeschäftigung
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 08.10.2007 18:16
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
thewulf wrote: Vorschlag Nummer 1: Gehe zuerst das File durch und zähle die Zeilen (im Code, nicht manuell  ). Dann erst leg das Array an und lies die Daten ein. Somit ersparst du dir das Resizen. Jo - ich gewöhn mich immer mehr daran, es so zu machen. Da gibt es momentan noch ein Problem, aber ich glaube das liegt mittlerweile an der Uhrzeit. Ich werde mal sehen, ob das morgen geht... thewulf wrote: Vorschlag Nummer 2: Wenn ich mich nicht verlesen habe, legst du hier nie ein zweidimensionales Array an. Außerdem solltest du "new/delete" und "malloc/free" nie vermischen. Entweder - oder.
Ja genau - weil ich es nicht geschafft habe, das Ganze in ein zweidimensionales Array zu konvertieren  An sich sollte es aber eines sein (in den "Spalten" die Koordinaten und in den "Zeilen" die jeweiligen Punkte). Aber eben - sehr wahrscheinlich lese ich mir einfach nur die Zeilen raus - ich drehe langsam durch  Trotzdem vielen Dank für die Hilfe!
Edit: Es sieht so aus, als fällt die Zeilen-Zähl-Methode weg. Grund: Segementation Fault :b (Vermutung: Er mag es nicht, dass man einem Array so viel Speicher zur Verfügung stellt?). Interessanterweise gibt es keinen Segementation-Fault, wenn ich das File in einen eindimensionalen Array einlese wie oben. Woran kann das liegen? Das File beinhaltet im übrigen ~1.2 Millionen Punkte (also ~3.6 Millionen Koordinaten).
|
|
| Top |
|
 |
|
Daniel
|
Posted: 08.10.2007 19:33
Post subject:
|
|
|
Joined: 18.10.2004 13:48 Posts: 757
|
Hypothraxer wrote: Interessanterweise gibt es keinen Segementation-Fault, wenn ich das File in einen eindimensionalen Array einlese wie oben. Woran kann das liegen? Das File beinhaltet im übrigen ~1.2 Millionen Punkte (also ~3.6 Millionen Koordinaten).
Das liegt daran, daß die Speicherverwaltung in größeren Blöcken arbeitet. Obwohl du nur 24 Bytes pro Punkt anforderst, werden gleich 4 KiB bereitgestellt, bei 1.2 Millionen Punkten sprengst du damit den Adressraum bei 32 Bit Betriebssystemen.
Da jeder Punkt wohl gleich aussehen wird, ist der dritte Vorschlag mit der Struktur eindeutig der beste.
Edit: der dritte ist nicht der beste, sondern der einzig wahre. 
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 08.10.2007 20:57
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Daniel wrote: Das liegt daran, daß die Speicherverwaltung in größeren Blöcken arbeitet. Obwohl du nur 24 Bytes pro Punkt anforderst, werden gleich 4 KiB bereitgestellt, bei 1.2 Millionen Punkten sprengst du damit den Adressraum bei 32 Bit Betriebssystemen. Da jeder Punkt wohl gleich aussehen wird, ist der dritte Vorschlag mit der Struktur eindeutig der beste. Edit: der dritte ist nicht der beste, sondern der einzig wahre. 
Wenn ich das also richtig verstehe, dann ist dies mit einer statischen Zuweisung eines Arrays gar nicht möglich ist, sondern nur via Pointer? Ich werd mir in dem Fall morgen die Variante drei nochmal ansehen (huiui).
|
|
| Top |
|
 |
|
thewulf
|
Posted: 08.10.2007 23:26
Post subject:
|
|
|
Joined: 20.10.2004 01:57 Posts: 227 Location: Wien
|
Hypothraxer wrote: An sich sollte es aber eines sein (in den "Spalten" die Koordinaten und in den "Zeilen" die jeweiligen Punkte). Aber eben - sehr wahrscheinlich lese ich mir einfach nur die Zeilen raus - ich drehe langsam durch 
Steht denn in rows[linecount] immer der richtige Wert drin, wenn du von pointcloud einliest? Was ist denn als Trenner für die Koordinaten definiert? Selbst wenn alles richtig eingelesen würde, schreibst du bei
Code: pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount];
dreimal in den selben Index des Arrays. Das macht für das Zielfile jetzt nichts aus, schließlich schreibst du den Wert ohnehin gleich nach dem Einlesen wieder hinaus. Aber falls du nachher rows noch für irgendwas verwenden willst, wirst du wohl nicht die richtigen Daten zur Verfügung haben. Falls du rows nicht mehr brauchst, ist das Array sowieso unnötig.
Weil ichs grad sehe: Die Arrayindizierung muss bei 0 beginnen!
_________________ stillbeschäftigung
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 09.10.2007 08:28
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
thewulf wrote: Steht denn in rows[linecount] immer der richtige Wert drin, wenn du von pointcloud einliest? Was ist denn als Trenner für die Koordinaten definiert?
Der Trenner ist einfach ein Leerzeichen. So sehen die ersten paar Zeilen aus (das Ganze ist 37 MiB gross  ): Code: # Geomagic Studio # New Model 0.3556868 -0.1247339 -0.9005797 0.3558227 -0.1247327 -0.9000115 0.3556147 -0.1247623 -0.9000360 0.3550872 -0.1248465 -0.8998497 0.3551547 -0.1246499 -0.8996143 0.3554379 -0.1246179 -0.8993223
Eingelesen wird immer richtig, weil es ein Stream ist (liest die Dinger einfach sequentiell aus und das File ändert sich ja nicht, bis auf die ersten zwei Zeilen, die ich aber ignoriere). thewulf wrote: Selbst wenn alles richtig eingelesen würde, schreibst du bei Code: pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount]; sampled << rows[linecount]; pointcloud >> rows[linecount]; dreimal in den selben Index des Arrays. Das macht für das Zielfile jetzt nichts aus, schließlich schreibst du den Wert ohnehin gleich nach dem Einlesen wieder hinaus. Aber falls du nachher rows noch für irgendwas verwenden willst, wirst du wohl nicht die richtigen Daten zur Verfügung haben. Falls du rows nicht mehr brauchst, ist das Array sowieso unnötig. Jo - das ist ein Fehler. Jeder Wert sollte in einen neuen Array-index gespeichert werden. Das ist wohl noch eine alte Code-Version (oder aber ich habs schlicht verpennt :/ ). thewulf wrote: Weil ichs grad sehe: Die Arrayindizierung muss bei 0 beginnen!
Jup - auch das ein Fehler (siehe "verpennt")  Ich probiere jetzt mal die Struct-Variante. Edit: Was mich bei der Struct-Variante interessiert: Ich muss ja die nNumRows ja kennen (hier: Code: TCoordinates *rows = new TCoordinates[nNumRows];
Die kenn ich aber nicht, da ich das File erst durchlaufen müsste. Oder ist die Meinung die, dass ich das File erst einmal durchlaufe, die Zeilen zähle und dann die Anzahl Zeilen in nNumRows einfüge? Oder funktioniert das dann mit dem calloc (wobei du ja gesagt hast, dass man das nicht mischen sollte  )? (Bin momentan eben ein wenig Ratlos.
|
|
| Top |
|
 |
|
thewulf
|
Posted: 09.10.2007 09:27
Post subject:
|
|
|
Joined: 20.10.2004 01:57 Posts: 227 Location: Wien
|
|
Ja, das war für alle drei Varianten so gemeint, dass du zuerst das File durchläufst, die Anzahl der Koordinatensätze zählst, dann erst das entsprechende Array anlegst und schließlich die Daten einliest.
_________________ stillbeschäftigung
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 09.10.2007 09:33
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
Ah okay. Ich stand vorhin ein wenig auf dem Syntax-Schlauch. Ich glaube jetzt sollte es funktionieren 
|
|
| Top |
|
 |
|
Hypothraxer
|
Posted: 09.10.2007 10:34
Post subject:
|
|
|
Joined: 18.10.2004 15:02 Posts: 1113 Location: Schweiz
|
So - es hat tatsächlich funktioniert (ein riiiiiiiiiiiiiesiges Dankeschön an Wulf und Daniel!). So sieht's momentan aus:
Code: #include <iostream.h> #include <fstream.h> #include <string.h> #include <math.h> #include <iomanip.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #define MaxDigits 24 using namespace std;
// Struct to read out the pointcloud file into an array-like structure struct TCoordinates { double x; double y; double z;
TCoordinates() { x = y = z = 0.0; } };
int main()
{
// Stream Input /* fstream sampled; sampled.open("sampled.xyz", ios::out); // Define sampled output file sampled << setprecision(16); */ fstream pointcloud; pointcloud.open("pointcloud.xyz", ios::in); // Define pointcloud input file pointcloud << setprecision(16); int linecount = 1, headerignore = 0; double xFile, yFile, zFile; string temporary; // Count the number of points in the file while(!pointcloud.eof()){ // Ignore the first two lines while(headerignore != 2){ getline(pointcloud,temporary); headerignore++; } getline(pointcloud,temporary); linecount++; } pointcloud.close(); fstream pointcloud2; pointcloud2.open("pointcloud.xyz", ios::in); // Define pointcloud input file pointcloud2 << setprecision(16); // Define the size of the array to store the coordinates in TCoordinates *rows = new TCoordinates[linecount]; linecount = 0; headerignore = 0; // Read out the file and store the data in the newly created array while(!pointcloud2.eof()){ // Ignore the first two lines while(headerignore != 2){ getline(pointcloud2,temporary); headerignore++; } pointcloud2 >> xFile; rows[linecount].x = xFile; pointcloud2 >> yFile; rows[linecount].y = yFile; pointcloud2 >> zFile; rows[linecount].z = zFile; linecount++; } cout << rows[1226363].x << " " << rows[1226363].y << " " << rows[1226363].z; delete []rows; pointcloud2.close(); //sampled.close(); }
Eine Frage habe ich allerdings noch: Wenn ich die Werte auf der Konsole ausgebe, so werden nicht alle Stellen angezeigt (nur die ersten 6) - ich gehe aber davon aus, dass sämtliche Stellen im Array vorhanden sind. Ist dies zutreffend, oder sehe ich das zu blauäugig?
Edit: Ich habs mal im Debugger angesehen und er scheint alle Stellen mitzunehmen. Teilweise macht er aber gar seltsame Sachen: Z.B. wird aus dem ursprünglichen 0.9005797 ein 0.900579699999998 - das macht er aber längst nicht bei allen Koordinaten. Woher kommt das?
|
|
| Top |
|
 |
|
Daniel
|
Posted: 09.10.2007 11:19
Post subject:
|
|
|
Joined: 18.10.2004 13:48 Posts: 757
|
Hypothraxer wrote: Edit: Ich habs mal im Debugger angesehen und er scheint alle Stellen mitzunehmen. Teilweise macht er aber gar seltsame Sachen: Z.B. wird aus dem ursprünglichen 0.9005797 ein 0.900579699999998 - das macht er aber längst nicht bei allen Koordinaten. Woher kommt das?
Zahlen werden binär gespeichert, nicht dezimal. Während im Dezimalsystem die Stellen nach dem Komma die Wertigkeit 1/10, 1/100, 1/1000 usw. haben, sind es eben 1/2, 1/4, 1/8, 1/16, 1/32 usw. im Binärsystem.
Genau so, wie du Pi (oder 1/3, 1/7, ...) im Dezimalsystem niemals exakt darstellen kannst (unendlich Nachkommastellen), kannst du nicht jede dezimal exakt darstellbare Zahl binär exakt darstellen, sondern nur fast.
|
|
| Top |
|
 |
| Who is online |
Users browsing this forum: No registered users and 1 guest |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|
|
| |
 |
|
|