Subversion Repositories gelsvn

Rev

Rev 125 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
61 jab 1
#ifndef __SAVE_RAW_H
2
#define __SAVE_RAW_H
3
 
4
#include <iostream>
5
#include <iomanip>
6
#include <fstream>
7
#include "GridAlgorithm.h"
8
 
9
namespace Geometry 
10
{
11
	template<class G>
12
		class VolSaver
13
		{
14
		public:
15
			typedef typename G::DataType DataType;
16
 
17
		private:
18
			std::ofstream of;
19
			const float min_val, max_val;
20
			const float diff;
21
			float old;
22
		public:
23
 
24
 			VolSaver(const std::string& name, float _min_val, float _max_val): 
25
				of(name.c_str(), std::ios::binary),
26
				min_val(_min_val), 
27
				max_val(_max_val),
28
				diff(max_val - min_val) {}
29
 
30
			void operator()(const CGLA::Vec3i& pi, const float& vox_val)
31
				{
32
					float scaled = (vox_val-min_val) / diff;
33
					float clamped = 255.0f *(CGLA::s_min(1.0f,CGLA::s_max(0.0f,scaled)));
34
					unsigned char x = static_cast<unsigned char>(clamped);
35
					of.write((char*) &x, 1);
36
				}	
37
		};
38
 
39
	template<class G>
40
		class VolSaverAscii
41
		{
42
		public:
43
			typedef typename G::DataType DataType;
44
 
45
		private:
46
			std::ofstream of;
47
			const float min_val, max_val;
48
			float old;
49
		public:
50
 
51
 			VolSaverAscii(const std::string& name, float _min_val, float _max_val): 
52
				of(name.c_str()),
53
				min_val(_min_val), 
54
				max_val(_max_val) {} 
55
 
56
			void operator()(const CGLA::Vec3i& pi, const float& vox_val)
57
				{
58
					if(vox_val > min_val && vox_val < max_val)
59
						of << pi[0] << " " << pi[1] << " " << pi[2]
60
							 << " " << vox_val << endl;
61
				}	
62
		};
63
 
64
 
65
	template<class G>
66
		class VolSaverFloat
67
		{
68
		public:
69
			typedef typename G::DataType DataType;
70
 
71
		private:
72
			std::ofstream of;
73
		public:
74
 
75
			VolSaverFloat(const std::string& name): 
76
				of(name.c_str(), std::ios::binary) {}
77
 
78
			void operator()(const CGLA::Vec3i& pi, const float& vox_val)
79
				{
80
					of.write((char*) &vox_val, sizeof(float));
81
				}	
82
		};
83
 
84
	template<class G>
85
		void save_raw_float(const std::string& name, G& grid)
86
		{
87
			VolSaverFloat<G> vs(name);
88
			for_each_voxel_ordered_const(grid, vs);	
89
		}
90
 
91
	template<class G>
92
		void save_raw_byte(const std::string& name, G& grid,
93
											 const typename G::DataType& min_val,
94
											 const typename G::DataType& max_val)
95
		{
96
			VolSaver<G> vs(name, min_val, max_val);
97
			for_each_voxel_ordered_const(grid, vs);	
98
		}
99
 
100
	template<class G>
101
		void save_raw_ascii(const std::string& name, G& grid,
102
												const typename G::DataType& min_val,
103
												const typename G::DataType& max_val)
104
		{
105
			VolSaverAscii<G> vs(name, min_val, max_val);
106
			for_each_voxel_ordered_const(grid, vs);	
107
		}
108
 
109
 
110
}
111
namespace Geometry = Geometry;
112
 
113
#endif