Translation et rotation d'un point de l'écran en quelques lignes

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 053 fois - Téléchargée 29 fois

Contenu du snippet

Simple sous-programme de quelques lignes pour translater et effectuer la rotation d'un point quelconque de l'écran .Pour les débutants qui haissent les maths!

Source / Exemple :


'Ce programme permet d'effectuer la translation ou la rotation d'un point par rapport à une position quelconque du plan (écran)
'Si l 'on veut faire seulement une translation du point (X,Y) à partir de 'l'origine (0,0),mettre la variable de rotation A (Angle) à 0 et mettre 'les variables H(Horizontal) et V(Vertical) aux valeurs voulues de 'translation par rapport à l'origine.
' Si l'on veut faire une rotation autour d'un point translaté, procéder 'comme ci dessus mais donnez à A la valeur d'angle de rotation voulu.
'Pour choisir le sens de rotation positionner la variable S comme suit:
'S=1 rotation dans le sens horaire
'S= 0 rotation dans la sens anti horaire
'Remarques: (A) doit être en radians
'           L'origine (0,0) est le coin supérieur haut de l'écran

'Le sous programme est appelé par:
'Call Trigo(X, Y, H, V, A, S)
'Le résultat est transmis par les variables X et Y

Public X, Y, H, V, A, S As Double

Sub Trigo(X, Y, H, V, A, S)
XT = X - H
YT = Y - V
If A <> 0 Then
    If S = 0 Then
        XR = XT * Cos(A) + YT * Sin(A)
        YR = -XT * Sin(A) + YT * Cos(A)
    Else
        XR = XT * Cos(A) - YT * Sin(A)
        YR = XT * Sin(A) + YT * Cos(A)
   End If
   X = XR + H
   Y = YR + V
End If
End Sub

A voir également

Ajouter un commentaire

Commentaires

legaultp
Messages postés
7
Date d'inscription
mercredi 25 février 2009
Statut
Membre
Dernière intervention
8 avril 2009

Pour ce qui est de l'optimisation, il est vrai que c'est plus court à écrire toutefois, au niveau de la rapidité, je crois que le if est une solution plus rapide!
katsankat
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut les amis :)

Je parle au conditionnel, mais le tuto n'est pas gravé dans le marbre.

L'idéal aurait été une fonction qui retourne le couple de coordonnées modifié.

Le tout avec des variables déclarées en long puisque tu dessines sur l' écran. Aussi je les aurais nommées x1 y1 x2 y2 c'est plus parlant.

Public X, Y, H, V, A, S As Double
... Déclare 5 Variant et un double. Pendant l' exécution, regarder la fenêtre affichage de variables locales pour vérifier (placer un point d' arrêt et faire un tour dans le menu Affichage).

Sub Trigo(X, Y, H, V, A, S)
Idem: la procédure prend 6 variant en arguments.

Comme c'est du niveau 1 il faudrait faire 3 fonctions; une translation, une rotation, et un mix. Le nom "Trigo" n'évoque rien de particulier.

Aussi une image utilisant un petit picture1.circle ou me.circle aurait aidé "les débutants qui haissent les maths". Ou avec la méthode line(), ya des choses très intéressantes à faire.
ScSami
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
18
"L'origine (0,0) est le coin supérieur haut de l'écran" !!!
Généralement (car dépendant du contrôle ActiveX utilisé!!!) haut gauche de la zone de dessin.

Coté maths, ok, pourquoi pas... Encore qu'il manque cruellement d'explications !!!

Coté code, je ne vois pas l'intérêt !!! Par exemple, tu ne spécifies pas ByVal et ByRef dans ta fonction alors que, justement, si les valeurs sont renvoyées par les variables X et Y il est important de préciser ByRef ne serait-ce pour le codeur qui va utiliser ton code (et qui n'a pas forcément le temps de piger comment tu transmets les valeurs). Mais perso, j'aurais codé un type perso style Coordonnees contenant X et Y !

Bref, perso j'aurais préféré que tu nous fasses un tuto sur la trigo plutôt que de nous pondre des "formules" sans explications ni code réellement (pardonne moi l'expression) "constructif".

Bon, le prends pas mal hein, c'est pas méchant, c'est juste mon avis (un peu "dur" j'en conviens)... Mais c'est quand même une bonne première contribution : continu comme ça :D

Sinon, coté maths, y'a quand même un truc que je pige pas!
Tu m'excuses si je suis à coté de la plaque mais pourquoi ne pas se contenter de faire une truc du genre :
X = PtCentreX + R * Cos(Angle)
Y = PtCentreY + R * Sin(Angle)

Bon, allé, encore une dernière critique (critiques qui ne sont jamais ni positives ni négatives mais toujours constructives!), pourquoi ne pas avoir inclus la possibilité d'utiliser soit les degrés, soit les radians (voire les Grades ;) ?

Enjoy ^^
econs
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19
Optimisation : Dans l'expression ci-dessous, le test S=0 peut être enlevé.
En effet, la gestion du changement + - peut se faire en utilisant les puissances de -1
(-1)^0 = 1
(-1)^1 = -1

# If S = 0 Then
# XR = XT * Cos(A) + YT * Sin(A)
# YR = -XT * Sin(A) + YT * Cos(A)
# Else
# XR = XT * Cos(A) - YT * Sin(A)
# YR = XT * Sin(A) + YT * Cos(A)
# End If

se remplace, en deux lignes, par :

XR = XT * Cos(A) + ((-1)^S)*YT * Sin(A)
YR = -((-1)^S)*XT * Sin(A) + YT * Cos(A)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.