public static Vector3 PointEntreDroite(EquationReduite EquationA, EquationReduite EquationB) { float XWeight = EquationA.a + EquationB.a; float ValueWeighted = EquationA.b + EquationB.b; float XValue = ValueWeighted / XWeight; float yValue = EquationA.CalculY(XValue); return(new Vector3(XValue, yValue)); }
public EquationCartesienne(EquationReduite Reduite) { a = -Reduite.a; b = 1; c = -Reduite.b; }
/// <summary> /// Retourne vrai si il y a un point de danger pour le joueur par rapport à cette roquette /// La sortie PointDeDanger indique la position du point de danger /// </summary> /// <param name="positionJoueur">Position du joueur voulant connaitre le point de danger</param> /// <param name="PointDeDanger">Sortie retournant le point de danger si il y a un danger</param> /// <returns></returns> public Vector3 GetPointDeDanger(Vector3 positionJoueur) { Vector3 PointDeDanger; if (!rigid) { throw new System.Exception("Aucun RigidBody n'est attaché à la roquette"); } else { if (rigid.angularVelocity.z == 0) //Si la roquette à une direction linéaire { Vector3 RelativePostionRocket = transform.position - positionJoueur; //Direction de la roquette par rapport au joueur Vector3 DirectionRoquette = transform.up; Vector3 Départ; Vector3 Arriver; GetTrajectoireLinéaire(out Départ, out Arriver); if (Vector3.Angle(DirectionRoquette, RelativePostionRocket) > 90) //Si la roquette va dans la direction opposé au joueur { return(PointDeDanger = Arriver); //Le point de danger est l'impact; } else { if (DirectionRoquette.x == 0) //Si on ne peut pas calculer avec une equation cartésienne (x=0) { return(PointDeDanger = new Vector3(transform.position.x, positionJoueur.y)); } else { if (DirectionRoquette.y == 0) // Si la roquette va a gauche ou a droite (y=0) { return(PointDeDanger = new Vector3(positionJoueur.x, transform.position.y)); } else// Si il faut calculer le point de danger avec une equation cartésienne; { Vector3 Perpendiculaire = new Vector3(-DirectionRoquette.y, -DirectionRoquette.x); EquationReduite EquaRoquette = new EquationReduite(transform.position, DirectionRoquette); EquationReduite EquaJoueur = new EquationReduite(positionJoueur, Perpendiculaire); Vector3 PointProcheDroite = EquationReduite.PointEntreDroite(EquaRoquette, EquaJoueur); if (DirectionRoquette.x > 0)//Si la roquette va de gauche a droite; { if (PointProcheDroite.x < Départ.x) { return(PointDeDanger = transform.position); } if (PointProcheDroite.x > Arriver.x) { return(PointDeDanger = Arriver); } return(PointDeDanger = PointProcheDroite); } else//Si la roquette va de droite a gauche { if (PointProcheDroite.x > Départ.x) { return(PointDeDanger = transform.position); } if (PointProcheDroite.x < Arriver.x) { return(PointDeDanger = Arriver); } return(PointDeDanger = PointProcheDroite); } } } } } else//Si la roquette à une direction circulaire { float rayon; Vector3 CentreCercle; GetTrajectoireCercle(out rayon, out CentreCercle); if (Vector3.Distance(positionJoueur, CentreCercle) < rayon) { return(PointDeDanger = transform.position); } else { float DistanceAuCentre = Vector3.Distance(positionJoueur, CentreCercle); float DistanceAuCercle = DistanceAuCentre - rayon; Vector3 DirectionCercle = (CentreCercle - positionJoueur).normalized; return(PointDeDanger = positionJoueur + DirectionCercle * DistanceAuCercle); } } } }