C ++, как сохранить векторные элементы и двойную точность

0

Я пытаюсь заполнить вектор объекта Point 3D. Мое приложение читает файл csv для загрузки вектора тремя кординатами x, y, z. Я использую тип float. Это мой код.

main.cpp

int main(int argc, char** argv) {
    char *theFileName = "file.csv"; //[100];
    vector<Point> v = getPointCloud(theFileName);
    for (int i = 0; i < v.size(); ++i) {
        v.at(i).print(cout);
    }

}

getPointCloud

vector<Point> getPointCloud(char *fileName) {
    string line;
    string token;
    vector<Point> v;
    double tab[3];
    ifstream file(fileName);
    if (file.is_open()) {
        while (getline(file, line)) {
            int cpt = 0;
            stringstream stream(line);
            while (getline(stream, token, ',')) {
                tab[cpt] = ::atof(token.c_str());
                cpt++;
            }
            Point p(tab[0], tab[1], tab[2]);
            p.print(cout);            <-- the display works 
            p.setColor(255, 0, 0);
            v.push_back(p);
        }
        file.close();
    } else {
        cout << "Unable to open " << fileName << '\n';
        exit(0);
    }

    return v;
}

У меня две проблемы:

1 - когда я пытаюсь отображать точки в основном методе, я обнаружил, что три координаты являются нулевыми (== 0), но при отображении в методе getPointCloud работает очень хорошо.

2 - Может ли кто-нибудь дать простой способ сохранить мои координаты без потери точности после математических операций. Я искал в сети, но я не понимаю, как это решить. Я новичок с c++.

Point.h

#ifndef POINT_H
#define POINT_H

#include <math.h>
#include <iostream>

class Point {
protected:
    float x;
    float y;
    float z;
    // color RGB
    float r;
    float g;
    float b;
public:
    // Constructors
    Point();
    //  Point(const Point& orig);
    Point(std::ostream &strm);
    Point(float x, float y, float z);
    Point(const Point& orig);
    virtual ~Point();

    //getters

    float getX() const {
        return this->x;
    }

    float getY() const {
        return this->y;
    }

    float getZ() const {
        return this->z;
    }

    float getR() const {
        return this->r;
    }

    float getG() const {
        return this->g;
    }

    float getB() const {
        return this->b;
    }

    //setters

    void setX(float x) {
        this->x = x;
    }

    void setY(float y) {
        this->y = y;
    }

    void setZ(float z) {
        this->z = z;
    }

    void setR(float r) {
        this->r = r;
    }

    void setG(float g) {
        this->g = g;
    }

    void setB(float b) {
        this->b = b;
    }

    void setColor(float r, float g, float b) {
        this->r = r;
        this->g = g;
        this->b = b;
    }

    /**
     * Print the point
     * @param strm
     */
    void print(std::ostream &strm);

    //Other methods

    float dist2D(Point &other);

    float dist3D(Point &other);

    Point swap(Point p);

//    Point operator-(const Point &other) const;
};

#endif  /* POINT_H */

Point.cpp

#include <iostream>
#include <math.h>
#include <ostream>
using namespace std;

#include "Point.h"

Point::Point(const Point& orig) {
}

Point::Point(ostream &strm) {
    strm << "Type the abscissa: ", cin >> this->x;
    strm << "Type the ordinate: ", cin >> this->y;
    strm << "Type the applicate: ", cin >> this->z;
}

Point::Point(float x, float y, float z) : x(x), y(y), z(z) {
    // The default point color is blue
    this->r = 0;
    this->g = 0;
    this->b = 255;
}

/**
 * Destructor
 */
Point::~Point() {

}

//Other methods

float Point::dist2D(Point &other) {
    float xd = x - other.x;
    float yd = y - other.y;
    return sqrt(xd * xd + yd * yd);
}

float Point::dist3D(Point &other) {
    float xd = x - other.x;
    float yd = y - other.y;
    float zd = z - other.z;
    return sqrt(xd * xd + yd * yd + zd * zd);
}

Point Point::swap(Point p) {
    Point aux(x, y, z);
    x = p.x;
    y = p.y;
    z = p.z;
    return aux;
}

//Point Point::operator-(const Point &other) const {
//    return Point(other.getX() - this->x, other.getY() - this->y, other.getZ() - this->z);
//}

void Point::print(ostream &strm) {
    strm << "Point(" << this->x << "," << y << "," << z << ")" << endl;
}

Заранее спасибо.

  • 1
    Можете ли вы показать определение класса Point ? Я подозреваю , что у него есть определение копии constructor , который теряет данные.
  • 0
    p.setColor устанавливает новые значения, перезаписывая то, что было раньше. Попробуйте сделать p.print после p.setColor чтобы проверить это.
Показать ещё 1 комментарий
Теги:
vector
precision

1 ответ

1
Лучший ответ
Point::Point(const Point& orig) {
}

это неверно. Он не копирует данные из orig в *this

Скопируйте каждого члена в этот конструктор.

Это будет выглядеть так:

Point::Point(const Point& orig) {
    x = orig.x ;
    y = orig.y ;
    x = orig.z ;

    r = orig.r ;
    g = orig.g ;
    b = orig.b ;
}
  • 0
    Да, правильно. А как насчет точности.
  • 0
    @ Динозавр Я предполагаю, что вы хотели бы сохранить «двойной», но вы храните его как «плавать», верно?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню