From b3d65bafa151d9a0f7714e5dc0da9acf41827882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 2 Apr 2015 17:31:47 +0200 Subject: [PATCH] Move the default input/output formats to data_storage.{cpp,h}. --- sources/core/SConscript | 1 + sources/core/data.cpp | 17 +-- sources/core/data_storage.cpp | 243 ++++++++++++++++++++++++++++++ sources/core/data_storage.h | 17 +++ sources/core/vertical_segment.cpp | 213 +------------------------- 5 files changed, 263 insertions(+), 228 deletions(-) create mode 100644 sources/core/data_storage.cpp create mode 100644 sources/core/data_storage.h diff --git a/sources/core/SConscript b/sources/core/SConscript index 0bc65cb..0cf4a66 100644 --- a/sources/core/SConscript +++ b/sources/core/SConscript @@ -6,6 +6,7 @@ Import('env', 'ALTA_LIBS') # Library sources sources = ['common.cpp', 'data.cpp', + 'data_storage.cpp', 'function.cpp', 'params.cpp', 'plugins_manager.cpp', diff --git a/sources/core/data.cpp b/sources/core/data.cpp index 54a3df2..7c65950 100644 --- a/sources/core/data.cpp +++ b/sources/core/data.cpp @@ -10,22 +10,7 @@ #include #include "data.h" - -static void save_data_as_text(std::ostream& out, const data &data) -{ - out << "#DIM " << data.dimX() << " " << data.dimY() << std::endl; - out << "#PARAM_IN " << params::get_name(data.input_parametrization()) << std::endl; - out << "#PARAM_OUT " << params::get_name(data.output_parametrization()) << std::endl; - for(int i=0; i < data.size(); ++i) - { - vec x = data.get(i); - for(int j=0; j< data.dimX() + data.dimY(); ++j) - { - out << x[j] << "\t"; - } - out << std::endl; - } -} +#include "data_storage.h" void data::save(const std::string& filename) const { diff --git a/sources/core/data_storage.cpp b/sources/core/data_storage.cpp new file mode 100644 index 0000000..70196cf --- /dev/null +++ b/sources/core/data_storage.cpp @@ -0,0 +1,243 @@ +/* ALTA --- Analysis of Bidirectional Reflectance Distribution Functions + + Copyright (C) 2013, 2014, 2015 Inria + + This file is part of ALTA. + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "data.h" +#include "data_storage.h" +#include "vertical_segment.h" + +#include +#include + +void vertical_segment::load_data_from_text(std::istream& input, + vertical_segment& result, + const arguments& args) +{ + vec min, max ; + vec ymin, ymax; + + result._nX = 0 ; result._nY = 0 ; + std::vector vs ; int current_vs = 0 ; + while(input.good()) + { + std::string line ; + std::getline(input, line) ; + std::stringstream linestream(line) ; + + // Discard incorrect lines + if(linestream.peek() == '#') + { + linestream.ignore(1) ; + + std::string comment ; + linestream >> comment ; + + if(comment == std::string("DIM")) + { + linestream >> result._nX >> result._nY ; + + vs.reserve(result.dimY()) ; + for(int k=0; k::max()) ; + max = args.get_vec("max", result._nX, std::numeric_limits::max()) ; +#ifdef DEBUG + std::cout << "<> data will remove outside of " << min << " -> " << max << " x-interval" << std::endl; +#endif + + ymin = args.get_vec("ymin", result._nY, -std::numeric_limits::max()) ; + ymax = args.get_vec("ymax", result._nY, std::numeric_limits::max()) ; +#ifdef DEBUG + std::cout << "<> data will remove outside of " << ymin << " -> " << ymax << " y-interval" << std::endl; +#endif + + for(int k=0; k::max() ; + result._max[k] = -std::numeric_limits::max() ; + } + } + else if(comment == std::string("VS")) + { + int t ; + linestream >> t ; + vs[current_vs] = t ; ++current_vs ; + } + else if(comment == std::string("PARAM_IN")) + { + std::string param; + linestream >> param; + result._in_param = params::parse_input(param); + } + else if(comment == std::string("PARAM_OUT")) + { + std::string param; + linestream >> param; + result._out_param = params::parse_output(param); + } + continue ; + } + else if(line.empty()) + { + continue ; + } + else + { + // Read the data point x and y coordinates + vec v = vec::Zero(result.dimX() + 3*result.dimY()) ; + for(int i=0; i> v[i] ; + } + + // If data is not in the interval of fit + bool is_in = true ; + for(int i=0; i max[i]) + { + is_in = false ; + } + } + for(int i=0; i ymax[i]) + { + is_in = false ; + } + } + if(!is_in) + { + continue ; + } + +// /* + // Correction of the data by 1/cosine(theta_L) + double factor = 1.0; + if(args.is_defined("data-correct-cosine")) + { + double cart[6]; + params::convert(&v[0], result.input_parametrization(), params::CARTESIAN, cart); + if(cart[5] > 0.0 && cart[2] > 0.0) + { + factor = 1.0/cart[5]*cart[2]; + for(int i=0; i> min_dt ; + linestream >> max_dt ; + min_dt = min_dt-v[result.dimX()+i]; + max_dt = max_dt-v[result.dimX()+i]; + } + else if(vs[i] == 1) + { + double dt ; + linestream >> dt ; + min_dt = -dt; + max_dt = dt; + } + else + { + double dt = args.get_float("dt", 0.1f); + min_dt = -dt; + max_dt = dt; + } + + if(args.is_defined("dt-relative")) + { + v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] * (1.0 + min_dt) ; + v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] * (1.0 + max_dt) ; + } + else if(args.is_defined("dt-max")) + { + v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] + std::max(v[result.dimX() + i] * min_dt, min_dt); + v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] + std::max(v[result.dimX() + i] * max_dt, max_dt); + } + else + { + v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] + min_dt ; + v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] + max_dt ; + } + + // You can enforce the vertical segment to stay in the positive + // region using the --data-positive command line argument. Note + // that the data point is also clamped to zero if negative. + if(args.is_defined("dt-positive")) + { + v[result.dimX() + i] = std::max(v[result.dimX() + i], 0.0); + v[result.dimX() + result.dimY()+i] = std::max(v[result.dimX() + result.dimY()+i], 0.0); + v[result.dimX() + 2*result.dimY()+i] = std::max(v[result.dimX() + 2*result.dimY()+i], 0.0); + } + +#ifdef DEBUG + std::cout << "<> vs = [" << v[result.dimX() + result.dimY()+i] << ", " << v[result.dimX() + 2*result.dimY()+i] << "]" << std::endl; +#endif + } + + result._data.push_back(v) ; + + // Update min and max + for(int k=0; k> loaded input stream" << std::endl ; + std::cout << "<> data inside " << result._min << " ... " << result._max << std::endl ; + std::cout << "<> loading data input of R^" << result.dimX() << " -> R^" << result.dimY() << std::endl ; + std::cout << "<> " << result._data.size() << " elements to fit" << std::endl ; +} + +void save_data_as_text(std::ostream& out, const data &data) +{ + out << "#DIM " << data.dimX() << " " << data.dimY() << std::endl; + out << "#PARAM_IN " << params::get_name(data.input_parametrization()) << std::endl; + out << "#PARAM_OUT " << params::get_name(data.output_parametrization()) << std::endl; + for(int i=0; i < data.size(); ++i) + { + vec x = data.get(i); + for(int j=0; j< data.dimX() + data.dimY(); ++j) + { + out << x[j] << "\t"; + } + out << std::endl; + } +} diff --git a/sources/core/data_storage.h b/sources/core/data_storage.h new file mode 100644 index 0000000..7286e2d --- /dev/null +++ b/sources/core/data_storage.h @@ -0,0 +1,17 @@ +/* ALTA --- Analysis of Bidirectional Reflectance Distribution Functions + + Copyright (C) 2013, 2014, 2015 Inria + + This file is part of ALTA. + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#pragma once + +#include +#include "data.h" + +// Write DATA to OUT in ALTA's text format. +void save_data_as_text(std::ostream& out, const data &data); diff --git a/sources/core/vertical_segment.cpp b/sources/core/vertical_segment.cpp index 4fbe19b..20e29a0 100644 --- a/sources/core/vertical_segment.cpp +++ b/sources/core/vertical_segment.cpp @@ -9,12 +9,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "vertical_segment.h" +#include "data_storage.h" #include #include #include #include -#include #include #include #include @@ -73,217 +73,6 @@ void vertical_segment::load(const std::string& filename, const arguments& args) file.close(); } -void vertical_segment::load_data_from_text(std::istream& input, - vertical_segment& result, - const arguments& args) -{ - vec min, max ; - vec ymin, ymax; - - result._nX = 0 ; result._nY = 0 ; - std::vector vs ; int current_vs = 0 ; - while(input.good()) - { - std::string line ; - std::getline(input, line) ; - std::stringstream linestream(line) ; - - // Discard incorrect lines - if(linestream.peek() == '#') - { - linestream.ignore(1) ; - - std::string comment ; - linestream >> comment ; - - if(comment == std::string("DIM")) - { - linestream >> result._nX >> result._nY ; - - vs.reserve(result.dimY()) ; - for(int k=0; k::max()) ; - max = args.get_vec("max", result._nX, std::numeric_limits::max()) ; -#ifdef DEBUG - std::cout << "<> data will remove outside of " << min << " -> " << max << " x-interval" << std::endl; -#endif - - ymin = args.get_vec("ymin", result._nY, -std::numeric_limits::max()) ; - ymax = args.get_vec("ymax", result._nY, std::numeric_limits::max()) ; -#ifdef DEBUG - std::cout << "<> data will remove outside of " << ymin << " -> " << ymax << " y-interval" << std::endl; -#endif - - for(int k=0; k::max() ; - result._max[k] = -std::numeric_limits::max() ; - } - } - else if(comment == std::string("VS")) - { - int t ; - linestream >> t ; - vs[current_vs] = t ; ++current_vs ; - } - else if(comment == std::string("PARAM_IN")) - { - std::string param; - linestream >> param; - result._in_param = params::parse_input(param); - } - else if(comment == std::string("PARAM_OUT")) - { - std::string param; - linestream >> param; - result._out_param = params::parse_output(param); - } - continue ; - } - else if(line.empty()) - { - continue ; - } - else - { - // Read the data point x and y coordinates - vec v = vec::Zero(result.dimX() + 3*result.dimY()) ; - for(int i=0; i> v[i] ; - } - - // If data is not in the interval of fit - bool is_in = true ; - for(int i=0; i max[i]) - { - is_in = false ; - } - } - for(int i=0; i ymax[i]) - { - is_in = false ; - } - } - if(!is_in) - { - continue ; - } - -// /* - // Correction of the data by 1/cosine(theta_L) - double factor = 1.0; - if(args.is_defined("data-correct-cosine")) - { - double cart[6]; - params::convert(&v[0], result.input_parametrization(), params::CARTESIAN, cart); - if(cart[5] > 0.0 && cart[2] > 0.0) - { - factor = 1.0/cart[5]*cart[2]; - for(int i=0; i> min_dt ; - linestream >> max_dt ; - min_dt = min_dt-v[result.dimX()+i]; - max_dt = max_dt-v[result.dimX()+i]; - } - else if(vs[i] == 1) - { - double dt ; - linestream >> dt ; - min_dt = -dt; - max_dt = dt; - } - else - { - double dt = args.get_float("dt", 0.1f); - min_dt = -dt; - max_dt = dt; - } - - if(args.is_defined("dt-relative")) - { - v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] * (1.0 + min_dt) ; - v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] * (1.0 + max_dt) ; - } - else if(args.is_defined("dt-max")) - { - v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] + std::max(v[result.dimX() + i] * min_dt, min_dt); - v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] + std::max(v[result.dimX() + i] * max_dt, max_dt); - } - else - { - v[result.dimX() + result.dimY()+i] = v[result.dimX() + i] + min_dt ; - v[result.dimX() + 2*result.dimY()+i] = v[result.dimX() + i] + max_dt ; - } - - // You can enforce the vertical segment to stay in the positive - // region using the --data-positive command line argument. Note - // that the data point is also clamped to zero if negative. - if(args.is_defined("dt-positive")) - { - v[result.dimX() + i] = std::max(v[result.dimX() + i], 0.0); - v[result.dimX() + result.dimY()+i] = std::max(v[result.dimX() + result.dimY()+i], 0.0); - v[result.dimX() + 2*result.dimY()+i] = std::max(v[result.dimX() + 2*result.dimY()+i], 0.0); - } - -#ifdef DEBUG - std::cout << "<> vs = [" << v[result.dimX() + result.dimY()+i] << ", " << v[result.dimX() + 2*result.dimY()+i] << "]" << std::endl; -#endif - } - - result._data.push_back(v) ; - - // Update min and max - for(int k=0; k> loaded input stream" << std::endl ; - std::cout << "<> data inside " << result._min << " ... " << result._max << std::endl ; - std::cout << "<> loading data input of R^" << result.dimX() << " -> R^" << result.dimY() << std::endl ; - std::cout << "<> " << result._data.size() << " elements to fit" << std::endl ; -} - void vertical_segment::get(int i, vec& x, vec& yl, vec& yu) const { #ifdef DEBUG -- GitLab