예제 #1
0
   ////////////////////////////////////////////////////////////////////////
   ///
   /// @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 );
   }
예제 #2
0
float Force::normeProduitVectoriel(Force vect)
{
    sf::Vector3f vect3d = produitVectoriel(vect);
    float carreZ = pow(vect3d.z,2);
    return (float) sqrt(carreZ);
}
예제 #3
0
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;
	}
}
예제 #4
0
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;
}