Pivotement d'image dans un pictureBox

jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 - Modifié par jimy neutron le 8/05/2015 à 18:10
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 - 9 mai 2015 à 17:43
Bonjour,

Malgré mes recherches, je suis bredouille!

Je cherche (car je n'ai pas trouvé deja fait!) à creer un compteur style moto, ou une jauge.

Photoshop est mon ami, pas de soucis pour le coté graphique. Un fond de compteur, et une aiguille.

Mais je ne trouve pas le moyen de faire pivoter une image, vous l'aurez compris, il s'agir de l'aiguille.

Pour ce qui est des calcules de coordonnées des point d'un cercle, c'est ok.


Public CenterX As Integer
Public CenterY As Integer
Public R As Integer
Public Degres As Integer

.....

CenterX = Me.Pic.Width / 2
CenterY = Me.Pic.Height / 2
R = CenterX - 20

Dim Rad As Double = Degres * (PI / 180) '1°=PI/180
x = CenterX + R * Math.Cos(Rad)
y = CenterY + R * Math.Sin(Rad)

La suite???



Il s'agit vraiment de la fonction de pivotement.

Une précision, l'aiguille est dessinée en diagonale, sa base est donc (0;0) et sa pointe (200;200) sur une image 200;200

Auriez vous une idee en VB 2010?

6 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
8 mai 2015 à 18:34
Bonjour,

Voir ceci qui est du VB6, si il y a moyen de le transposer en VB.NET?

http://codes-sources.commentcamarche.net/source/25248-compteur-de-voiture-cadran-avec-aiguilles-tres-simple
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
8 mai 2015 à 20:56
Je te remercie cs_Le Pivert, mais cet exemple trace une ligne, et ce n'est pas ce que je souhaite. :)

Encore merci! ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 8/05/2015 à 22:39
Bonjour, Jimy neutron,
Et c'est quoi, alors que tu veux ?
Tu as écrit :
Mais je ne trouve pas le moyen de faire pivoter une image, vous l'aurez compris, il s'agir de l'aiguille.

et le code vers lequel t'a envoyé cs_Le Pivert (que je salue) fait bel et bien tourner une aiguille (représentée par un segment). Et sur un compteur de voiture, l'aiguille est également un segment. Où est ton problème ?
Attends un peu et je vais t'en faire un, de compteur, sous VB6 ... et on va voir s'il est différent d'un compteur de voiture !
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mai 2015 à 22:56
Voilà voilà :
Attention : c'est en VB6 (à transposer, donc ... et c'est ultra simple de transposer çà ...)
Sur un Form :
- Une picturebox nommée Picture1. Mets-y donc cette image :

- Une scrollbar horizontale nommée HScroll1. Elle va simuler un accélérateur.
Option Explicit
Private cy As Integer
Private cx As Integer
Private diametre As Integer


Private Sub Form_Activate()
Me.ScaleMode = vbPixels
Picture1.AutoRedraw = True
Picture1.AutoSize = True
Picture1.FillStyle = 1 ' ===>> fillstyle = transparent
Picture1.Move Me.ScaleWidth / 4, Me.ScaleHeight / 4
cx = Picture1.ScaleWidth / 2
cy = Picture1.ScaleHeight / 2
diametre = cx
HScroll1.Min = 150
HScroll1.Max = -150
HScroll1.Value = HScroll1.Min
End Sub

Private Sub HScroll1_Change()
HScroll1_Scroll
End Sub

Private Sub HScroll1_Scroll()
Dim ancx As Integer, ancy As Integer
Picture1.Cls
Picture1.DrawWidth = 1
Dim pi As Double, toto As Double
pi = 4 * Atn(1)
toto = (-HScroll1.Value / 180) * pi
ancy = cy + Sin(toto - (0.5 * pi)) * diametre * 0.8
ancx = cx + Cos(toto - (0.5 * pi)) * diametre * 0.8
Picture1.DrawWidth = 3
Picture1.Line (cx, cy)-(ancx, ancy)
End Sub


La plus grande partie de ce bout de code bâclé n'est là que pour placer les choses au bon endroit (ce que tu pourrais faire sans code à la création)
Joue maintenant avec l'accélérateur (la scrollbar). Alors ?
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
9 mai 2015 à 07:28
Merci Ucfoutu pour tes réponses toujours aussi précises.

En fait, ici on dessine un trait pour représenter l'aiguille.

Picture1.Line (cx, cy)-(ancx, ancy)


Pour ma part, l'aiguille est un *.jpg, je cherche donc la fonction permettant la rotation de ce jpg, non pas avec ceci:

myPictureBox.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)


qui est trop restreint en angle de pivotement, car il me faudrait une précision au 1 degrés.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mai 2015 à 11:02
Toute l'image de l'aiguille, donc ?
Comme tu veux, mais cela va être plus lourd, plus lent et (puisque pixelisé) moins net ===>>
regarde le dernier message ici :
http://www.dreamincode.net/forums/topic/49382-rotating-a-picturebox/
tu y as un code pour une rotation de 3 degrés.
Utilise-le donc pour le nombre de degrés de ton choix.
J'appelle ton attention sur le fait que ce faisant, il va falloir tout redessiner (ton aiguille) de degré en degré !
0

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

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
9 mai 2015 à 14:02
Jimmy neutron en suivant l'exemple donné par ucfoutu que je salue :

mettre dans un form une PictureBox nommée:

picDest

une TextBox nommée:

txtAngle

une TrackBar nommée:

TrackBar1

Value = 1

maximum = 360

minimum = 1

Avec ce code:

Option Strict On
Imports System.Math
Public Class Form1
    Private Sub Rotate()
        ' Copy the output bitmap from the source image.
        Dim bm_in As New Bitmap("C:\chemin fichier.jpg")
        ' Make an array of points defining the
        ' image's corners.
        Dim wid As Single = bm_in.Width
        Dim hgt As Single = bm_in.Height
        Dim corners As Point() = { _
            New Point(0, 0), _
            New Point(CInt(wid), 0), _
            New Point(0, CInt(hgt)), _
            New Point(CInt(wid), CInt(hgt))}

        ' Translate to center the bounding box at the origin.
        Dim cx As Single = wid / 2
        Dim cy As Single = hgt / 2
        Dim i As Long
        For i = 0 To 3
            corners(CInt(i)).X = CInt(corners(CInt(i)).X - cx)
            corners(CInt(i)).Y = CInt(corners(CInt(i)).Y - cy)
        Next i

        ' Rotate.
        Dim theta As Single = CSng(Single.Parse(txtAngle.Text) * PI / 180.0)
        Dim sin_theta As Single = CSng(Sin(theta))
        Dim cos_theta As Single = CSng(Cos(theta))
        Dim X As Single
        Dim Y As Single
        For i = 0 To 3
            X = corners(CInt(i)).X
            Y = corners(CInt(i)).Y
            corners(CInt(i)).X = CInt(X * cos_theta + Y * sin_theta)
            corners(CInt(i)).Y = CInt(-X * sin_theta + Y * cos_theta)
        Next i

        ' Translate so X >= 0 and Y >=0 for all corners.
        Dim xmin As Single = corners(0).X
        Dim ymin As Single = corners(0).Y
        For i = 1 To 3
            If xmin > corners(CInt(i)).X Then xmin = corners(CInt(i)).X
            If ymin > corners(CInt(i)).Y Then ymin = corners(CInt(i)).Y
        Next i
        For i = 0 To 3
            corners(CInt(i)).X = CInt(corners(CInt(i)).X - xmin)
            corners(CInt(i)).Y = CInt(corners(CInt(i)).Y - ymin)
        Next i

        ' Create an output Bitmap and Graphics object.
        Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
        Dim gr_out As Graphics = Graphics.FromImage(bm_out)

        ' Drop the last corner lest we confuse DrawImage, 
        ' which expects an array of three corners.
        ReDim Preserve corners(2)

        ' Draw the result onto the output Bitmap.
        gr_out.DrawImage(bm_in, corners)

        ' Display the result.
        picDest.Image = bm_out
    End Sub
    Private Sub TrackBar1_Scroll(sender As System.Object, e As System.EventArgs) Handles TrackBar1.Scroll
        txtAngle.Text = CStr(TrackBar1.Value)
        Rotate()
    End Sub
End Class

0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
9 mai 2015 à 17:43
Merci cs_le pivert,
Je suis pas dispo du week end mais je vois ca des lundi! ?
0
Rejoignez-nous