Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VOITURE INTELLIGENTE :: OPTIMISATION DE TRAJECTOIRE


Information sur la source

Catégorie :Tutoriaux Niveau : Initié Date de création : 15/01/2005 Date de mise à jour : 16/01/2005 22:50:55 Vu / téléchargé: 9 495 / 1 655

Note :
9,11 / 10 - par 9 personnes
9,11 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

Une source posté il y a quelques jours par Stan62970 m'a donner une idée ...
Comment faire pour qu'une voiture puisse rejoindre un point ?
Pour cela, trois problèmes :
- la voiture doit respecter une courbe de virage (elle ne peut pas pivoter sur elle-même)
- la trajectoire doit être la plus courte possible.
- la voiture ne peut pas passer les vitesses trop fréquement (et alors faire avant/arrière pour avancer en escalier)

J'ai donc pondu ce petit bout de code ...
 

Source

  • // Variables de mouvement
  • var rayon = 100;
  • var vitesse = 5;
  • var rotation = vitesse/rayon;
  • // Evènement :
  • var onEnterFrame = undefined;
  • var pause = false;
  • onMouseUp = function () {
  • Objectif._x=_xmouse, Objectif._y=_ymouse;
  • onEnterFrame = function () {
  • if (!pause)
  • rejoindre(Voiture, Objectif);
  • };
  • };
  • // Fonction qui fait tout !
  • function rejoindre(mc, pt)
  • {
  • // Recueille les coordonnées relatives de la cible.
  • var Cible = new Object();
  • Cible.x=pt._x, Cible.y=pt._y;
  • Objectif._parent.localToGlobal(Cible);
  • mc.globalToLocal(Cible);
  • // Analyse la position de la cible.
  • var distance = Cible.x*Cible.x+Cible.y*Cible.y;
  • // _________________________________________________________________
  • // Trois cas possibles en fonction de la position voiture/cible.
  • if (Math.abs(Cible.y)<5 and Cible.x>0) {
  • // La cible est droit devant.
  • avancer(mc, vitesse);
  • }
  • else if (Math.abs(Cible.y)<5 and Cible.x>-rayon) {
  • // La cible est juste derrière.
  • avancer(mc, -vitesse);
  • }
  • else if (distance<2*rayon*Math.abs(Cible.y)) {
  • // La cible est juste à coté de la voiture
  • // (dans les deux cercles) : il faut reculer.
  • tourner(mc, Cible.y>0);
  • avancer(mc, -vitesse);
  • }
  • else if (Cible.x>0) {
  • // La cible en avant de la voiture : il faut tourner pour l'atteindre.
  • tourner(mc, Cible.y>0);
  • avancer(mc, vitesse);
  • }
  • else if (distance<rayon*rayon*2) {
  • // La cible est arrière de la voiture : il faut faire demi-tour.
  • tourner(mc, Cible.y<0);
  • avancer(mc, -vitesse);
  • }
  • else {
  • // La cible est en arrière de la voiture : il faut faire demi-tour.
  • tourner(mc, Cible.y>0);
  • avancer(mc, -vitesse);
  • }
  • // On arrête de bouger si on a atteint l'objectif.
  • if (distance<25*25) {
  • this.onEnterFrame = undefined;
  • affiche = " Arrêt des moteurs";
  • }
  • }
  • // Fonction outils :
  • function avancer(mc, distance) {
  • // On peut avancer d'une distance positive ou négative.
  • mc._x += distance*Math.cos(mc._rotation*Math.PI/180);
  • mc._y += distance*Math.sin(mc._rotation*Math.PI/180);
  • }
  • function tourner(mc, sens) {
  • // "sens" est un booléen indiquant si il faut tourner dans le sens positif.
  • mc._rotation += (sens ? 1 : -1)*rotation*180/Math.PI;
  • }
// Variables de mouvement
var rayon = 100;
var vitesse = 5;
var rotation = vitesse/rayon;

// Evènement :
var onEnterFrame = undefined;
var pause = false;
onMouseUp = function () { 
	Objectif._x=_xmouse, Objectif._y=_ymouse;
	onEnterFrame = function () { 
		if (!pause) 
			rejoindre(Voiture, Objectif);
	};
};

// Fonction qui fait tout !
function rejoindre(mc, pt)
{
	// Recueille les coordonnées relatives de la cible.
	var Cible = new Object();
	Cible.x=pt._x, Cible.y=pt._y;
	Objectif._parent.localToGlobal(Cible);
	mc.globalToLocal(Cible);
	// Analyse la position de la cible.
	var distance = Cible.x*Cible.x+Cible.y*Cible.y;
	
	// _________________________________________________________________
	// Trois cas possibles en fonction de la position voiture/cible.
	if (Math.abs(Cible.y)<5 and Cible.x>0) {
		// La cible est droit devant.
		avancer(mc, vitesse);
	} 
	else if (Math.abs(Cible.y)<5 and Cible.x>-rayon) {
		// La cible est juste derrière.
		avancer(mc, -vitesse);
	} 
	else if (distance<2*rayon*Math.abs(Cible.y)) {
		// La cible est juste à coté de la voiture
		// (dans les deux cercles) : il faut reculer.
		tourner(mc, Cible.y>0);
		avancer(mc, -vitesse);
	} 
	else if (Cible.x>0) {
		// La cible en avant de la voiture : il faut tourner pour l'atteindre.
		tourner(mc, Cible.y>0);
		avancer(mc, vitesse);
	} 
	else if (distance<rayon*rayon*2) {
		// La cible est arrière de la voiture : il faut faire demi-tour.
		tourner(mc, Cible.y<0);
		avancer(mc, -vitesse);
	} 
	else {
		// La cible est en arrière de la voiture : il faut faire demi-tour.
		tourner(mc, Cible.y>0);
		avancer(mc, -vitesse);
	}
	// On arrête de bouger si on a atteint l'objectif.
	if (distance<25*25) {
		this.onEnterFrame = undefined;
		affiche = " Arrêt des moteurs";
	}
}
// Fonction outils :
function avancer(mc, distance) {
	// On peut avancer d'une distance positive ou négative.
	mc._x += distance*Math.cos(mc._rotation*Math.PI/180);
	mc._y += distance*Math.sin(mc._rotation*Math.PI/180);
}
function tourner(mc, sens) {
	// "sens" est un booléen indiquant si il faut tourner dans le sens positif.
	mc._rotation += (sens ? 1 : -1)*rotation*180/Math.PI;
}

Conclusion

Demandez s'il vous faut des explications !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

15 janvier 2005 14:49:42 :
Dépot de la source au format Flash MX 6.0
16 janvier 2005 22:50:55 :
Nouvelle optimisation pour que la voiture rejoigne plus rapidement (et plus logiquement) un point situé juste derrière elle.

Commentaires et avis

signaler à un administrateur
Commentaire de pegase31 le 15/01/2005 14:56:38 administrateur CS

trés sympa, comme d'hab' !;)
Mais il y a une chose que tu n'as pas optimisé :

C'est que quand tu colles un point de destination juste derrière la voiture, elle nous fait un petit coup de marche arrière avant de reprendre une marche avant ... pas trés logique, alors qu'avec juste une marche arrière ça aurait suffit !

Il faudrait que tu définisse une distance max à partir de laquelle une seule marche arrière serait trop longue ... en-dedans de cette distande, la voiture n'aurait qu'à faire une marche arrière et le tour est joué ! ;)

Peg'

signaler à un administrateur
Commentaire de WhiteMagus le 15/01/2005 22:34:48

ça rend bien. Le code est très bon. C'est pas toujours une attitude très répendue chez les automobilistes, mais elle se comporte bien physiquement.
Prochaine étape : les crénots ?

signaler à un administrateur
Commentaire de SuperDevy le 16/01/2005 22:54:32

La source a été mise à jour : j'ai tenté de faire comme tu m'as conseillé pegase.

Pour ce qui est des crénots ... et bien heu ... faut voir. C'est toujours possible !
Le problème ici est qu'il n'y a strictement aucune pride en compte d'un obstacle éventuel.

Merci pour vos commentaires, ils me font énormément plaisir.

signaler à un administrateur
Commentaire de WhiteMagus le 19/01/2005 17:24:55

Bon. Et bien en tout cas, si tu mets des crénots, fais une autre source stp. J'ai déjà voté à celle là --> 9/10 |
@+ !

signaler à un administrateur
Commentaire de Blacknight91titi le 23/01/2005 11:06:56

Super !!
Le code est très bon.
Peut être est ce le début d'un simulateur de conduite en flash : le tout premier, du jamais vu ! mais je n'ose même pas imaginer le code :p
9/10

signaler à un administrateur
Commentaire de benjymanson le 05/10/2005 17:21:51

c'est marrant lol

signaler à un administrateur
Commentaire de bibi_81 le 28/08/2006 15:43:48

J'ai juste une pitite question 1 an apres : Comment vous faites pour trouver les formules mathématiques des déplacements et autres XD.
Merci

signaler à un administrateur
Commentaire de SuperDevy le 28/08/2006 15:58:36

Je réfléchis :D
Non, sans blaque c'est un peu de calcul géométrique et beaucoup de tatonnement. Il n'y a pas vraiment de formule ici, c'est surtout de l'algorithmique.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.