morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006
-
16 nov. 2006 à 09:20
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 2014
-
16 nov. 2006 à 15:39
Bonjour,
J'ai un logiciel a modifié, ce logiciel programmé en VB me permet de déterminer la giration en metre d un bateau (demi tour) j ai besoin d un outil qui permet de determiné le rayon du cercle (approximatif). j'ai déterminé un programme interressant qui me permet de tracer sur mon graphique une LINE à l'interieur de ma picturebox ce qui me manque c'est de déterminer la longueur de la LINE que je trace afinde pouvoir l afficher en temps reel ds un label...
voici mon programme, je l ai transferer ds mon soft il s applique tres bien, maintenant pour finaliser le projet il faut que je determine la longueur du trait que je trace :
Code :
Option Explicit
Private mDragEnCours As Boolean
Private Sub Form_Load()
mDragEnCours = False
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
mDragEnCours = True
With Line1
.X1 = X
.X2 = X
.Y1 = Y
.Y2 = Y
End With
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If mDragEnCours Then
With Line1
.X2 = X
.Y2 = Y
End With
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
mDragEnCours = False
End Sub
ç rentabiliserait mon outil, je suis malheuresement un peu juste en connaissance de code ( j'etudie le etape par etape de Halvorson) mais ...il n y a pas la reponse à l interieur ;)
morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006 16 nov. 2006 à 10:04
re
ça marche bien ds le programme que je vous ai presenté... cad que j ai bien une variation de la longueur ... mais le pb c que lors de l insertion ds mon soft ça ne fonctionne plus ....
ci joint le prog du soft complet sans le module1: c un peu long dsl il affiche tjrs 1275...
Private Mesure_Derive As Boolean, Cap_derive As String
Private Phase As Integer, Mem_Pointeur As Double
Private mDragEnCours As Boolean 'ajout
Dim Heur As String
Dim Minu As String
Dim sec As String
Sub debut()
Call Init_Cercle 'initialise les cercle, ofset x et y et efface tableaux lat et lg
Pointeur = 0
long_drift = 0
lat_drift = 0
Lat(0) = Latitude
Lg(0) = Longitude
'imprimer_gir.Enabled = False 'Désactivation du menu imprimer
Fin.Enabled = False 'Désactivation du menu quitter
couleur = vbBlue
Command4.Caption = "Exit Measurement"
Command4.Visible = True 'Activation du bouton de fin
imprimer_gir.Enabled = True
Call trace_grille(Picture1) 'Traçage de la grille de repérage
End Sub
Private Sub Centre_gir_Click() 'Centrer le graph sur la giration
Call centrer(Picture1, UpDown1)
End Sub
Private Sub Change_nom_Click() 'Changer le nom du bateau
If Start = False Then 'mesure derive debut
Mem_Pointeur = 0
Label18 = ""
Call debut 'Initialisation
Start = True
Phase = 1
klg = Cos(Latitude * Coef)
Call Debut_Derive
End If
If Phase = 2 Then 'debut giration
Command1.Caption = "END Turning"
couleur = vbBlack
Call trace_grille(Picture1) 'Traçage de la grille de repérage
Picture1.Circle Step(0, 0), 2
Cercle(Pointe_Cercle) = 0
Pointe_Cercle = Pointe_Cercle + 1
Erase Lat 'Nettoyage de la variable Lat
Erase Lg 'Nettoyage de la variable Lg
Pointeur = 0
Lat(0) = Latitude 'Affectation de la variable Lat de départ
Lg(0) = Longitude 'Affectation de la variable Lg de départ
Phase = 3
Exit Sub
End If
If Phase = 3 Then 'fin giration
Lat(Pointeur) = Latitude
Lg(Pointeur) = Longitude
Mem_Pointeur = Pointeur
Picture1.Circle Step(0, 0), 2
Cercle(Pointe_Cercle) = Mem_Pointeur
couleur = vbBlue
Command1.Caption = "START Measurement"
Phase = 4
Exit Sub
End If
If Phase = 4 Then 'mesure derive fin
Phase = 5
Call Debut_Derive
End If
Text1.SetFocus
End Sub
Private Sub Command2_Click() 'Validation du changement de nom du bateau
If Text2.Visible = True Then
nom_bateau = Text2.Text
Text2.Visible = False
Frame1.Caption = "Gyration Measurement " & nom_bateau
Call enregistre_param
End If
Text1.SetFocus
Frame2.Visible = False
Command1.Default = True
Call Retrace(Picture1) 'Retraçage du Graph
Private Sub MSComm1_OnComm()
'Gestion des actions en fonction des évenements détectés sur le port série
Select Case MSComm1.CommEvent
' Traite chaque événement ou erreur en insérant du code sous chaque instruction Case
' Erreurs
Case comEventBreak ' Un signal d'arrêt a été reçu.
Case comEventCDTO ' Erreur de délai d'attente Détection de porteuse.
Case comEventCTSTO ' Erreur de délai d'attente Prêt à émettre.
Case comEventDSRTO ' Erreur de délai d'attente Modem prêt.
Case comEventFrame ' Erreur de dépassement du délai imparti
Case comEventOverrun ' Données perdues.
Case comEventRxOver ' Dépassement de la capacité du tampon de réception.
Case comEventRxParity ' Erreur de parité.
Case comEventTxFull ' Tampon de transmission plein.
Case comEventDCB ' Erreur inattendue lors de l'extraction du bloc de contrôle de périphérique]
'Événements
Case comEvCD ' Modification dans la ligne Détection de porteuse.
Case comEvCTS ' Modification dans la ligne Prêt à émettre.
Case comEvDSR ' Modification dans la ligne Modem prêt.
Case comEvRing ' Modification dans l'Indicateur d'appel.
Case comEvReceive ' Nombre de caractères indiqué par la propriété RThreshold reçus.
Timer1.Enabled = False
Timer1.Enabled = True
Synchro = True ' Affichage de l'état du port
Case comEvSend ' Nombre de caractères indiqué par la propriété SThreshold dans le tampon de transmission.
Case comEvEOF ' Caractère de fin de fichier trouvé dans le flux en entrée
End Select
End Sub
Private Sub Sauve_Click()
'Chargement des données sauvegardées
Synchro = False
'Fermeture du port comm
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
'Désactivation des Timer
Timer1.Enabled = False
Timer2.Enabled = False
Nom_Fichier$ = Depart.ouvre_fichier(True, "*.GIR", "GIR")
If Nom_Fichier$ <> "" Then
Call Init_Cercle
Command1.Visible = False
Open Nom_Fichier$ For Input As #2
Input #2, nom_bateau
Frame1.Caption = "Gyration Measurement " & nom_bateau
Label7.Visible = True
Label8.Visible = True
Label10.Visible = True
Label11.Visible = True
Input #2, A: Label1 = A
Line Input #2, A: Label2 = A
Input #2, A: UpDown2.Value = A
Input #2, A: Label6 = A
Input #2, A: Label7 = A
Input #2, A: Label8 = A
Input #2, A: Label9 = A
Input #2, A: Label10 = A
Input #2, A: Label11 = A
Input #2, A: Label15 = A
Input #2, A: Label16 = A
Input #2, A: Text1.Text = A
Line Input #2, A: klg = CDbl(A)
Input #2, ofset_x
Input #2, ofset_y
Input #2, long_drift
Input #2, lat_drift
Input #2, Pointeur
Input #2, Pointe_Cercle
For i% = 0 To Pointeur
Line Input #2, A: Lat(i%) = CDbl(A)
Line Input #2, A: Lg(i%) = CDbl(A)
Next i%
For i% = 0 To Pointe_Cercle - 1
Input #2, Cercle(i%)
Next i%
Close #2
End If
Label23.Visible = True
Command4.Caption = "End Replay"
Command4.Visible = True
Call Retrace(Picture1) 'Retraçage du Graph
End Sub
Private Sub Sauve_gir_Click()
'Sauvegarde des données
Synchro = False
'Fermeture du port comm
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
For i% = 0 To Pointeur
Print #2, Lat(i%)
Print #2, Lg(i%)
Next i%
For i% = 0 To Pointe_Cercle '- 1
Print #2, Cercle(i%)
'Print #2, Cap_derive(i%)
Next i%
Close #2
End If
'Réactivation du port comm et des timers
MSComm1.PortOpen = True
Timer1.Enabled = True
Timer2.Enabled = True
Call Retrace(Picture1)
End Sub
Private Sub Cmd_Direction_V_Click(Index As Integer)
'Sélection de la direction du vent
Cmd_Direction_V(dir_vent).BackColor = &HFF&
Cmd_Direction_V(Index).BackColor = &HFF00&
Label6 = " Wind Direction: " & Cmd_Direction_V(Index).Tag
dir_vent = Index
If Index = 0 Then
UpDown5.Visible = False
Label7.Visible = False
Label8.Visible = False
Else
UpDown5.Visible = True
Label7.Visible = True
Label8.Visible = True
Call UpDown5_Change 'Affectation des changements
End If
End Sub
Private Sub Cmd_Direction_M_Click(Index As Integer)
'Sélection de la direction du courant
Cmd_Direction_M(dir_mer).BackColor = &HFF&
Cmd_Direction_M(Index).BackColor = &HFF00&
Label9 = " Swell Direction: " & Cmd_Direction_M(Index).Tag
dir_mer = Index
If Index = 0 Then
UpDown6.Visible = False
Label10.Visible = False
Label11.Visible = False
Else
UpDown6.Visible = True
Label10.Visible = True
Label11.Visible = True
Call UpDown6_Change 'Affectation des changements
End If
End Sub
Private Sub Timer1_Timer()
'Récupération des données
Dim Moy_Passe As Single, Moy_Speed As Single
If Synchro = True Then
If Start = True And Phase < 6 Then
Pointeur = Pointeur + 1
End If
NMEA = MSComm1.Input 'Récupération des données
Call lecture_donnees 'Lecture des données
If flag_err = True Then 'Affichage état du port
Label22.BackColor = vbGreen
Label22 = "Input port: " & Num_Port
Command1.Enabled = True
Else
Label22.BackColor = vbRed
Label22 = " Serial not syncro "
Command1.Enabled = False
End If
Label3 = " Heading: " & Capgyro & " ° "
Label4 = " Inst. Speed: " & Speed & " Kts " If Phase 0 Or Phase 4 Or Phase = 6 Then 'pas de mesure mais cherche le cap
Call cherche_cap
Else
If Phase < 6 Then
Call charge_valeurs ' mesure en cours
End If
End If
End If
Synchro = False
End Sub
Sub Debut_Derive()
Duree_Start = 0
Mem_Timer_Deb = Timer If Cap_derive "E" Or Cap_derive "O" Then
p_deriv_0 = Pointeur
Else
p_deriv_2 = Pointeur
End If
Texte = " Drift Measurement: To Steer " & Texte & " "
Label17 = Texte
Command1.Visible = False
End Sub
Sub charge_valeurs()
'Chargement des valeurs pour tracer le Graph
Lat(Pointeur) = Latitude
Lg(Pointeur) = Longitude
Call Trace_Graph(Picture1, UpDown1) 'Traçage du Graph
XX = ofset_gr * Pointeur
Picture3.Line (XX, 0)-(XX, Picture3.ScaleHeight), vbRed
If Pointeur = 3000 Then
R = MsgBox("Memory Plain", 16)
'Check4.Value = 0
Phase = 0
Start = False
Command1.Caption = "START Measurement"
Command1.Visible = True
Call Init_Cercle
Pointeur = 0
End If
End Sub
Sub cherche_cap()
Cap_derive = "?"
Select Case Capgyro
Case 61 To 119
Cap_derive = "E"
Texte = "East"
Case 151 To 209
Cap_derive = "S"
Texte = "South"
Case 241 To 299
Cap_derive = "O"
Texte = "West"
Case 0 To 29
Cap_derive = "N"
Texte = "Nort"
Case 331 To 359
Cap_derive = "N"
Texte = "Nort"
End Select
If Cap_derive = "?" Then
Command1.Visible = False
Label17.BackColor = vbRed
Label17 = " To Change Course "
Else
Command1.Visible = True
Label17.BackColor = vbWhite
Label17 = " Course is " & Texte & " "
End If
End Sub
Private Sub Timer2_Timer()
If Phase 1 Or Phase 5 Then
Duree_Start = Int(Timer - Mem_Timer_Deb)
Label17 = Texte & 10 - Duree_Start & " S"
If Duree_Start >= 10 Then
Call Calcul_Derive
Command1.Visible = True
Phase = Phase + 1
If Phase = 6 Then
Start = False
End If
End If
End If
'Actualisation de l'horloge
If Time <> mem_heure Then
mem_heure = Time
Heur = Val(Left(Time, 2))
Minu = Mid$(Time, 4, 2)
sec = Right$(Time, 2)
Label2 = Str$(Heur) + " H " + Minu + " m " + sec + " s " 'Affichage de l'heure
End If
End Sub
Private Sub UpDown1_Change()
'Changement de la valeur de l'échelle du graph
echelle = UpDown1.Value
echel = echelle1(echelle)
Label12 = " Scale: " & 100 / echel & " Km " 'Affichage de l'echelle
Call enregistre_param 'Enregistrement des paramètres
Call Retrace(Picture1) 'Retraçage du Graph à la nouvelle echelle
End Sub
Private Sub UpDown2_Change()
'Choix de l'angle donné à la barre
Label15 = " Rudder " & UpDown2.Value & " "
If UpDown2.Value = 0 Then
Label16 = ""
End If
End Sub
Private Sub UpDown3_Change()
'Côté de l'angle donné à la barre
If UpDown3.Value = 0 Then
Label16 = " RIGHT "
Else
Label16 = " LEFT "
End If
End Sub
Private Sub UpDown5_Change()
'Changement de la force du vent
Label8 = " " & UpDown5.Value
End Sub
Private Sub UpDown6_Change()
'Changement de la force de la houle
Label11 = " " & UpDown6.Value
End Sub
Private Sub vent_mer_Click()
'Affichage de la partie permettant le changement de sens du vent et du courant
If Frame2.Visible = False Then
Frame2.Visible = True
Command2.Visible = True
End If
If Phase = 5 Then
Command1.Caption = "START Measurement"
Command1.Enabled = True
Pointeur = Mem_Pointeur
Call centrer(Picture1, UpDown1)
imprimer_gir.Enabled = True
Fin.Enabled = True
Command4.Visible = False
Else
Command1.Caption = "START Turning"
End If
End Sub
'ajout
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
mDragEnCours = True
With Line9
.X1 = X
.X2 = X
.Y1 = Y
.Y2 = Y
End With
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If mDragEnCours Then
With Line9
.X2 = X
.Y2 = Y
End With
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
mDragEnCours = False
End Sub
morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006 16 nov. 2006 à 10:23
j'aurais besoin d'une petite aide complementaire svp...si possible...
j'ai inserer les infos ds mon soft... j ai modifier le fait d apparaitre ds une msgbox, le resultat apparait ds un label... une chose est cependant importante...
dans mon programme je peux modifier l echelle afin que le graphe s agrandisse ou pas de quelle maniere je peux intervenir pour que mon reslutat tienne compte de cette echelle?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 16 nov. 2006 à 10:55
"dans mon programme je peux modifier l echelle afin que le graphe s agrandisse ou pas de quelle maniere je peux intervenir pour que mon reslutat tienne compte de cette echelle?"
C'est une blague ou quoi ?
Là ce n'est plus à M. Pythagore qu'on fait appel, mais à du beaucoup plus élémentaire, genre règle de 3 (niveau CE2), du genre "cela coute 20 euros lorsque la marge bénéficiaire du commerçant est de 15 %, combien cela coûterait-il s'il décidait de passer sa marge à 18 %"
On sort carrément des notions de développement informatique pour passer à des notions élémentaires d'arithmétiques !!!
morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006 16 nov. 2006 à 12:00
Le pb ne vient pas des maths pour moi ... mais de la programmation! malheureusement je suis néophyte en la matière...
scale .... tt ça ça n'est pas clair pour moi...
en fait avec votre programme ce sont des Twips sauf erreur de ma part, il faudrait que je fasse apparaitre un resultat different lorsque je change l'echelle de ma picturebox...
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 nov. 2006 à 12:29
effectivement, le dessin est en twips. Mais pour pouvoir dessiner ton cercle tu as dû te fixer une échelle.
Admettons (ce n'est qu'un exemple) que tu t'es fixé 100 twips = 1km, ça donne une échelle de 100, lorsque tu calcule la longeur de ta ligne, tu aura le résultat en twips. Il faudrait alors diviser par l'échelle pour avoir le résultat en km. Ainsi 600 twips te donneront 6km (600/100)
maintenant si tu fais un zoom x2 sur ton graphe, tu as désormais une échelle de 200 (ou 1/200 suivant comment on se fixe le rapport) soit 200 twips = 1 km ou si tu préfère 100 twips= 0.5km
Pour ta ligne, elle aussi va subir le zoom (il faudrait donc refaire le calcul) et désormais elle sera longue de 1200 twips. Il faut toujours diviser par l'échelle, mais la nouvelle, donc tu as 1200 twips, soit toujours 6km (1200/200)
Tu remarquera qu'ici, je n'ai pas eu besoin d'aborder des notions de programmation, ce n'est que du calcul et donc des maths
En gors je t'ai expliquer la fameuse Règle de 3
Niveau programation, ça revient à appliquer une multiplication, ou une division sur tes mesures, suivant le sens de convertion, et le mode de calcul de l'échelle.
---- Sevyc64 (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006 16 nov. 2006 à 13:43
Merci pour toute ces infos un élément important tt de meme c'est que lorque j agis sur le bouton qui me permet de modifié l echelle seul mon cercle "tracé" par le bateau change de taillle ... pas la feuille (picturebox) je ne sais pas si je suis clair?
est il possible de modifier l echelle de l ensemble des éléments cad cercle + feuille+ line? ( faire qq chose cohérent)
morrison29
Messages postés18Date d'inscriptionjeudi 16 novembre 2006StatutMembreDernière intervention24 novembre 2006 16 nov. 2006 à 13:45
Une derniere precision... je ne sais pas comment est definit mon cercle...cad a dire si la picturebox englobe le cercle et la feuille avec les carreau ou seulement la feuille avec les carreaux
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 16 nov. 2006 à 15:39
Tu poses ici une question sous une certaine forme et... "aillieurs"... sous une forme différente, à savoir :
"Je poste ce message afin de savoir comment coder la taille d'une LINE, à l interieur d une picture box, en fonction de l echelle du programme...."
Je ne te comprends plus (ou alors trop bien... tu cherches ici et là... un peu ici , un peu là.. à faire faire tout à ta place...)
Le théorème de pythagore t'a été explique plus haut, à savoir :
longueur_ ligne² = coté1² + coté2²
Celà, c'était pour te permettre le calcul de la longueur...
Changer d'échelle, maintenant, revient à modifier les coordonnées des extrêmités d'une ligne, pas à calculer une nouvelle longueur pour connaître les nouveaux points extrêmes d'une ligne !
tu as dont tout simplement à appliquer ton "ratio" à X1,Y1,X2 et Y2
Quant à la nouvelle longueur en résultant, elle sera forcément elle même le résultat du "ratio" appliqué à l'ancienne (conformément aux règles les plus claires de l'homothétie...)
Il me semble à ce niveau qu'avant de continuer sur ce développement, tu devrais tout simplement résoudre ce problème à l'aide d'une feuille de papier, un crayon, une règle et un compas (ce dernier n'étant pas absolument indispensable)... Un pantographe, quoi !
De façon générale, le développement informatique est tout simplement la mise en syntaxe informatique du mécanisme de ta pensée (ici : l'homothétie la plus élémentaire).
Nous t'aiderons bien volontiers à mettre en syntaxe ce que tu aurais des difficultés à exprimer en VB, mais la partie géométrique pure (celle à traduire ensuite en syntaxe) doit rester LA TIENNE... et les connaissances qu'elle impose n'ont rien à voir avec VB.
Bon travail (principalement mathématique)