cs_domi123
Messages postés43Date d'inscriptionjeudi 7 août 2003StatutMembreDernière intervention12 mars 2013
-
29 mars 2008 à 00:39
Neron2005
Messages postés63Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 1 décembre 2013
-
30 mars 2008 à 13:30
Bonjour, je suis en train de réaliser un potentiomètre avec un objet image. Mon image représente un cercle sur un fond transparent (d'où l'intéret de l'objet image).
Je voudrais réaliser une variable qui lorsque je clique sur l'image (dans le cercle), la variable m'affiche une valeur avec comme coordonnées x et y.
Voici un extrait de mon code qui fonctionne mais la variable me donne une valeur erronée :
Dim nuRo As Long
Dim Ycapture As Long, Xcapture As Long
Dim variation As Long, bouton0 As Long
Dim btn_down As Boolean
Dim TwipX As Integer
Dim TwipY As Integer
Private Sub Form_Load()
Me.ScaleMode = 3
btn_down = False
Ycapture = -1
TwipX = Screen.TwipsPerPixelX
TwipY = Screen.TwipsPerPixelY
End Sub
Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Ycapture = Y / TwipY
Xcapture = X / TwipX
bouton0 = variation
btn_down = True
End Sub
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If btn_down Then
If Xcapture = -1 Then Exit Sub
If ((X / TwipX) > 0 And X / TwipX < 246) Then
nuRo = bouton0 - ((180 * (Atn((X / TwipX) / (Y / TwipY))) / 3.14159265358979) - (180 * Atn(Xcapture / Ycapture) / 3.14159265358979))
nuRo = (nuRo + 360) Mod 360
variation = nuRo
End If
End If
End Sub
Private Sub Image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Ycapture = -1
Xcapture = -1
btn_down = False
End Sub
Private Sub Timer1_Timer()
Label1.Caption = variation
End Sub
Pour info ma form est en pixel et j'affiche ma variable dans un label.
J'ai beau chercher sur tous les forum mais je n'ai pas réussi a trouver mon bonheur.
Merci de votre aide. Help !
Neron2005
Messages postés63Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 1 décembre 20131 30 mars 2008 à 13:07
Si j'ai bien compris ton probleme tu veux calculer un angle.
Alors,
pour calculer un angle il faut un repere donc
- un point qui servira d'origine du repere O
- un vecteur qui servira d'origine des angles (le plus souvent on prend le vecteur ox(1,0))
- et un vecteur oy de sorte que l'on ait un repere orthonorme,
ce qui veut dire que l'axe oy doit etre perpendiculaire a ox donc on aura
soit oy(0,-1) (les angles sont orientés dans le sens horaire),
soit oy(0,1) (les angles son oriantes dans le sens trigo (anti horaire)
A partir de la ce n'est plus que des calcules.
On notera Ox(ax,ay) et Oy(bx,by) et O(ox, oy)
On considere un point quelconque M(x,y)
et on cherche alpha, l'angle forme entre (Ox, OM),
(c'est bon ca suis ???)
Soit d la norme de OM, ainsi d = sqr((x-ox) ^ 2 + (y - oy) ^ 2)
- la norme de la projection de OM sur Ox note c vaut c (x-ox) * ax + (y-oy) * ay ' valide uniquement si norme de ox 1
ainsi, cos(alpha) = c / d ' proprietes du produit scalaire
de plus, la norme de la projection de OM su Oy note s nous donne
s = (x-ox) * bx + (y-ox) * by
or l'angle forme entre OM et Oy vaut (Pi/2 - alpha) d'ou cos(Pi/2 - alpha) sin(alpha) s / d
a present on a le cos et le sin d'un angle, il est donc parfaitement definis a 2Pi pres.
On a donc tan(alpha) sin(alpha) / cos(alpha) s / c
de cette facon,
si cos(alpha) > 0 alors alpha = atn(s / c)
si cos(alpha) < 0 alors alpha = -atn(s / c)
si cos(alpha) = 0 alors si sin(alpha) > 0 alors alpha atn(1) * 2 pi / 2 si sin(alpha) < 0 alors alpha -atn(1) * 2 -pi / 2 si sin(alpha) 0 alors ' probleme car M O
RQ : Pour rendre la norme d'un vecteur egale a 1:
soit u(a,b) de nome quelconque <> 0,
on a v(a / sqr(a*a + b*b) , b / sqr(a*a + b*b)) qui est un vecteur de norme egale a 1
Neron2005
Messages postés63Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 1 décembre 20131 30 mars 2008 à 13:30
Désole j'ai fait une petite erreur c'est :
si cos(alpha) > 0 alors alpha = atn(s / c)
si cos(alpha) < 0 alors alpha = atn(s / c) + Pi
voila ce que ca donne dans une procedure
Option Explicit
Public Ox As Single, Oy As Single, PI As Single
Private Sub Form_Load()
Ox = 1000
Oy = 1000
PI = Atn(1) * 4
Me.DrawWidth = 3
End Sub
Public Function GetAngle( _
X As Single, Y As Single, _
Ox As Single, Oy As Single, _
ax As Single, ay As Single, bx As Single, by As Single) As Single
Dim c As Single, s As Single, alpha As Single
c = (X - Ox) * ax + (Y - Oy) * ay
s = (X - Ox) * bx + (Y - Oy) * by
If c > 0 Then
alpha = Atn(s / c)
ElseIf c < 0 Then alpha = Atn(s / c) + PI
Else
If s > 0 Then
alpha = PI / 2
ElseIf s < 0 Then alpha = -PI / 2
Else: alpha = 0
End If
End If
GetAngle = alpha
End Function
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Cls
Dim a As Single
a = GetAngle(X, Y, Ox, Oy, 1, 0, 0, -1)
PSet (Ox, Oy), vbYellow
Print Round(a / PI * 180, 2) 'convertion des radians en degres
Line (Ox, Oy)-(X, Y)