У меня есть программа, которая отображает вещи из файлов .raw, вот пример:
1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000
1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 0.999999 -1.000001 1.000000
1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 0.999999 -1.000001 1.000000 1.000000 -1.000000 -1.000000
1.000000 -1.000000 -1.000000 0.999999 -1.000001 1.000000 -1.000000 -1.000000 1.000000 - 1.000000 -1.000000 -1.000000
-1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 - 1.000000 1.000000 -1.000000
1.000000 0.999999 1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000
Это просто грани куба, моя проблема в том, что этот файл имеет размер 650 байт, теперь, когда я загружаю программу, программа занимает 20 МБ. Это не такая большая проблема, но при загрузке гораздо больших файлов это может стать большой проблемой.
Вот код для моего файлового выражения (извините, если он грязный, я совершенно не знаком с C ++):
/*
* PhraseObj.cpp
*
* Created on: Nov 5, 2011
* Author: tom
*/
#include "PhraseObj.h"
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "obj.h"
PhraseObj::PhraseObj(string file)
{
FILE.open(file.c_str());
cout << FILE.is_open() << "\n";
}
obj PhraseObj::getObj()
{
string line;
Polygon P;
vertex V;
obj O;
int place;
int NextPos;
float x;
float y;
float z;
getline(FILE, line);
while (!FILE.eof()) {
cout << "new line" << "\n";
place = 0;
while (place != string::npos) {
if (place == (line.length() - 1)) {
break;
}
NextPos = line.find(" ", place + 1);
line.substr(place, (NextPos - place) - 1);
cout << line.substr(place, (NextPos - place) - 1).c_str() << " ";
x =::atof(line.substr(place, (NextPos - place) - 1).c_str());
V.x(x);
cout << x << "\n";
place = NextPos;
NextPos = line.find(" ", place + 1);
line.substr(place, NextPos - place);
cout << line.substr(place + 1, (NextPos - place) - 1).c_str() << " ";
y =::atof(line.substr(place + 1, (NextPos - place) - 1).c_str());
V.y(y);
cout << y << "\n";
place = NextPos;
NextPos = line.find(" ", place + 1);
line.substr(place + 1, NextPos - place);
cout << line.substr(place + 1, (NextPos - place) - 1).c_str() << " ";
z =::atof(line.substr(place + 1, (NextPos - place) - 1).c_str());
V.z(z);
cout << z << "\n";
P.addPoint(V);
place = line.find(" ", place + 1);
cout << "place: " << place << " " << "length:" << line.length() << "\n";
}
getline(FILE, line);
O.AddPolygon(P);
}
cout << "returning" << "\n";
try {
return O;
}
catch(bad_alloc & ba) {
cout << "bad_alloc caught: " << ba.what() << endl;
}
}
void PhraseObj::closeFile()
{
FILE.close();
}
bool PhraseObj::isEnd()
{
return FILE.eof();
}
Несколько примечаний, вершины - это числа с координатами x, y и z.
Многоугольник - это вектор вершин.
Объект является вектором многоугольника.
Спасибо, Том.
и vertex.h:
/*
* vertex.h
*
* Created on: Oct 26, 2011
* Author: tom
*/
#ifndef VERTEX_H_
#define VERTEX_H_
class vertex {
float x_;
float y_;
float z_;
public:
//here are some getters
float x() {return x_;} ;
float y() {return y_;} ;
float z() {return z_;} ;
// and now for some setters
void x(float _x) {x_ = _x;} ;
void y(float _y) {y_ = _y;} ;
void z(float _z) {z_ = _z;} ;
};
#endif /* VERTEX_H_ */
и polygon.cpp:
/*
* Polygon.cpp
*
* Created on: Oct 26, 2011
* Author: tom
*/
#include "Polygon.h"
using namespace std;
void Polygon::addPoint(vertex V) {
point.push_back(V);
}
int Polygon::getNumOfPoints() {
return point.size();
}
vertex Polygon::getPoint(int I) {
return point.at(I);
}