begin process at 2012 02 10 13:10:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > VOITURE INTELLIGENTE :: OPTIMISATION DE TRAJECTOIRE

VOITURE INTELLIGENTE :: OPTIMISATION DE TRAJECTOIRE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :12 180 / 1 751

Auteur : SuperDevy

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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.

 Sources du même auteur

Source avec Zip TREE AVEC RECHERCHE POUR AFFICHER UN XML.
Source avec Zip RETARDER L'EXECUTION D'UNE FONCTION
Source avec Zip COMPOSANTS POUR NON-PROGAMMEUR
Source avec Zip Source avec une capture BONNE TENUE DE ROUTE POUR CES VOITURES.
FONCTIONS MATHEMATIQUES

 Sources de la même categorie

Source avec Zip Source avec une capture COMPTEUR DE VISITES GRAPHIQUE AS2 (ACTION SCRIPT 2) FLASH CS... par snoozkilla
Source avec Zip Source avec une capture GALERIE D'IMAGES AVEC TITRES ET COMMENTAIRES par yasdar
Source avec Zip Source avec une capture GUITARE ZÉRO 1 LE MOTEUR LOURD par titouanbaillon
AS3.0: UPLOAD DE FICHIER ET RECUPERATION DE LA REPONSE DU SE... par nickydaquick
MODIFIER LES APOSTROPHES ET AUTRES CARACTÈRES MADE IN WORD D... par ourso

Commentaires et avis

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'

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 ?

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.

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 |
@+ !

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

Commentaire de benjymanson le 05/10/2005 17:21:51

c'est marrant lol

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales