Exemplo n.º 1
0
    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));
    }
Exemplo n.º 2
0
 public EquationCartesienne(EquationReduite Reduite)
 {
     a = -Reduite.a;
     b = 1;
     c = -Reduite.b;
 }
Exemplo n.º 3
0
    /// <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);
                }
            }
        }
    }