géométrie, cercle et rayon de courbure.

Le
ePilot
Bonjour,

j'ai écrit une application en VB6 avec laquelle l'utilisateur,
normalement un officier de marine, peut tracer des routes graphiquement
sur une carte électronique.
Une route est une succession de bornes (segments de droites) reliées 2 à
2 par un point de bifurcation (waypoint)commun à 2 segments.

Mais voilà, selon la dimension de chaque navire, les navigateurs
n'amorceront pas un même changement de cap au même endroit. Il faut donc
prévoir des rayons de courbure différent pour chaque navire.

Exemple: prenons 2 segments de droite AO et OB. Le navigateur suit sa
route sur le segment AO. Parvenu au point O, ou plutôt légèrement avant,
il amorce son changement de cap pour le terminer sur le segment OB.

Supposons la route AO orientée vers l'Est, au 090 degrés,et la route
suivante orientée 30 degrés sur la gauche, au 060 degrés. L'angle obtus
entre les 2 caps fait 150 degrés (180-(090-060))0.

La bissectrice de cet angle obtus fait un angle de (150/2) ou 75 degrés
avec chacune des routes au 090 et au 060. Cette bissectrice est aussi le
lieu des points sur lequel se trouvera le cercle du rayon de courbure,
peu importe ce rayon. L'angle décrit par le rayon de courbure sera
cependant toujours le même, soit 30 degrés,ie l'angle entre les 2 caps,
donc 090 - 060.

Cette bissectrice sera orientée au 355 degrés, soit 75 degrés au gauche
du nord qui est l'angle 000. Contrairement au monde mathématique, en
navigation, l'angle 0 représente la direction verticale vers le haut.Et
les angles sont positifs vers la droite et négatifs vers la gauche
(anti-horaire).

Je peux, avec la méthode Circle, dessiner un arc de cercle,
correspondant à un rayon de courbure donné, qui commence, à quelque part
sur AO et tangent à ce segment, et qui se termine sur OB, tangent à ce
OB. L'endroit où le cercle touche AO est à même distance de O que sur OB.

Ma question: comment permettre à l'utilisateur de choisir graphiquement
un rayon de courbure en déplaçant simplement le curseur du point O. Mon
problème est que la méthode Circle ne permet pas de déplacer un arc de
cercle comme on peut déplacer une Shape Circle.

J'espère être clair.

Merci pour l'aide

Jacquelin Hardy
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
LE TROLL
Le #15355681
Ahhhhhhhh... Je ne sais pas si j'ai tout
compris, tu voudrais en somme, modifier la taille
du cerce (son arc), en le bougeant du centre "O"
avec le curseur (de souris, sans doute)...

Alors, et sauf s'il y a mieux ou si je n'ai
pas compris:

Ici le schéma:

http://mesromans.free.fr/cap.jpg

Donc, avec la méthode mouse (down, move), et le
bon bouton, si on clique sur O (lato sensu), que
tu auras mémorisé, tu appelles une fram, bien
dégagé de O (top, left), et tu proposes d'annuler,
ou de cliquer sur le point où l'on veut déplacer O
(en contrôlant la zone admissible (raccord
acceptable avec les deux droites)), puis tu
fermes.
- Après, tu n'auras plus qu'à recalculer (sinus,
cosinus), le nouveau point, via le nouveau rayon,
en fonction des nouvelles coordonnées...

Pour faire plus beau, tu peux le faire
directement, tant que le bon bouton de la souris
est appuyé, à chaque pixel (pixel c'est mieux, y a
moins de chiffres) de move, à chaque pixel déplacé
dans le bon sens de O, tu recalcules et
repositionnes immédiatement l'arc, puis tu stoppes
le calcul quand le bouton est lâché.

est-ce ça que tu veux ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"ePilot" message de news:

| Bonjour,
|
| j'ai écrit une application en VB6 avec laquelle
l'utilisateur,
| normalement un officier de marine, peut tracer
des routes graphiquement
| sur une carte électronique.
| Une route est une succession de bornes (segments
de droites) reliées 2 à
| 2 par un point de bifurcation (waypoint)commun à
2 segments.
|
| Mais voilà, selon la dimension de chaque navire,
les navigateurs
| n'amorceront pas un même changement de cap au
même endroit. Il faut donc
| prévoir des rayons de courbure différent pour
chaque navire.
|
| Exemple: prenons 2 segments de droite AO et OB.
Le navigateur suit sa
| route sur le segment AO. Parvenu au point O, ou
plutôt légèrement avant,
| il amorce son changement de cap pour le terminer
sur le segment OB.
|
| Supposons la route AO orientée vers l'Est, au
090 degrés,et la route
| suivante orientée 30 degrés sur la gauche, au
060 degrés. L'angle obtus
| entre les 2 caps fait 150 degrés
(180-(090-060))0.
|
| La bissectrice de cet angle obtus fait un angle
de (150/2) ou 75 degrés
| avec chacune des routes au 090 et au 060. Cette
bissectrice est aussi le
| lieu des points sur lequel se trouvera le cercle
du rayon de courbure,
| peu importe ce rayon. L'angle décrit par le
rayon de courbure sera
| cependant toujours le même, soit 30 degrés,ie
l'angle entre les 2 caps,
| donc 090 - 060.
|
| Cette bissectrice sera orientée au 355 degrés,
soit 75 degrés au gauche
| du nord qui est l'angle 000. Contrairement au
monde mathématique, en
| navigation, l'angle 0 représente la direction
verticale vers le haut.Et
| les angles sont positifs vers la droite et
négatifs vers la gauche
| (anti-horaire).
|
| Je peux, avec la méthode Circle, dessiner un arc
de cercle,
| correspondant à un rayon de courbure donné, qui
commence, à quelque part
| sur AO et tangent à ce segment, et qui se
termine sur OB, tangent à ce
| OB. L'endroit où le cercle touche AO est à même
distance de O que sur OB.
|
| Ma question: comment permettre à l'utilisateur
de choisir graphiquement
| un rayon de courbure en déplaçant simplement le
curseur du point O. Mon
| problème est que la méthode Circle ne permet pas
de déplacer un arc de
| cercle comme on peut déplacer une Shape Circle.
|
| J'espère être clair.
|
| Merci pour l'aide
|
| Jacquelin Hardy
Jacquelin Hardy
Le #15355631
Merci bien Le Troll.
Particulièrement pour ton image. Celle-ci représente bien ma description.

>tu voudrais en somme, modifier la taille
> du cerce (son arc), en le bougeant du centre "O"
Pas exactement. Je veux que l'arc soustendu représente toujours le même
angle, donc que le centre du ou des cercles se déplace sur la bissectrice.

Me référant à ton dessin, imaginant 2 droites, une issue du centre C
(rouge) et descendant sur AO, perpendiculairement à A0. Appelons la CG.
L'autre droite, issue du même point C, descend sur OB et y est
perpendiculaire aussi. Elle sera CD. L'arc que je veux représenter va
donc de G à D. Il vaut 30 degrés. Si je veux un + grand rayon de
courbure, j'éloigne Le Centre C de O et je retrace un arc de cercle qui
vaut toujours 30 degrés mais qui n'origine maintenant plus à G mais sur
un point de AO plus près de A.

Autrement dit, le point de tangence sur AO se déplace à chaque fois
qu'on déplace le centre C du au fait qu'on change le rayon du cercle. Et
L'angle entre Get D est toujouts le même.

Je ne peux pas utliser un Shape parce que je veux représenter seulement
un arc et non un cercle au complet. Si je prends la méthode circle,
comment l'effacer à chaque fois que le user déplace la souris ? Avec XOR ?.



Jacquelin H.

LE TROLL a écrit :
Ahhhhhhhh... Je ne sais pas si j'ai tout
compris, tu voudrais en somme, modifier la taille
du cerce (son arc), en le bougeant du centre "O"
avec le curseur (de souris, sans doute)...

Alors, et sauf s'il y a mieux ou si je n'ai
pas compris:

Ici le schéma:

http://mesromans.free.fr/cap.jpg

Donc, avec la méthode mouse (down, move), et le
bon bouton, si on clique sur O (lato sensu), que
tu auras mémorisé, tu appelles une fram, bien
dégagé de O (top, left), et tu proposes d'annuler,
ou de cliquer sur le point où l'on veut déplacer O
(en contrôlant la zone admissible (raccord
acceptable avec les deux droites)), puis tu
fermes.
- Après, tu n'auras plus qu'à recalculer (sinus,
cosinus), le nouveau point, via le nouveau rayon,
en fonction des nouvelles coordonnées...

Pour faire plus beau, tu peux le faire
directement, tant que le bon bouton de la souris
est appuyé, à chaque pixel (pixel c'est mieux, y a
moins de chiffres) de move, à chaque pixel déplacé
dans le bon sens de O, tu recalcules et
repositionnes immédiatement l'arc, puis tu stoppes
le calcul quand le bouton est lâché.

est-ce ça que tu veux ???



LE TROLL
Le #15355601
Bonsoir,

Pour l'effacement, tu connais la couleur de
fond que tu mémorises. Et tu connais la couleur de
ton arc que tu as créé. Donc, pour effacer, ben,
tu retraces dans la couleur d'origine, ton ancien
arc, et tu retraces dans la couleur habituelle le
nouvel arc. En fait, on l'efface par fondue dans
la même couleur que le fond.

Pour le faire: "Xor", bof, ou toute autre
façon...
Ton arc ancien passe par exemple par les pixel
(mémorisé lors du traçage), LC:
10x17 12x18 13x 19 13x19
Ben, lors du clique choisit, avec mouse_down, on
compare si les coordonnées ci-dessus correspondent
à la position mouse_move, et si oui, on commence
l'opération...

Par contre, pour faire tout ça, il faut
intégralement dessiner sur ta feuille au pixel, ne
pas utiliser par exemple la méthode circle, mais
tracer directement au pixel, à la rigueur ave
line, en t'aidant tu sinus et cosinus, sinon, je
ne suis pas certain que tu puisse mémoriser les
pixels de la zone de traçage, si ce n'est pas toi
qui les écrit...

Vois ici, un bon exemple, j'ai tout tracé à la
main pour le centre, et les planètes avec circle,
en me servant du centre et du sinus, et du
cosinus:

http://irolog.free.fr/irolog_vente/astro_v/index.htm

Ainsi, j'ai un peu une idée de ce que tu veux
faire, par rapport aux traçages que j'ai fait sur
ce logiciel...

Il faudrait que je vois des dessins de bonne
taille, pour qu'éventuellement il me vienne des
idées, car là, je reste dans la description, alors
qu'en matière de dessin, rien ne vaut un bon
schéma...

Questions subsidiaires, en matières de marine:
- Si tu navigues au cap 270°, dis-tu 270° ou 90°
ouest ???
- Quand tu navigues au septentrion (boussole, je
laisse les déclinaisons pour l'exemple), dis-tu:
cap au 360 ou cap au 0 ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jacquelin Hardy" dans le message de news:

| Merci bien Le Troll.
| Particulièrement pour ton image. Celle-ci
représente bien ma description.
|
| >tu voudrais en somme, modifier la taille
| > du cerce (son arc), en le bougeant du centre
"O"
| Pas exactement. Je veux que l'arc soustendu
représente toujours le même
| angle, donc que le centre du ou des cercles se
déplace sur la bissectrice.
|
| Me référant à ton dessin, imaginant 2 droites,
une issue du centre C
| (rouge) et descendant sur AO,
perpendiculairement à A0. Appelons la CG.
| L'autre droite, issue du même point C, descend
sur OB et y est
| perpendiculaire aussi. Elle sera CD. L'arc que
je veux représenter va
| donc de G à D. Il vaut 30 degrés. Si je veux un
+ grand rayon de
| courbure, j'éloigne Le Centre C de O et je
retrace un arc de cercle qui
| vaut toujours 30 degrés mais qui n'origine
maintenant plus à G mais sur
| un point de AO plus près de A.
|
| Autrement dit, le point de tangence sur AO se
déplace à chaque fois
| qu'on déplace le centre C du au fait qu'on
change le rayon du cercle. Et
| L'angle entre Get D est toujouts le même.
|
| Je ne peux pas utliser un Shape parce que je
veux représenter seulement
| un arc et non un cercle au complet. Si je prends
la méthode circle,
| comment l'effacer à chaque fois que le user
déplace la souris ? Avec XOR ?.
|
|
|
| Jacquelin H.
|
| LE TROLL a écrit :
| > Ahhhhhhhh... Je ne sais pas si j'ai
tout
| > compris, tu voudrais en somme, modifier la
taille
| > du cerce (son arc), en le bougeant du centre
"O"
| > avec le curseur (de souris, sans doute)...
| >
| > Alors, et sauf s'il y a mieux ou si je
n'ai
| > pas compris:
| >
| > Ici le schéma:
| >
| > http://mesromans.free.fr/cap.jpg
| >
| > Donc, avec la méthode mouse (down, move), et
le
| > bon bouton, si on clique sur O (lato sensu),
que
| > tu auras mémorisé, tu appelles une fram, bien
| > dégagé de O (top, left), et tu proposes
d'annuler,
| > ou de cliquer sur le point où l'on veut
déplacer O
| > (en contrôlant la zone admissible (raccord
| > acceptable avec les deux droites)), puis tu
| > fermes.
| > - Après, tu n'auras plus qu'à recalculer
(sinus,
| > cosinus), le nouveau point, via le nouveau
rayon,
| > en fonction des nouvelles coordonnées...
| >
| > Pour faire plus beau, tu peux le faire
| > directement, tant que le bon bouton de la
souris
| > est appuyé, à chaque pixel (pixel c'est mieux,
y a
| > moins de chiffres) de move, à chaque pixel
déplacé
| > dans le bon sens de O, tu recalcules et
| > repositionnes immédiatement l'arc, puis tu
stoppes
| > le calcul quand le bouton est lâché.
| >
| > est-ce ça que tu veux ???
| >
Jacquelin Hardy
Le #15355551
Merci encore,

>Il faudrait que je vois des dessins de bonne taille

est-ce qu'il y a des sites où je peux déposer des images *.jpg que
n'importe qui peut voir. J'ai fait des graphiques pour illustrer mon
affaire.

> Pour l'effacement, tu connais la couleur de
> fond que tu mémorises. Et tu connais la couleur de
> ton arc que tu as créé.

Oui mais on peut avoir 2 couleurs différentes sur le même rayon de
courbure, par exemple une zone où la profondeur est grande et une autre
où elle l'est moins, ce qui produit 2 couleurs. Veux-tu dire que je
devrais "mémoriser" la couleur de chaque pixel du rayon?


> Questions subsidiaires, en matières de marine:
> - Si tu navigues au cap 270°, dis-tu 270° ou 90°
> ouest ???

On dit 270°

> - Quand tu navigues au septentrion (boussole, je
> laisse les déclinaisons pour l'exemple), dis-tu:
> cap au 360 ou cap au 0 ???

On dit cap au nord, ou cap au 000°
En fait on dit toujours 3 chiffres pour donner un ordre de gouverne au
timonier. Par exemple, pour instruire le timonier de gouverner au
Nord-Est, on dira "Le cap au 045°"

Jacquelin H.

ps: Joseph Attila, c'est Le TROLL ?

LE TROLL a écrit :
Bonsoir,


Pour le faire: "Xor", bof, ou toute autre
façon...
Ton arc ancien passe par exemple par les pixel
(mémorisé lors du traçage), LC:
10x17 12x18 13x 19 13x19
Ben, lors du clique choisit, avec mouse_down, on
compare si les coordonnées ci-dessus correspondent
à la position mouse_move, et si oui, on commence
l'opération...





Vois ici, un bon exemple, j'ai tout tracé à la
main pour le centre, et les planètes avec circle,
en me servant du centre et du sinus, et du
cosinus:

http://irolog.free.fr/irolog_vente/astro_v/index.htm

Ainsi, j'ai un peu une idée de ce que tu veux
faire, par rapport aux traçages que j'ai fait sur
ce logiciel...


LE TROLL
Le #15355531
Bonjour Jacqueline,

Pour mettre en ligne librement, il faut créer
un espace (ton fournisseur d'accès ou un autre),
puis les présenter dans une page au moins html ou
équivalente.
Par contre, pour une image, il faut juste
l'espace, et indiquer l'adresse à tes
correspondants...
Ensuite, on dépose généralement par ftp les
sources, depuis Windows...

En fait, ce que je voulais savoir, c'est
l'épaisseur en pixel du trait (environ), la
longueur écran, le nombre maximum à la fois...

Je me demande aussi, si on tire trop l'arc, il
ne vas plus coller au ligne, dans ce cas, est-ce
que ça impliquerait que les lignes (la fin de
l'une et le début de l'autre), bougent, donc
changent le cap en fait, afin de recoller à l'arc,
vers l'intérieur ou l'extérieur ?
Vois ici le dessin:
http://mesromans.free.fr/cap2.jpg

Pour les couleurs, oui, il n'y a pas d'autre
manière que de mémoriser ce qu'il y avait en
dessous, pour ensuite le restituer, effacer, c'est
assez logique. Oui, il faut mémoriser chaque
couleur de chaque pixel (colonne, ligne, couleur),
d'autant que ça tourne tout le temps.
Par contre, qu'il y ait des fonctions api, des
objets spéciaux, dans des langage particuliers ou
en VB, sans doute, peut être, mais je ne connais
pas... Toutefois, ça existe, par exemple les
logiciel d'architecture, tu peux redimensionner un
objet en le tirant, de là, à savoir si ce sont
des fonction prédéfinies du langage, ou des
fonctions écrites en code, je ne sais...

La mémorisation n'est pas importante, un arc
de 30° d'un cercle, d'un rayon de 150 pixels (1/4
d'écran env), par exemple, ça fait en pas de 0,25,
((0,25 x 4) x 30) = 120 données X 3 (l, col,
couleur) = 360 données dans une variable (x, y,
120), ou en fichier... Par contre, pour les hauts
et bas fonds, si tu n'utilises pas des couleurs de
base, à une valeur, il faudra un peu plus que
doubler la taille pour mettre les 3 valeurs des
couleurs...

En fait, faute de fonction existante, ou
d'objet approprié, tu es obligé d'écrire ton objet
toi même, sauf si quelqu'un voit une autre
solution...

Oui, "Joseph Attila", c'est "Le Troll" :o)

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
Jean-marc
Le #15355461
Jacquelin Hardy wrote:
Merci encore,

Il faudrait que je vois des dessins de bonne taille



est-ce qu'il y a des sites où je peux déposer des images *.jpg que
n'importe qui peut voir. J'ai fait des graphiques pour illustrer mon
affaire.



Hello Jacquelin,

tu peux utiliser ci-joint.com : http://cjoint.com/

Gratuit, hyper simple.

Cordialement;


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Jacquelin Hardy
Le #15355421
Merci bien Jean-Marc,

Le TROLL' je suis Jacquelin, pas Jacqueline. Un monsieur, pas une madame !

http://cjoint.com/?bmgXecRdOf

J'ai placé un dessin *.jpg sur l'adresse ci-dessus qui montre ce que je veux
faire.
Le navigateur arrive de la gauche sur la ligne bleue. Il gouverne vers l'est
au cap 090, ie de gauche vers la droite. Son intention est de changer de cap
à un instant donné pour se retrouver sur la ligne bleue orientée vers le
nord-est au 045 environ.

La bissectrice entre les 2 routes est le segment de droite sur lequel on a
les points R6, R5, etc..

Si le navigateur juge que son navire prend beaucoup d'espace et de temps à
tourner, il commencera à tourner au point 1, et suivra l'arc de cercle du
plus grand rayon.
Si il a un petit navire qui tourne vite, il pourra attendre de tourner au
point 6 et suivra l'arc du cercle dont le centre est R6.

Tous les navires qui feront la courbe auront parcouru le même nombre de
degrés d'angle mais en suivant des cercles de différents rayons.

Ce que je voudrais, c'est pour l'utilisateur: il déplacerait son curseur du
point de rencontre des 2 routes, et en s'éloignant un arc de cercle se
dessinerait, plus ou moins grand selon qu'il s'éloigne peu ou beaucoup du
waypoint. Le problème pour moi, c'est de trouver le moyen de dessiner l'arc
de rayon variable, donc avec le centre qui se déplace sur la bissectrice.

J'espère que c'est plus clair avec le dessin.

Jacquelin H.

"Jean-marc" de news: 4787cb12$0$29252$
Jacquelin Hardy wrote:
Merci encore,

Il faudrait que je vois des dessins de bonne taille



est-ce qu'il y a des sites où je peux déposer des images *.jpg que
n'importe qui peut voir. J'ai fait des graphiques pour illustrer mon
affaire.



Hello Jacquelin,

tu peux utiliser ci-joint.com : http://cjoint.com/

Gratuit, hyper simple.

Cordialement;


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Jean-marc
Le #15355361
Jacquelin Hardy wrote:
Merci bien Jean-Marc,
http://cjoint.com/?bmgXecRdOf

J'ai placé un dessin *.jpg sur l'adresse ci-dessus qui montre ce que
je veux faire.
Le navigateur arrive de la gauche sur la ligne bleue. Il gouverne
vers l'est au cap 090, ie de gauche vers la droite. Son intention est
de changer de cap à un instant donné pour se retrouver sur la ligne
bleue orientée vers le nord-est au 045 environ.



Ce que je voudrais, c'est pour l'utilisateur: il déplacerait son
curseur du point de rencontre des 2 routes, et en s'éloignant un arc
de cercle se dessinerait, plus ou moins grand selon qu'il s'éloigne
peu ou beaucoup du waypoint. Le problème pour moi, c'est de trouver
le moyen de dessiner l'arc de rayon variable, donc avec le centre qui
se déplace sur la bissectrice.



Hello,

il va falloir utiliser plusieurs techniques, mais rien de compliqué.

Pour le déplacement le long de la bisectrice, la c'est très simple. Il
suffit de calculer le projeté orthogonal du point de la souris sur la
bisectrice.
Rien de compliqué, c'est un peu de géométrie de base.
Il se trouve que j'ai déjà fait ça et que j'avais mis le code source
avec explications sur VBFRance, le tout sous forme de fonctions
très simples à réutiliser;
Bref, voici la bête :
http://www.vbfrance.com/codes/PROJECTION-ORTHOGONALE-POINT-SUR-DROITE-DANS-PLAN_36085.aspx

La suite est simple:
1) Avant de commencer le tracé en temps réels des cercles/arcs,
il faut sauver le fond de ton pictureBox, c'est à dire faire que
ce qui est dessiné (le fond) devienne l'image (c'est à dire ne sera
pas effacé par un Picture.clear).

C'est tout simple à faire (une ligne) et tu trouveras un exemple dans ce
petit bout de code (c'est des essais d'un jeu que j'ai fait) :
http://users.skynet.be/candide/vbpic/game.zip

Le code est tout petit, c'est simplement des tests. Mais il est focntionnel
et fait exactement ce dont tu as besoin.

2) Puis tu traces tes arcs ou cercles soit avec Circle, soit à la main
comme dans mon programme d'exemple.

3) à chaque déplacement de la souris, tu recalcules le projeté orthogonal
sur la bissectrice (ça donne le centre), tu traces le cercle ou arc de rayon
R (R est la distance euclidienne entre ton point projeté et le point
d'intersection
des 2 segments de route.
Tu peux faire Picture.cls, car le fond a été sauvegardé en 1.

Je pense qu'avec les 2 liens que je t'ai donné, tu as tout pour faire :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Publicité
Poster une réponse
Anonyme