//////////////////////////////////////////////////////////////////////// /// /// @fn double Droite3D::distancePoint( const Vecteur3& centre ) /// /// Calcule la distance euclidienne entre la droite et un point. /// /// @param[in] centre : Point à partir duquel la distance doit être calculée. /// /// @return Distance du point à la droite. /// //////////////////////////////////////////////////////////////////////// double Droite3D::distancePoint( const Vecteur3& centre ) { // En 2D const double ad = direction_[1]; const double bd = -1.0 * direction_[0]; const double cd = -1.0 * direction_[1] * pointDroite_[0] + direction_[0] * pointDroite_[1]; double num = fabs( ad * centre[0] + bd * centre[1] + cd ); double den = sqrt( pow ( ad, 2 ) + pow ( bd, 2 ) ); // En 3D const Vecteur3 centreNul(centre[0], centre[1], 0.0); const Vecteur3 vect( pointDroite_, centreNul ); const Vecteur3 mult = produitVectoriel( vect, direction_ ); num = mult.norme(); den = direction_.norme(); return ( num / den ); }
float Force::normeProduitVectoriel(Force vect) { sf::Vector3f vect3d = produitVectoriel(vect); float carreZ = pow(vect3d.z,2); return (float) sqrt(carreZ); }
int intersectionDroites( myVecteur2D* v1, myVecteur2D* v2, vertex& sol) { if (produitVectoriel(v1, v2) == 0) // on exclut le cas où il n'y a pas de solution : vecteur colinéaires (inclus le vecteur nul) return 0; else { /* On pose l'égalité : | Ax+t1*v1x = Bx+t2*v2x = xsol | Ay+t1*v1y = By+t2*v2y = ysol */ float t1 = 0; float t2 = 0; if (v1->getxdir() != 0 && v2->getxdir() != 0 && v1->getydir() != 0 && v2->getydir()) { float k = v2->getxdir() / v2->getydir(); t1 = (1 / (v1->getxdir() - k * v1->getydir())) * (v2->getorigin().x - v1->getorigin().x + k * (v1->getorigin().y - v2->getorigin().y)); //le diviseur est différent de zéro car les droites sont non colinéraires t2 = 1 / (v2->getxdir())*(v1->getorigin().x + t1* v1->getxdir() - v2->getorigin().x); //debug //std::cout << "cas 1" << std::endl; } else if (v1->getxdir() == 0) //v2x !0 car ils seraient colinéaires (test OK) { t2 = 1 / v2->getxdir() * (v1->getorigin().x + t1 * v1->getxdir() - v2->getorigin().x); t1 = 1 / v1->getydir() * (v2->getorigin().y - v1->getorigin().y + t2* v2->getydir()); //debug //std::cout << "cas 2" << std::endl; //std::cout << v2->getydir() << std::endl; } else if (v1->getydir() == 0) // par symmétrie (réaliser des tests) { t2 = 1 / v2->getydir() * (v1->getorigin().y + t1* v1->getydir() - v2->getorigin().y); t1 = 1 / v1->getxdir() * (v2->getorigin().x - v1->getorigin().x + t2*v2->getxdir()); //debug //std::cout << "cas 3" << std::endl; } else if (v2->getydir() == 0) // par symmétrie (réaliser des tests) { t1 = 1 / v1->getydir() * (v1->getorigin().y + t2* v2->getxdir() - v2->getorigin().y); t2 = 1 / v2->getxdir() * (v2->getorigin().x - v1->getorigin().x + t1*v2->getxdir()); //debug //std::cout << "cas 4" << std::endl; } else if (v2->getxdir() == 0) // par symmétrie (réaliser des tests) { t1 = 1 / v1->getxdir() * (v1->getorigin().x + t2* v2->getydir() - v2->getorigin().x); t2 = 1 / v2->getydir() * (v2->getorigin().y - v1->getorigin().y + t1*v2->getydir()); //debug //std::cout << "cas 5" << std::endl; } // résultats sol.x = v1->getorigin().x + t1 * v1->getxdir(); sol.y = v1->getorigin().y + t1 * v1->getydir(); if (t1 >= 0) return 1; else return -1; } }
Vecteur3D rotationAutourDunVecteur(const Vecteur3D& v1, const Vecteur3D& v2, float angle) { Vecteur3D res; res = v1*cosf(angle)+(1-cosf(angle))*(produitScalaire(v1,v2))*v2+sinf(angle)*produitVectoriel(v2,v1); return res; }