Changeset 17338


Ignore:
Timestamp:
11/21/13 17:26:27 (11 years ago)
Author:
tbretz
Message:
Updated the interface to have an option to read directly from a file.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Mars/mcore/Interpolator2D.h

    r17143 r17338  
    2020#include <math.h>
    2121#include <vector>
     22#include <fstream>
    2223
    2324class Interpolator2D
     
    4445    {
    4546        unsigned int i;
     47        point(unsigned int _i, const vec &_v) : vec(_v), i(_i) { }
    4648        point(unsigned int _i=0, double _x=0, double _y=0) : vec(_x, _y), i(_i) { }
    4749    };
     
    296298    // --------------------------------------------------------------------------
    297299    //
     300    //! helper function to read a grid from a simple file
     301    //! (alternating x, y)
     302    //!
     303    //! @param filename
     304    //!    filename of ascii file with data
     305    //!
     306    //! @returns
     307    //!    a vector of point with the x and y values.
     308    //!    in case of failure the vector is empty
     309    //
     310    static std::vector<Interpolator2D::vec> ReadGrid(const std::string &filename)
     311    {
     312        std::vector<Interpolator2D::vec> grid;
     313
     314        std::ifstream fin(filename);
     315        if (!fin.is_open())
     316            return std::vector<Interpolator2D::vec>();
     317
     318        while (1)
     319        {
     320            double x, y;
     321            fin >> x;
     322            fin >> y;
     323            if (!fin)
     324                break;
     325
     326            grid.emplace_back(x, y);
     327        }
     328
     329        return fin.bad() ? std::vector<Interpolator2D::vec>() : grid;
     330    }
     331
     332    // --------------------------------------------------------------------------
     333    //
    298334    //! Set a new input grid (the points at which values are known).
    299335    //! Invalidates the output grid and the calculated weights.
     
    309345    //!    y coordinates of data points
    310346    //
    311     void SetInputGrid(int n, double *x, double *y)
     347    void SetInputGrid(unsigned int n, double *x, double *y)
    312348    {
    313349        circles.clear();
     
    317353        inputGrid.clear();
    318354        inputGrid.reserve(n);
    319         for (int i=0; i<n; i++)
     355        for (unsigned int i=0; i<n; i++)
    320356            inputGrid.emplace_back(i, x[i], y[i]);
    321357
     
    331367        inputGrid.clear();
    332368        inputGrid.reserve(v.size());
    333         for (std::size_t i=0; i<v.size(); i++)
    334             inputGrid.emplace_back(i, v[i].x, v[i].y);
     369        for (unsigned int i=0; i<v.size(); i++)
     370            inputGrid.emplace_back(i, v[i]);
    335371
    336372        CalculateGrid();
    337373    }
     374
     375    /*
     376    void SetInputGrid(const std::vector<Interpolator2D::point> &v)
     377    {
     378        circles.clear();
     379        weights.clear();
     380        outputGrid.clear();
     381
     382        inputGrid.clear();
     383        inputGrid.reserve(v.size());
     384        for (unsigned int i=0; i<v.size(); i++)
     385            inputGrid.emplace_back(v[i], i);
     386
     387        CalculateGrid();
     388    }*/
     389
     390    bool ReadInputGrid(const std::string &filename)
     391    {
     392        const auto grid = ReadGrid(filename);
     393        if (grid.empty())
     394            return false;
     395
     396        SetInputGrid(grid);
     397        return true;
     398    }
     399
    338400
    339401    // --------------------------------------------------------------------------
     
    355417    //!    case of success
    356418    //
    357     bool SetOutputGrid(int n, double *x, double *y)
    358     {
    359         if (inputGrid.empty())
     419    bool SetOutputGrid(std::size_t n, double *x, double *y)
     420    {
     421        if (inputGrid.empty() && n==0)
    360422            return false;
    361423
     
    364426        outputGrid.clear();
    365427        outputGrid.reserve(n);
    366         for (int i=0; i<n; i++)
     428        for (std::size_t i=0; i<n; i++)
    367429            outputGrid.emplace_back(i, x[i], y[i]);
    368430
     
    370432    }
    371433
     434    /*
    372435    bool SetOutputGrid(const std::vector<std::pair<double,double>> &v)
    373436    {
    374         if (inputGrid.empty())
     437        if (inputGrid.empty() || v.empty())
    375438            return false;
    376439
     
    383446
    384447        return CalculateWeights();
    385     }
     448    }*/
     449
     450    bool SetOutputGrid(const std::vector<Interpolator2D::vec> &v)
     451    {
     452        if (inputGrid.empty())
     453            return false;
     454
     455        weights.clear();
     456
     457        outputGrid.clear();
     458        outputGrid.reserve(v.size());
     459        for (std::size_t i=0; i<v.size(); i++)
     460            outputGrid.emplace_back(i, v[i]);
     461
     462        return CalculateWeights();
     463    }
     464
     465    bool ReadOutputGrid(const std::string &filename)
     466    {
     467        const auto grid = ReadGrid(filename);
     468        if (grid.empty())
     469            return false;
     470
     471        return SetOutputGrid(grid);
     472    }
     473
    386474
    387475    // --------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.