Page d'accueil Description du projet
/******************************************
 *
 *   Cedric Pradalier   2001
 *   mail : http://cedric.pradalier.free.fr/mail.html
 *
 *****************************************/



#include "output.h"
#include "itineraire.h"
#include <stdio.h>
/************************************************

  Implementation des itineraires


************************************************/


/* Extraction des itineraires 
   Si une correspondance est donnee, 
   elle est suivie et RECOPIEE.
*/
CItineraire::CItineraire(CCorresp * hd)
{
    duree = HNULL;
    NbCorresp = 0;
    if (hd == NULL)
        lCorresp = hd;
    else
    {
        /* Parcours de la liste chainee des 
           correspondances */
        lCorresp = new CCorresp(*hd);
        hd = hd->precedent;
        CCorresp *corr = lCorresp;
        NbCorresp++;
        while (hd != NULL)
        {
            NbCorresp++;
            corr->precedent = new CCorresp(*hd);
            corr = corr->precedent;
            hd = hd->precedent;
        }
    }
}


/* Destruction de l'itineraire par parcours
   chaine de la liste des correspondances */
CItineraire::~CItineraire()
{
    if (lCorresp != NULL)
    {
        CCorresp * t = lCorresp;
        while (lCorresp != NULL)
        {
            lCorresp = lCorresp->precedent;
            delete t;
            t = lCorresp;
        }
    }
}


/* Ajoute un arret en tete de la liste des correspondances */
void CItineraire::Add(CArrets * a,CLignes * l,SensTrajet s) 
{
    CCorresp * t = new CCorresp(a,l,s);
    t->precedent = lCorresp;
    lCorresp = t;
    NbCorresp++;
}




/* Met A jour les horaires de passage a tous les
   arrets de la liste de correspondances 
    Valeurs de retour :
    0 : La liste a ete mise a jour avec succes 
    1 : Impossible de calculer : un arret.
    2 : Impossible de trouver une suite d'horaire 
        convenable.
    Parcours classique de liste chainee et mise a jour
    de la duree du voyage.
 */
int CItineraire::UpdateHoraires(CHoraire LimiteArrivee)
{
    if (NbCorresp <= 1)
        return 1;
    CHoraire h1,h2 = LimiteArrivee;
    CCorresp * l1, * l2;
    l2 = lCorresp;
    l1 = lCorresp->precedent;
    l2->depart=LimiteArrivee;
    while ((l1 != NULL) && (h1 != HNULL))
    {
        h1=l1->ligne->Passage(l1->arret,l2->arret,h2);
        if (!h1.IsValide() || !h2.IsValide())
        {
            duree = HNULL;
            return 2;
        }
        l2->arrivee = h2;
        l1->depart = h1;
        h2 = h1;
        l2 = l1;
        l1 = l1->precedent;
    }
    
    if (h1 != HNULL)
    {
        duree = lCorresp->arrivee - l2->depart;
/*      sprintf(outbuf,"\n depart : ");FlushBuffer();l2->depart.Print();
        sprintf(outbuf,"\n arrivee : ");FlushBuffer();lCorresp->arrivee.Print();
        sprintf(outbuf,"\n duree : ");FlushBuffer();duree.Print();
        sprintf(outbuf,"\n");FlushBuffer();
*/  }
    return 0;
}
        
/* Affiche un itineraire :
   Pour afficher dans l'ordre, on extrait tous les arrets 
   dans les tableaux. Ensuite, parcours et mise en forme.


 Depart :  Gresivaudan
 Arrivee : Corenc Mairie
 Date :    Mardi 16/11/1999
 Arrivee -- heure limite : 11:30
--------------------------------------------------
Duree : 00:26 Depart : 11:04 [ligne31] 
 Hotel de Police : Arrivee : 11:13 [ligne31] -- Depart : 11:21 [ligne32] 
 >> Arrivee : 11:30 [ligne32] 
--------------------------------------------------
Duree : 00:26 Depart : 11:04 [ligne31] 
 Saint Roch : Arrivee : 11:15 [ligne31] -- Depart : 11:19 [ligne32] 
 >> Arrivee : 11:30 [ligne32] 
--------------------------------------------------
*/
void CItineraire::Print()
{
    if (NbCorresp <= 1)
    {
        sprintf(outbuf,"Itineraire invalide");
        FlushBuffer();
    }
    else
    {
        CCorresp * l1 = lCorresp;
        CVector V;
        int i;
        for (i=0;i<NbCorresp;i++)
        {
            V.add((CObjet*)l1);
            l1 = l1->precedent;
        }
            
        sprintf(outbuf,"Duree : ");FlushBuffer();
        duree.Print();
        l1 = (CCorresp*)(V.ElemAt(NbCorresp-1));
        sprintf(outbuf," Depart : ");FlushBuffer();
        l1->depart.Print();
        sprintf(outbuf," [%s] ",l1->ligne->mName);FlushBuffer();
        for (i=NbCorresp-2;i>0;i--)
        {
            l1 = (CCorresp*)(V.ElemAt(i));
            sprintf(outbuf,"\n %s : Arrivee : ",l1->arret->mNom);FlushBuffer();
            l1->arrivee.Print();
            sprintf(outbuf," [%s] ",l1->precedent->ligne->mName);FlushBuffer();
            sprintf(outbuf,"-- Depart : ");FlushBuffer();
            l1->depart.Print();
            sprintf(outbuf," [%s] ",l1->ligne->mName);FlushBuffer();
        }
        l1 = (CCorresp*)(V.ElemAt(0));
        sprintf(outbuf,"\n >> Arrivee : ");FlushBuffer();
        l1->arrivee.Print();
        sprintf(outbuf," [%s] ",l1->ligne->mName);FlushBuffer();
        sprintf(outbuf,"\n");FlushBuffer();
    }
}