Relier des points dans une paintbox par une courbe

[Résolu]
Signaler
Messages postés
8
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
20 août 2007
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
<!-- icon and title -->

Bonjour,

Je suis un grand débutant en delphi (j'ai commencé y'a 5 semaines!) et
je réalise un programme permettrant de comprendre comment on guide un
missile suivant différentes lois de guidage.


Je dois faire rentrer par l'utilisateur la trajectoire de la cible et
le programme calcule celle du missile puis représente tout ca à l'aide
du canvas d'une paintbox.


Pour l'instant la trajectoire de la cible est rectiligne : je clique à
un endroit dans la paintbox (pour le point de départ) puis cela trace
une droite.


J'aimerai pouvoir rentrer un certain nombre de points et faire passer
la cible par ceux ci sans avoir des morceaux de droites il faut
quelques chose qui represente une trajectoire d'une cible réel (avions
ou autre).


Les positions de la cible ainsi que celles du missile sont rentrées
dans un tableau ce qui me permet d'effectuer les calculs facilement,
j'aimerai garder ce système avec la trajectoire calculée avec plusieurs
points.


voila si vous avez des idées et ou meme des morceaux de codes je suis
preneur, si y'en a que ca interesse le sujet de ce programme dites moi
et je vous détaillerai le programme!
si vous pouvez ou voulez de m'aider à développer ce programme ca
m'interesse aussi car je galère un peu pour l'optimiser et faire
certains trucs!


Voila j'espère n'avoir pas été trop long, merci d'avance!

A+

26 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
implementation

{$R *.dfm}


var CibleX,CibleY : double;   // Coordonnées de la cible.
     Vitesse : Integer = 1000;//Vitesse de la cible.
     Angle   : Extended;       //Par rapport à l'horizontale.



procedure TForm1.btnGoClick(Sender: TObject);
begin
Form1.keypreview:=True;
Canvas.FillRect(Form1.ClientRect);//Efface tout.
Angle  := 0;//Vole horizontalement au début.
CibleX := 0; //Coordonnées de départ.
CibleY := 150;
Canvas.MoveTo(Round(CibleX),Round(CibleY));Timer1.Interval :100;//> calcul de position 10 fois/seconde
Timer1.Enabled := true;
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
CibleX := CibleX + (cos(Angle) * (Vitesse/1000));
CibleY := CibleY + (sin(Angle)  * (Vitesse/1000));
Canvas.LineTo(round(CibleX),round(CibleY));
if round(CibleX) = Form1.ClientWidth then timer1.Enabled := false;
end;



procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Case Key of
  VK_LEFT   : if Vitesse-40>0 then Inc(Vitesse,-40);
  VK_RIGHT : Inc(Vitesse,40);
  VK_UP     : Angle:=Angle-0.1;
  VK_DOWN: Angle:=Angle+0.1;
end;
end;

END.

A toi d'ajuster les valeurs selon ce que tu désires.

@++

PS: Il y a la procédure SinCos dans l'unité Math qui est 2 fois plus rapide que l'appel de Sin puis l'appel de Cos.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,

Eh bein! Après seulement 5 semaines de Delphi, t'as pas froid aux yeux.
Je me souviens que Mauricio avait développé un truc du genre, mais je ne le retrouve plus...  ( je blague :)

Plus sérieusement, pour te permettre de faire des recherches, ton problème est un problème d'


interpolation polynomiale
.

Et tu peux commencer ici.

Renseigne-toi aussi sur les courbes de Bézier.

Bon courage! 
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Pour simplifier ton problème, on peut imaginer que la trajectoire de la cible décrit des arcs de cercles.

Ainsi, imaginons une cible se déplaçant de A vers B en ligne droite, puis qu'elle passe par C,D,E... en décrivant des arcs de cercle.
Le problème se résoud donc en cherchant l'équation du 1er cercle sachant qu'il passe par B et C et qu'il est tangent à AB.

Puis du 2ème cercle passant par C et D et tangent au 1er cercle.

Puis du 3ème cercle qui passe par D et E, tangent au 2ème, etc...

(Faire gaffe aux intervalles pour déterminer l'arc à afficher)

Je pense que c'est la méthode la plus simple et qui donnerait une image assez réaliste (mais, bien sûr, inexacte).
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
De + en + simple!  lol

var TabloDePts : array[0..5000] of Tpoint;//Ton tableau.
     NbrePixels   : Integer;//Nbre de pixels utilisés ds TabloDePts.



procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var  i:Integer;
begin
for i := 0 to 5000 do TabloDePts[i]:= point(0,0);//Initialisation du tableau.
TabloDePts[0]:= point(X,Y);// Le 1er point.
NbrePixels := 1;
end;



procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if ssLeft in Shift then begin //vérifie que le bouton gauche est enfoncé.
   {Trace la trajectoire en noir.}
   PaintBox1.Canvas.Pixels[X,Y] := clblack;
   TabloDePts[NbrePixels] := point(X,Y);//On mémorise les TPoints dans le tablo
   inc(NbrePixels);
end;
end;
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
...ça ne dessine pas toujours une très jolie courbe.

On va dire qu'il y a des trous d'air, ok? 
Messages postés
8
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
20 août 2007

Je vais voir ce que je peux faire avec ca! merci

Mais plus simplement personne n'a réaliser un programme on peut rentrer des points et le programme en fait une courbe?

sinon j'aurai besoin d'aide pour representer le vecteur vitesse missile evoluant sur la trajectoire. En fait il faudrait que je puisse representer une fleche qui evolue en fonction d'un parametre et de son point de départ. j'ai vu qu'il y avait exactement ce que je voulais en vbasic mais il me le faudrait en delphi. je ne sais pas comment faire. http://www.vbfrance.com/codes/DESSIN...ECHE_5420.aspx

voila si vous pouvez m'aider ca serait sympa! merci d'avance a plus

<!-- / message -->

Salut,

Les vecteurs sont en gras  et ° veut dire initiale c'est à dire à l'instant t= 0

On a  P =mg et p= m a donc mg =ma d'ou g= a .



a =axi+ayj+azk


On en déduite que ax= 0, ay=0 et az=-g (faier un schéma).
Sachant que ad<gras>v/dt et que v</gras>dOM/dt (OM est le vecteur position entre l'origine O du repère et le point M).  

On en déduit que :


VX=a* t +constante=constante=V°X


Vy=a* t +constante=constante=V°<sub>y

</sub>Vz=a* t +constante=-gt+V°z


On en déduit
 
x=V°X  * t + x°


y=V°y  * t + y°<sub>

</sub>z=-0,5  * g * t2+V°z  * t  + z°

Si on s'inscrit dans un plan tel que l'objet est dans le plan 0YZ, on a

x=V°X  * t + x° = 0

On en déduit que

z(y)=-0,5  * g *[(y-y°) /V°y]2+V°z  *[(y-y°) /V°y]t  + z°

Remarque : g=9,81. Il faut connaitre la vitesse initiale (sens, direction et intensité : on calcul les composants x,y et z par de la trigonométrie : cosinus, sinus, tangeante) et la position initiale (en x, y et z).

On a donc z(y)=ay2+by+c. Comme a est négatif la fonction est initialement croissante puis après décroissante ce qui correspond bien au mouvement d'un objet lancé (Mouvement parabolique).

Bon coding.

Oups la boulette (vive les copier-coller) :

z(y)=-0,5  * g *[(y-y°) /V°y]2+V°z  *[(y-y°) /V°y]  + z°
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@Francky
Et le pilote du zingue, dans tout ça? Il est dégommé ou il s'éjecte?  o_O

@Benjikos
Pour ne pas t'ôter le plaisir de chercher et surtout de trouver, on va aussi te laisser faire un minimum de recherches sur Gogol, hein?
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@Benjikos
Dans les commentaires du source en VB que tu donnes, y'a un exemple en Delphi ! ! !
T'as du bol, je trouve.
C'est un peu foireux, ce code, mais t'as une bonne piste.

Mince j'ai pas pris le cas ou le pilote il a mangé du Chili . tu veux la modif Cari ?
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Dans ce cas, c'est pas la peine de l'abattre, Francky.
Il s'écrasera bien tout seul. 

Et ton missile, c'est un SKUD? (On sait quand ça part, mais on ne sait jamais où ça va tomber)      mdr

No c'est un missile sol-air . Bon arrettons de throller on va se faire disputer par PCPT .

Ca serait sympas de valider le topic .
Messages postés
8
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
20 août 2007

Bon alors dans l'ordre :

- Merci à toi, cari:

j'ai tenté le coup des arcs de cercle c'est vrai que ca fait pas toujours quelques choses de bien! par contre j'essaye avec les courbes de bezier ca donne pas encore ce que je veux car je n'arrive pas bien à les parametrer mais je suis sur que la solution est la! ^^
C'est la fonction PolyBezierTo qui est la plus interessante.

Sinon pour la fleche: J'avais pas du tout vu le commentaire merci !!  mais ca me permet juste de voir comment dessiner la fleche mais moi mon probleme c'est comment, à partir d'une courbe (une serie de points dans un tableau) et un module , dessiner une fleche représentant le vecteur vitesse associé à la courbe. Puis pouvoir l'effacer pour la représenter au point suivant et ainsi de suite.
En fait, la fleche (l'objet fleche) doit etre parametrer par le point d'avant, celui courant et celui d'apres et biensur le module je pense mais je vois pas comment faire ca.

- pour foxy : pour tes sites merci mais je les ai deja vu et cela traite, comme pour francky de trajectoire parabolique et un missile n'a pas une trajectoire parabolique sinon celui ci s'apparente à une roquette ou des obus d'un canon.

Pour le guidage d'un missile, on utilise 3 lois à l'heure actuelle :
- La poursuite pure ou courbe du chien: le missile se dirige à tout instant vers la position courante de la cible (la plus simple mettre en équations)
- La navigation par alignement: on fait voler le missile à relèvement constant par rapport à la cible. Plus simplement, en navigation maritime lorsqu'un navire ne defile pas sur l'horizon c'est que vous allez entrer en collision avec lui, lui missile suit ce principe. (ca se corse pas mal à coder surtout à transcrire en info ^^).
- Enfin la navigation proportionnelle," attention ames sensible s'abstenir " La vitesse de rotation du missile est proportionnelle à celle de la droite missile but. La plus dur à coder enfin celle ou j'ai eu le plus de mal!

voila toutes ces lois de guidage sont deja mis en equations et integrer au programme et marchent à peu près .

en fait ce que je voudrai faire c'est faire voler la cible non pas en ligne droite comme actuellement mais suivant des points saisis par l'utilisateur par faire plus réel!
Le plan d'etude est un plan 2d soit x,y soit x,z ou y,z peu importe ca marche dans les 2 cas. Je calcule les positions du but et du missile dans des tableaux d'entiers TabM et TabB, et je voudrai à partir de ces tableaux representé le vecteur vitesse de chaque mobile ou au moins du missile.

Merci d'avance et mille excuses pour ce très très long message!
si vous voulez en savoir un peu plus sur le sujet, demandez!

[auteurdetail.aspx?ID=282110 Benjikos]
: Dis donc ta question elle a une forme parabolique : elle a pas arrété de changer depuis le départ . Une question par topic stp .

tu dois etre le cousin à Cari : tu arrettes pas de throller.

Non non non et non  :  Pour ta gouverne un missile à un mouvement parabolique (la preuve un missile au démarrage chasse tjs de l'arriere train : je crois que Japee aussi ). D'apres wikipedia : Un missile est un projectile autopropulsé. Donc comme tout projectile il a un mouvement parabolique : ton affirmation est donc fausse . Tu as qu'a faire le bilan des forces pour t'en convaicre.

Le lien que t'a passé f0xi traite le probleme aussi comme un projectile sauf que dans le cas de f0xi la cible se déplace (chose que tu avas pas précisé). Et tu remarquera au passage que le missile a une forme parabolqique (pas beau vilain tiens) d'apres le dessin. Donc ton affirmation est harchis fausse (Le francky il est pas content là).

Pour le lien de foxi, on peut aussi traité ce cas de figure par la méthode que je t'ai passé : au point d'impact les points cible/missile sont confondus. Il en résulte un systeme d'équations à résoudre. Ensuite si la cible change subitement de trajectoire et bien il suffit d'appliquer la meme méthode mais par zone d'intervalles de déplacement (chaque déplacement avant changement de direction aura un mouvement parabolique).

Pour conclure si tu avais cherché un ptit peu tu serai tombé sur une source que f0xi a fait (la chenille) et qui pourrait répondre à ta demande de guidage automatique .

Ensuite pour aligner des points il te faut soit trouver une équation (ce qu'il y a de plus simple d'ou  ma démonstration ) soit faire de la régression (voir les méthodes passées par Cari ).
Messages postés
8
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
20 août 2007

Bon alors: déjà ma question n'a pas changée : c'est toujours comment
faire pour relier des points entrés par l'utilisateur à l'aide d'une
courbe, après j'ai rajouté comment je pourrai dessiner une flèche
représentant le vecteur vitesse d'une trajectoire? voila c'est tout!


Après je t'assure que les missiles  n'ont pas une trajectoire parabolique .

Je suis actuellement en stage chez Thales, un des plus grands
fabricants d'autodirecteurs de missile donc je pense en connaitre un
peu plus sur le sujet.

Bref, ce n'est pas la question, le missile est un projectile guidé  à  l'aide de lois de guidage que l'on integre à l'ordinateur de bord de l'engin.

J'ai enoncé ces lois plus haut, aprés  un  mouvement
parabolique est un mouvement ballistique c'est à dire comme lorsque
l'on lance une balle de tennis, si les missile etaient guidés comme ca,
ils n'iraient pas loin!


Voila ca c'est une ébauche de mon programme : en bleu la cible et en rouge le missile

ca se trace grace à un timer et au canvas de la paintbox
Poursuite pure


Le but de ce programme n'est pas d'essayer de faire toucher la cible
par le missile par n'importe quelle moyen mais d'illustrer la realité
du guidage missile (c'est a dire avantages et inconvenients de chaque
lois)
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Et si tu changeais la façon d'aborder le problème pour les points?
Car ça me semble chaud et t'es même pas sûr d'avoir un résultat correct (si l'utilisateur place ses points de façon trop fantaisiste, par exemple).

Moi, je ferais comme ceci:
Tu ajoutes une sorte
de joystick virtuel à ton projet (une flèche haut, une autre bas).
Et la trajectoire de la cible se trace toute seule en incrémentant X dans un Timer ou autre. Si l'utilisateur ne touche pas au
joystick, la cible se déplace horizontalement, en ligne droite. Si l'utilisateur tire ou pousse sur le manche, la cible monte ou descend... Et tu remplis ton tableau de points à la volée.
Outre la simplicité de mise en oeuvre, tu obtiendrais ainsi un comportement beaucoup plus réaliste car tu pourrais aussi faire varier la vitesse de la cible en jouant sur l'Interval du Timer.
Qu'en penses-tu? (si j'ai été assez clair).
Messages postés
8
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
20 août 2007

Excellente idée ! je vais faire ca je crois ! car j'essaye depuis ce
matin avec les courbes de bezier mais aucun resultat je bloque sur la
restituion des points de la courbe en fait!


Donc ce 'joystick', ca serait une fleche vers le haut et une vers le
bas ou juste les fleches du clavier, comment representer ca et
l'integrer au programme?


Je vais etudier ca ! je vous tiens au courant!

merci!
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
...Pas des flèches! La molette centrale pour la vitesse et les boutons pour haut et bas, bien sûr. J'suis con, moi.  lol

Et chez Thales, ils te laissent te balader sur le Net?!
Zont pas peur, didonc!