RISOLTO [C++] Vector Orthogonalization

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Marcus Aseth

Utente Attivo
Messaggi
408
Reazioni
138
Punteggio
60
Domanda :D
Codice sotto sono le funzioni dentro la mia classe Vector:
Codice:
//Methods
    inline float computeMagnitude() {
        magnitude = sqrt(x*x + y*y + z*z); return magnitude;
    }

    inline void normalize() {
        computeMagnitude();
        x = x / magnitude; y = y / magnitude; z = z / magnitude;
    }

    inline float angleBetween(Vector& v1, Vector& v2) {
        return acos(Vector::dotProduct(v1, v2) / (v1.computeMagnitude() * v2.computeMagnitude()));
    }

    inline void orthogonalization(Vector v2) {
        this->x = x - (this->magnitude * cos(angleBetween(*this, v2)));
    }

    //Static Method
    static inline float dotProduct(const Vector& v1, const Vector& v2) {
        return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
    }

Mentre invece questo è il contenuto di main(), notare che vY è inclinato:

Codice:
int main()
{
    Vector vX(100, 0, 0), vY(30, 100, 0);
    cout << "vY magnitude = " << vY.computeMagnitude() << endl;
    cout << "(vY,vX) dot product: " << Vector::dotProduct(vX, vY) << endl << endl;
    
    cout << "orthogonalization..." << endl;
    vY.orthogonalization(vX); //orthogonalize vY based on vX
    cout << "dot product: " << Vector::dotProduct(vX, vY) << endl;
    cout << "vY magnitude = " << vY.computeMagnitude() << endl << endl;

    cout << "normalize vY" << endl;
    vY.normalize();
    cout << "dot product: " << Vector::dotProduct(vX, vY) << endl;
    cout << "vY magnitude = " << vY.computeMagnitude() << endl;

    return 0;
}

E questo è l'output nella console:
vY magnitude = 104.403
(vY,vX) dot product: 3000

orthogonalization...
dot product: 0.000190735
vY magnitude = 100

normalize vY
dot product: 1.90735e-06
vY magnitude = 1

ignorando il fatto che sto applicando la cosa solo sull'asse X (per vedere se funziona correttamente prima di continuare), questa procedura in teoria dovrebbe rendere i vettori perpendicolari e ritornarmi un dot product = 0.
E visto l'output, sto applicando male dal punto di vista matematico o semplicemente una precisione di 0.00000 non si può ottenere?
Inoltre dopo la chiamata a normalize, cos'è quel numero stranissimo "1.90735e-06" ?
 
1.90735e-06 significa 1.90735*10[sup]-6[/sup]. Semplicemente si tratta della notazione scientifica per rappresentare i numeri (ci sono troppi 0 da rappresentare).
Valuta per una precisione migliore l'utilizzo di double al posto dei float.

Una precisione assoluta (tipo 0.0000000) difficilmente - molto difficilmente - riuscirai ad ottenerla comunque. Premetto però di non aver verificato i tuoi calcoli.
 
Grazie del suggerimento, con quella modifica l'output è:
vY magnitude = 104.403
(vY,vX) dot product: 3000

orthogonalization...
dot product: 3.55271e-13
vY magnitude = 100

normalize vY
dot product: 3.55271e-15
vY magnitude = 1

Inoltre ho cercato un convertitore di notazione scentifica online, questo nuovo "strano numero" pare sia 0.00000000000000355271, quindi direi abbastanza preciso xD
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top