0

I have a problem with my code, every time I use my arrays (vTab or eTab) of an object inside of cube:3D_obj it returns me pointer ID or nan. Well just for context here's the whole code, but those arrays are only the problem because the code is running fine.

For debugging purposes, I wrote cout's in some places. Also, I tried to init vTab[] as new vertice[8], but the same results.

I came up with one problem, that I might have to init verticle object outside of functions but i don't know actually how to handle it.

If you need to know this project have to represent simple 3D figures as data with classes/objects Two vertices make an edge, edges make figures, etc.

IDE: I use Visual Studio on Windows

#define pi 3.14159265359
#define eps 0.0001
#include <iostream>
#include <math.h>

using namespace std;
double aprox(double x, double y) {
    return round(10000 * x) / 10000;
}


class vertice {
    double x;
    double y;
    double z;
    friend ostream& operator<< (ostream& c, vertice& orig);
public:
    vertice() {//init funciton
        x = y = z = 0;
    }
    vertice(double ix, double iy, double iz) {//init function
        x = ix;
        y = iy;
        z = iz;
    }
    vertice& operator- (vertice& orig) {
        vertice temp = *this;
        temp.x -= orig.x;
        temp.y -= orig.y;
        temp.z -= orig.z;
        return temp;
    }
    vertice& operator+ (vertice& orig) {
        vertice temp = *this;
        temp.x += orig.x;
        temp.y += orig.y;
        temp.z += orig.z;
        return temp;
    }

    void position(double ix, double iy, double iz) { //change the position of the vertice 
        x = ix;
        y = iy;
        z = iz;
    }
    void position(double ix) {
        x = ix;
    }
    void rotate(double ax, double ay, double az, vertice anchorPoint = vertice(0, 0, 0)) { //rotate in 3D (angle) axis using anchor point
        vertice tempVertice = *this - anchorPoint;
        double cosX = cos(ax * pi / 180), cosY = cos(ay * pi / 180), cosZ = cos(az * pi / 180), sinX = sin(ax * pi / 180), sinY = sin(ay * pi / 180), sinZ = sin(az * pi / 180);

        //rotate X
        y = aprox(tempVertice.y * cosX - tempVertice.z * sinX, eps);
        z = aprox(tempVertice.z * cosX + tempVertice.y * sinX, eps);
        tempVertice = *this;
        //rotate Y
        x = aprox(tempVertice.x * cosY - tempVertice.z * sinY, eps);
        z = aprox(tempVertice.z * cosY + tempVertice.x * sinY, eps);
       tempVertice = *this;
        //rotate Z
        x = aprox(tempVertice.x * cosZ - tempVertice.y * sinZ, eps);
        y = aprox(tempVertice.y * cosZ + tempVertice.x * sinZ, eps);
        //tempVertice = *this;
        *this = *this + anchorPoint;
    }
    //~vertice() {};
};
ostream& operator<< (ostream& c, vertice& orig) { //using << operator to stream data from vertice
    cout << "x= " << orig.x << " |  y= " << orig.y << " |  z= " << orig.z;
    return c;
}

class edge {

    friend ostream& operator<< (ostream& c, edge& orig);
public:
    vertice* v1;
    vertice* v2;
    edge() {
        v1 = new vertice();
        v2 = new vertice();
    }
    edge(vertice iv1, vertice iv2) {
        v1 = &iv1;
        v2 = &iv2;
    } 
};
ostream& operator<< (ostream& c, edge& orig) { //printing edges as two vertex
    cout << "Edge: \n* " << *orig.v1 << "\n* " << *orig.v2 << endl;
    return c;
}

class obj_3D {
    vertice position;
    vertice anchorPoint;
    //material type; //not using
public:
    void Draw() {}
    //~obj_3D() {};
};

class cube : public obj_3D {
    double a;
    edge eTab[12];
    vertice vTab[8];
public:
    cube(double ia) { //creating vertices, edges according to object properaties.
        a = ia;
        double Ph = aprox(asin(sqrt(2) / 2), eps), Alph = aprox(asin(3 * sqrt(2) / 3), eps);
        double TPh = 0, TAlph = 0;
        
        double R = a * sqrt(2) / 2;
        for (int i = 0; i < 8; i++) { //initializing vertices
            vTab[i] = vertice();
            vTab[i].position(R);
            vTab[i].rotate(Ph + TPh, Alph+ TAlph, 0);
            if (i == 3) {
                TPh = 0;
                TAlph = 180;
            }
            else TPh += 90;
            cout << vTab[i] << endl; //for debuging purp.
        }
        for (int i = 0; i < 10; i++) { //initializing edges
            if (i < 4) {
                eTab[i] = edge(vTab[i], vTab[(i + 1) % 4]);
                eTab[i + 4] = edge(vTab[i], vTab[i + 4]);
                cout << eTab[i] << eTab[i + 4] << endl;
            }
            else {
                eTab[i + 4] = edge(vTab[i], vTab[((i + 1) % 4) + 4]);
                cout << eTab[i + 4] << endl;
            }
        }
    }
    void print() {
        cout << "Cube: \n";
        for (int i = 0; i < 12; i++) {
            edge temp = eTab[i];
            cout << i+1 << ". " << temp << endl;
        }
    }
};

int main() {
    /*vertice a = vertice();
    vertice b = vertice(4.2, 1.3, 2.2);
    cout << b;
    b = b + a;
    b = b - a;
    b.rotate(90, 90, 90);
    cout << endl << a;
    edge e1 = edge(a, b);
    cout << endl << e1;*/
    //vertice b = vertice();
    //cout << b;
    cube c1 = cube(4);
    //c1.print();

}

I really will appreciate your help because I really am stuck here and don't know what to do...

eXway
  • 3
  • 1
  • Your `operator-` and `operator+` in the class `vertice` are wrong. They are wrongly returning references to local objects. I got Segmentation Fault. After removing the `&`s from the return types, I got `nan` and some very small values. – MikeCAT Jun 17 '21 at 10:21
  • There is a lot of issues with your code, mostly with the lifetime of objects and use of pointers/references. May I suggest getting [a good C++ book](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) to learn from? – Yksisarvinen Jun 17 '21 at 10:22
  • You want to check the implementation of your operators and maybe add assignment operator= and constructor by copy. Some examples here : https://en.cppreference.com/w/cpp/language/operators – Pierre Baret Jun 17 '21 at 10:24
  • I found that `vTab[i].rotate(Ph + TPh, Alph+ TAlph, 0);` is generating `nan`. This is due to the value `Alph` is `nan`. `asin(3 * sqrt(2) / 3)` is returning `nan`. `3 * sqrt(2) / 3` will exceed `1` and there are no angle that makes `sin()` return that value, – MikeCAT Jun 17 '21 at 10:26
  • @MikeCAT Thank you for pointing that out, I might have slipped my finger bc it should be 2 * sqrt(2) / 3 – eXway Jun 17 '21 at 10:32

0 Answers0