/******************************************
*
* 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();
}
}