00001 #include "flowvis_data.h"
00002
00003 #include <fstream>
00004 #include <sstream>
00005 #include <iomanip>
00006 #include <algorithm>
00007
00008 #include <wx/defs.h>
00009
00010 FlowVisData::FlowVisData()
00011 : m_swaped(false)
00012 {
00013
00014 }
00015
00016 vec3 FlowVisData::GetVelocityAt(const float x, const float y)
00017 {
00018 assert(-1.0f <= x && x <= 1.0f);
00019 assert(-1.0f <= y && y <= 1.0f);
00020
00021 float nx = (x + 1) / 2;
00022 float ny = 1 - ((y + 1) / 2);
00023
00024 float lookup_x = (m_grid_max[0] - m_grid_min[0]) * nx + m_grid_min[0];
00025 float lookup_y = (m_grid_max[1] - m_grid_min[1]) * ny + m_grid_min[1];
00026
00027 std::vector<float>::iterator upper_x, lower_x, upper_y, lower_y;
00028 lower_x = upper_x = std::lower_bound(m_grid_x.begin(), m_grid_x.end(), lookup_x);
00029 lower_y = upper_y = std::lower_bound(m_grid_y.begin(), m_grid_y.end(), lookup_y);
00030 --lower_x;
00031 --lower_y;
00032
00033 int ux = upper_x - m_grid_x.begin();
00034 int uy = upper_y - m_grid_y.begin();
00035 int lx = ux - 1;
00036 int ly = uy - 1;
00037
00038 float l_nx = (lookup_x - *lower_x) / (*upper_x - *lower_x);
00039 float l_ny = (lookup_y - *lower_y) / (*upper_y - *lower_y);
00040
00041 vec3 erg = m_time[0].velocity[ly][lx] * (1 - l_nx) * (1 - l_ny)
00042 + m_time[0].velocity[ly][ux] * nx * (1 - l_ny)
00043 + m_time[0].velocity[uy][lx] * (1 - l_nx) * l_ny
00044 + m_time[0].velocity[uy][ux] * l_nx * l_ny;
00045
00046 return erg;
00047 }
00048
00049 VertexData_T FlowVisData::GetVertexData()
00050 {
00051 VertexData_T vdata;
00052 vdata.reserve(m_x * m_y * 2);
00053
00054 float grid_offset_x = m_grid_min[0];
00055 float grid_width = m_grid_max[0] - m_grid_min[0];
00056 float grid_offset_y = m_grid_min[1];
00057 float grid_height = m_grid_max[1] - m_grid_min[1];
00058
00059 float grid_val = 0;
00060
00061 for(int y = 0; y < m_y; y++)
00062 {
00063 for(int x = 0; x < m_x; x++)
00064 {
00065 grid_val = m_grid[y][x].v[0];
00066 grid_val = (grid_val - grid_offset_x) / grid_width;
00067 grid_val = grid_val * 2 - 1;
00068 vdata.push_back(grid_val);
00069
00070 grid_val = m_grid[y][x].v[1];
00071 grid_val = (grid_val - grid_offset_y) / grid_height;
00072 grid_val = grid_val * -2.0f + 1.0f;
00073 vdata.push_back(grid_val);
00074 }
00075 }
00076
00077 return vdata;
00078 }
00079
00080 ColorData_T FlowVisData::GetColorData(int time, int dataset)
00081 {
00082 ColorData_T cdata;
00083 cdata.reserve(m_x * m_y * 3);
00084
00085 float value = 0;
00086
00087 for(int y = 0; y < m_y; y++)
00088 {
00089 for(int x = 0; x < m_x; x++)
00090 {
00091 value = m_time[time].data[dataset][y][x];
00092 value = (value - m_data_min[dataset]) / (m_data_max[dataset] - m_data_min[dataset]);
00093 cdata.push_back(value);
00094 cdata.push_back(value);
00095 cdata.push_back(value);
00096 }
00097 }
00098
00099 return cdata;
00100 }
00101
00102 IndexData_T FlowVisData::GetIndexData()
00103 {
00104 IndexData_T idata;
00105 idata.reserve((m_x - 1) * (m_y - 1) * 4);
00106
00107 int lt, rt, lb, rb;
00108
00109 for(int y = 0; y < m_y - 1; y++)
00110 {
00111 for(int x = 0; x < m_x - 1; x++)
00112 {
00113 lt = y * m_x + x;
00114 rt = y * m_x + x + 1;
00115 rb = (y + 1) * m_x + x + 1;
00116 lb = (y + 1) * m_x + x;
00117 idata.push_back(lt);
00118 idata.push_back(rt);
00119 idata.push_back(rb);
00120 idata.push_back(lb);
00121 }
00122 }
00123
00124 return idata;
00125 }
00126
00127 void FlowVisData::LoadFromFile(const char *filename)
00128 {
00129 LoadGrid(filename);
00130 std::string basename(filename);
00131 basename = basename.substr(0, basename.rfind('.'));
00132 for(int time_index = 0; time_index < m_timestamps; time_index++)
00133 {
00134 std::ostringstream data_file_name;
00135 data_file_name << basename << '.' << std::setfill('0') << std::setw(5) << time_index << ".dat";
00136 LoadData(data_file_name.str().c_str(), time_index);
00137 }
00138
00139 }
00140
00141 void FlowVisData::LoadGrid(const char *filename)
00142 {
00143 std::ifstream in(filename, std::ios::in | std::ios::binary);
00144 in.exceptions(std::ios::failbit | std::ios::badbit);
00145
00146
00147 std::string identifier;
00148
00149 char header_buffer[40];
00150 in.read(header_buffer, 40);
00151
00152 std::stringstream header(header_buffer);
00153
00154 header >> identifier
00155 >> m_x
00156 >> m_y
00157 >> m_z
00158 >> m_sets
00159 >> m_timestamps
00160 >> m_interval;
00161
00162
00163 m_data_min = std::vector<float>(m_sets, 999999);
00164 m_data_max = std::vector<float>(m_sets, -999999);
00165
00166 m_grid_min[0] = m_grid_min[1] = 999999;
00167 m_grid_max[0] = m_grid_max[1] = -999999;
00168
00169 m_max_velocity_length = -999999;
00170
00171 m_grid_cell_min_x = -99999;
00172 m_grid_cell_min_y = 99999;
00173
00174 float value;
00175
00176
00177
00178
00179
00180
00181 bool x_done = false;
00182 bool y_done = false;
00183
00184 int dx = 0;
00185 int dy = 1;
00186
00187 if(in.good() && m_z == 1 && identifier == "SN4DB")
00188 {
00189 m_grid = Grid_T(m_y, std::vector<vec3>(m_x));
00190
00191 for (int z = 0; z < m_z; z++)
00192 {
00193 for (int y = 0; y < m_y; y++)
00194 {
00195 y_done = false;
00196 for (int x = 0; x < m_x; x++)
00197 {
00198 in.read(reinterpret_cast<char*>(&value), sizeof(m_grid[y][x][0]));
00199
00200 if(x == 1 && y == 0)
00201 {
00202 if(m_grid[0][0][0] == value)
00203 {
00204 m_swaped = true;
00205 dx = 1;
00206 dy = 0;
00207 }
00208 }
00209
00210 m_grid[y][x][dx] = value;
00211 m_grid_min[0] = std::min(m_grid_min[0], value);
00212 m_grid_max[0] = std::max(m_grid_max[0], value);
00213
00214 in.read(reinterpret_cast<char*>(&value), sizeof(m_grid[y][x][1]));
00215 m_grid[y][x][dy] = value;
00216 m_grid_min[1] = std::min(m_grid_min[1], value);
00217 m_grid_max[1] = std::max(m_grid_max[1], value);
00218
00219 in.read(reinterpret_cast<char*>(&value), sizeof(value));
00220
00221 if(!y_done)
00222 {
00223 m_grid_y.push_back(m_grid[y][x][1]);
00224 y_done = true;
00225 }
00226
00227 if(!x_done)
00228 m_grid_x.push_back(m_grid[y][x][0]);
00229 }
00230 x_done = true;
00231 }
00232 }
00233 }
00234 }
00235
00236 void FlowVisData::LoadData(const char *filename, int time_index)
00237 {
00238 std::ifstream in(filename, std::ios::in | std::ios::binary);
00239 in.exceptions(std::ios::failbit | std::ios::badbit);
00240
00241 float value;
00242
00243 Time_S current_time;
00244
00245 current_time.velocity = VelocityVec_T(m_y, std::vector<vec3>(m_x));
00246
00247 for(int i = 0; i < m_sets; i++)
00248 {
00249 current_time.data.push_back(DataVec_T(m_y, std::vector<float>(m_x)));
00250 }
00251
00252 int dx = (m_swaped)?(1):(0);
00253 int dy = (m_swaped)?(0):(1);
00254
00255 for (int z = 0; z < m_z; z++)
00256 {
00257 for (int y = 0; y < m_y; y++)
00258 {
00259 for (int x = 0; x < m_x; x++)
00260 {
00261 in.read(reinterpret_cast<char*>(&value), 4);
00262 current_time.velocity[y][x][dx] = value;
00263
00264 in.read(reinterpret_cast<char*>(&value), 4);
00265 current_time.velocity[y][x][dy] = value;
00266
00267 in.read(reinterpret_cast<char*>(&value), 4);
00268 current_time.velocity[y][x][2] = value;
00269
00270 m_max_velocity_length = std::max(m_max_velocity_length,
00271 current_time.velocity[y][x].length());
00272
00273 for(int set = 0; set < m_sets; set++)
00274 {
00275 in.read(reinterpret_cast<char*>(&value), 4);
00276 current_time.data[set][y][x] = value;
00277 m_data_min[set] = std::min(m_data_min[set], value);
00278 m_data_max[set] = std::max(m_data_max[set], value);
00279 }
00280 }
00281 }
00282 }
00283
00284 m_time.push_back(current_time);
00285 }
00286
00287 void FlowVisData::NormalizeVelocity()
00288 {
00289 vec3 change(0.5f, 0.5f);
00290 float max_x = -9999;
00291 float max_y = -9999;
00292 float min_x = 9999;
00293 float min_y = 9999;
00294
00295 for(TimeVec_T::iterator time_iter = m_time.begin();
00296 time_iter != m_time.end();
00297 time_iter ++)
00298 {
00299 for(VelocityVec_T::iterator vel_row_iter = time_iter->velocity.begin();
00300 vel_row_iter != time_iter->velocity.end();
00301 vel_row_iter ++)
00302 {
00303 for(std::vector<vec3>::iterator vel_iter = vel_row_iter->begin();
00304 vel_iter != vel_row_iter->end();
00305 vel_iter ++)
00306 {
00307 *vel_iter = (*vel_iter / m_max_velocity_length);
00308 max_x = std::max(max_x, vel_iter->v[0]);
00309 max_y = std::max(max_y, vel_iter->v[1]);
00310 min_x = std::min(min_x, vel_iter->v[0]);
00311 min_y = std::min(min_y, vel_iter->v[1]);
00312 }
00313 }
00314 }
00315 }
00316
00317 void FlowVisData::BuildGridLookup()
00318 {
00319
00320 }