Voiture intelligente :: optimisation de trajectoire

Soyez le premier à donner votre avis sur cette source.

Vue 14 291 fois - Téléchargée 1 921 fois

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 / Exemple :


// 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 !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
842
Date d'inscription
dimanche 24 novembre 2002
Statut
Membre
Dernière intervention
2 juillet 2007

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.
Messages postés
345
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
25 octobre 2007

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
Messages postés
2
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
5 octobre 2005

c'est marrant lol
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
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
Messages postés
764
Date d'inscription
lundi 21 juin 2004
Statut
Membre
Dernière intervention
5 février 2010

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 |
@+ !
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.