Pb de rotation avec un objet image

Signaler
Messages postés
43
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
12 mars 2013
-
Messages postés
63
Date d'inscription
dimanche 5 novembre 2000
Statut
Membre
Dernière intervention
1 décembre 2013
-
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 !

2 réponses

Messages postés
63
Date d'inscription
dimanche 5 novembre 2000
Statut
Membre
Dernière intervention
1 décembre 2013

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
           
Messages postés
63
Date d'inscription
dimanche 5 novembre 2000
Statut
Membre
Dernière intervention
1 décembre 2013

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)
   



End Sub