Se deplacer sur un cercle

Résolu
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006 - 17 mars 2005 à 09:42
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 18 mars 2005 à 16:24
Bonjour,
Voici mon probleme:
J'ai un cercle, sur lequel je veux me déplacer. Sur ce cercle je me symbolise par un petit rond.
J'ai un bouton "+" et un bouton "-". Si je click sur l'un des deux boutons je me deplace dans un sens ou dans un autre, toujours sur ce cercle.
Qui pourrais me dire comment faire.???
Merci.

18 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
18 mars 2005 à 13:03
1/
TU ne déclares "aucune variable dans Option Explicit" ! Tumets simplement le Option Explicit en tête de module et tu peux éventuellement déclaré des variables aussi au niveau module. Simplement, le Option Explicit fait que toute les variables utilisé dans le module (dans n'importe quelle sub/function) doit être déclaré à un endroit ou un autre (dans la sub ou au niveau module). Option eXplicit ne change rien au pb de visibilité des variables. Continue à déclarer tes variables normalement. Le Option explicit t'aidera simplement en forcant VB à refuser un nom de variable s'il n'a pas été déclaré.
2/
Modulo te retourne le reste d'une division entière : 13 mod 3 te retourne 1 car 13 divisé par 3 donne 4 et il reste 1pour le passsage de la notation décimal à la notation D min sec, voila une idée . Partie entière degré. partie entière de restant * 60 minute et le reste * 60 = seconde

Dim Angle as double, Deg as long, Min as long, Sec As Long,R as double
Angle = 0.5054
Deg = int(angle)
R = (angle - deg) * 60
Min = int(R)
Sec = (r- int) * 60

J'ai pas testé mais a vu de nez ca doit passer.

Christophe R
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
17 mars 2005 à 10:03
Propositon de méthode en VB6 sur une picturebox :
1- Crée un nouveau projet VB
2- Ajoute cela dans le code de Form1

Option Explicit


Private Const Pi = 3.14159
Private xc As Long, yc As Long, r As Long
Private Angle As Double
Private Offset As Double
Private RadiusRatio As Double


Private Sub Form_Activate()
DrawPos
End Sub


Private Sub Form_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Asc("+")
Angle = Angle + Offset
DrawPos
Case Asc("-")
Angle = Angle - Offset
DrawPos
End Select
End Sub


Private Sub Form_Load()
Offset = 0.1
RadiusRatio = 0.05
With Me
xc = .ScaleWidth / 2
yc = .ScaleHeight / 2
r = IIf(.ScaleHeight > .ScaleWidth, .ScaleWidth, .ScaleHeight) * 0.4
.AutoRedraw = True
Me.Circle (xc, yc), r, RGB(0, 0, 0)
.AutoRedraw = False
.FillColor = RGB(255, 0, 0)
.FillStyle = vbFSSolid
End With
Angle = 0
End Sub


Private Sub DrawPos()
Dim xp As Long, yp As Long


xp = xc + r * Cos(Angle)
yp = yc + r * Sin(Angle)
Me.Cls
Me.Circle (xp, yp), r * RadiusRatio, RGB(255, 0, 0) Me.Caption "Angle " & CStr(Angle / Pi * 180)
End Sub


Faudrait peut-être donner une valeur plus précise à PI pour une meilleur précision dans l'affichage de l'angle dans le caption de la form.

Christophe R
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
17 mars 2005 à 10:10
Il faudra aussi gérer le fait que quand l'angle dépasse 180°, il devrait repasser à -180° tout seul. Cela se fera par exemple dans DrawPos


If Angle >PI Then


Angle = Angle - 2*PI
ElseIf Angle < -PI Then
Angle = Angle + 2*PI
EndIf

Christophe R
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
17 mars 2005 à 10:36
Super !!!
Merci!!!
Je teste et je reviens vers toi.
Cordialement
Frédéric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
17 mars 2005 à 10:42
Peux tu me dire à quoi sert le Option explicit!!!
Merci.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
17 mars 2005 à 11:02
Option Explicit t'oblige à déclarer toutes tes variables !! Absoluement très utile si tu veux eviter des pb car sans cela, tu peux utiliser une variable sans la déclarer : Elle est alors implicitement déclarer en Variant par VB : Les Variant sont lourde à gérer et cela est source de bug : La moindre faute de frappe dans un nom de variable et te voila avec une nouvelel variable ... bonjour les soucis !!
Option Explicit , tu peux l'ajouter en au de tous tes modules ! Si tu veux que VB le fassse automatiquement pour toi, va des les options de VB, onglet Editeur, cocher "Déclaration des var obligatoire". A noter que cela ne fonctionne que pour les nouveaux modules. Pour les modules créer avant l'activation de cette option, il faut le faire à la main.

Christophe R
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
17 mars 2005 à 11:37
OK, parfait j'ai d'autres questions, puis je te les poser par tel, ou preferes tu le forum.?
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
17 mars 2005 à 11:49
Le forum serait plus facile. Si Christophe est absent ou ne sait pas répondre à ta question, d'autres pourront t'aider.

Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
17 mars 2005 à 11:52
OK Manu, alors voici ma question,
j'ai fais des fonctions dans des modules qui sont appelés depuis le main form et qui font des calculs différents.
Comment ecrire proprement des codes de façons à ce que je puisse renvoyer des valeurs depuis les Private Sub toto() du form vers les function sub tata() dans les modules et inversement.??
Merci.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
17 mars 2005 à 12:48
Déjà pour retourner des valeurs, mieux vaudrait utiliser des Function, plutot que des Sub() !
Function Toto(Arg1 As Machin1 Arg2 As Machin2) As Bidule
' Calcul de la valeur à retourner en fonction de Arg1 Et Arg2
Toto = Valeur à retourner
end function

Ensuite, pour qu'une Sub ou une function soit visible depuis l'extérieur du module dans lequel tu l'a déclarée, il faut la rendre publique : Donc "Public Function Toto() ..." au lieu de "Private Function Toto() ..."
Pour finir, si cette function est déclaré dans un module de form, il faudra indiqué un nom complètement qualifié pour l'appeler. A savoir, ...
Si dans le module de Form1, tu déclare "Public Sub UneSub()", pour l'appeler depuis un autre module, tu devras faire "Form1.UneSub", en précisant donc le nom de la form en préfixe pointé du nom de la sub.
Ok ?

Christophe R
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
17 mars 2005 à 12:51
PS : Au pire si tu le veux , tu peux m'envoyer un msg perso sur ce forum, mais il et de toute façon hors de question que je te refile mon tel : Ne te vexe pas, hein ! Ce n'est qu'une question de principe ...

Christophe R
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
17 mars 2005 à 13:55
Parfait...voila qui eclaire ma lanterne.
Merci.
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
18 mars 2005 à 12:18
Bonjour Christophe,
Je reviens vers toi pour deux petit pb.
1/
Concernant Option Explicit, si je déclare toute mes variables dedans cela veut il dire que quelque soit le private sub toto(), le public titi() ou encore le function tata(), mes variables seront toujours et toute renvoyées dans tout les sens entre private sub toto(), public titi() ou encore function tata().? Car actuellement pour m'en sortie il faut que j'aille relire le contenu de text ou label!!!
2/
J'ai fais une routine qui me permet de calculer des coordonées lat et lon. Pour convertir ces données en D°min'sec"" je passe par une astuce de partie entiere et soustraction. Sur le site, je n'arrive pas a trouver comment employer la fonction modulo qui me permettrais de transformer une coordonées de type 0.5054 en 0°30'...". Sais tu faire cela.??
Merci pour ton aide.
Frédéric
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
18 mars 2005 à 13:09
Lire Sec = (R - Min) * 60 sur la dernière ligne ....

Christophe R
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
18 mars 2005 à 13:31
Bon pour Option explicit, j'ai pas tout saisie mais je vais m'y penché.
Pour la conversion, c'est ce que j'ai fait... et je pense qu'il n'y a pas meiux.
Bon maintenant je rencontre un probleme dans une formule... j'aprofondi et je reviens.
Merci.
A+
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
18 mars 2005 à 14:27
Pour le Option Explicit, il ne devrait pas changer tes habitudes de codage, sauf si tu ne déclarais pas toujours tes variables avant. Il ne peut que t'aider à éviter les bugs

Christophe R
0
cs_fred23 Messages postés 152 Date d'inscription lundi 5 août 2002 Statut Membre Dernière intervention 15 juillet 2006
18 mars 2005 à 14:40
Bon voila la suite de mon probleme : Avec les codes ci-dessous je devrais, en toute logique, avoir une variation de Nlat et Nlon qui serait un fonction continu de COS et de SIN. Or le probleme est que même si angle varie lineairement par exemple de 0 a 180°, le résulat est soit un coup plus normalement superieur à la valeur precedent, en fonction de la progession de "angle" soit inferieur quand ele devrait etre superieur ou surperieur quand elle devrait etre inférieur.
J'ai comme l'impression que cela renifle le dépassement de capacité ou de pile, ou un truc de ce gout.
Quand pense tu.??


Function ptcardinaux(DZMT, R, lat, lon)


Const Pi As Double = 3.14159265358979


Dim Nlat, Nlon As Double


dec = R / 1000


Nlat = lat + dec / 111.125 * Cos(0 / 2 / Pi * 360)


Nlon = lon + dec / 111.125 * Sin(0 / 2 / Pi * 360) / Cos(0 / 2 / Pi * 360)


dlat = Int(Nlat)


mlat = (Nlat - dlat) * 60


slat = (mlat - Int(mlat)) * 60


dlon = Int(Nlon)


mlon = (Nlon - dlon) * 60


slon = (mlon - Int(mlon)) * 60


Form1.Label34.Caption = Form1.Text60.text & " " & dlat & "°" & Int(mlat) & "'" & Int(slat) & """ " & Form1.Text70.text & " " & dlon & "°" & Int(mlon) & "'" & Int(slon) & """"
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
18 mars 2005 à 16:24
Pas tout éplucher mais ... 0 / 2 / Pi * 360 ne donne t'il pas toujours zéro !! Zéro divisé par n'importe quoi donne toujours zéro ! Et puis tu n'as aucune variable dans tes Cos et tes Sin ! C'est normal ?
Enfin, je te propose de faire une fonction qui te converti un angle décimal en angle deg Min Sec , ce sera plus propre. Et puis aussi ... ta constante PI, ne la déclare pas dans ta fonction, car tu risques de l'utiliser ailleur dans ton code (j'imagine ?) Donc, déclare la au niveau d'un module, en la précisant "Public" comme cela elle sera visible depuis n'importe quel module de ton projet.
Ce sujet n'ayant plus rien a voir avec le thread d'origine, je te propose de continuer en msg privé sur ce forum ...

Christophe R
0
Rejoignez-nous