Ajuster l'affichage d'une forme géométrique

alex1496 Messages postés 10 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 1 mars 2007 - 15 févr. 2007 à 00:02
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 16 févr. 2007 à 12:28
Je n'arrive pas à "retranscrire" l'ancienne fonction scale de la picturebox de vb6 en vb2005. Je travaille sur le tracage de figure géométrique quelconque.
Le forme est trancrit dans une variable de type pointF. Mon soucis est que je peux avoir des points négatif ou positif. Je souhaite tracer ma forme dans une picturebox , l'ajuster (modifier l'echelle pour un meilleur rendu) et la centrer dans la picturebox.

Comment fait on pour redéfinir les coordonnés sans redéfinir un tableau de type pointF avec les modifications

Le début de mon code :

<hr size="2" width="100%" />
Public Sub Charge_section(ByVal fichier As String, ByRef tableau() As PointF)
        'Chargement d'un fichier texte dans un tableau

        Dim pt_x, pt_y As Double
        Dim nb_entree As Integer = 0
        Dim numfile As Integer

        'Numéro fichier libre
        numfile = FreeFile()
        'Lecture
        FileOpen(numfile, fichier, OpenMode.Input)
        'Charge les données du fichier dans le tableau
        While Not EOF(numfile)
            ReDim Preserve tableau(nb_entree)
            Input(numfile, pt_x)
            Input(numfile, pt_y)
            tableau(nb_entree) = New PointF(pt_x, pt_y)
            nb_entree += 1
        End While
        FileClose(numfile)

    End Sub
<hr size="2" width="100%" />
    Structure extreme
        Dim xmin As Double
        Dim xmax As Double
        Dim ymin As Double
        Dim ymax As Double
    End Structure
<hr size="2" width="100%" />
    Function Extrem_section(ByVal tableau() As PointF, ByRef extrem As extreme)

        For i As Integer = 0 To tableau.GetUpperBound(0)
            If extrem.xmin > tableau(i).X Then extrem.xmin = tableau(i).X
            If extrem.xmax < tableau(i).X Then extrem.xmax = tableau(i).X
            If extrem.ymin > tableau(i).Y Then extrem.ymin = tableau(i).Y
            If extrem.ymax < tableau(i).Y Then extrem.ymax = tableau(i).Y
        Next i

    End Function
<hr size="2" width="100%" />
    Sub Centre_section(ByVal extrem As extreme, ByVal Picturebox As PictureBox)
        'Centre une section

        Dim Lx, Ly As Double
        'Emprise du dessin
        Lx = Math.Abs(extrem.xmax - extrem.xmin)
        Ly = Math.Abs(extrem.ymax - extrem.ymin)

        'bordure
        Dim esp As Double
        esp = Math.Max(Lx, Ly) / 5

        Dim ech As Double
        ech = Picturebox.Width / Picturebox.Height

        Dim Lpic_x, Lpic_y As Double
        Dim Lpic As extreme

        If ech >= Lx / Ly Then
            Lpic_y = Ly + esp
            Lpic_x = Lpic_y * ech
        Else
            Lpic_x = Lx + esp
            Lpic_y = Lpic_x / ech
        End If

        Lpic.xmin = extrem.xmin - 0.5 * (Lpic_x - Lx)
        Lpic.xmax = extrem.xmax + 0.5 * (Lpic_x - Lx)
        Lpic.ymin = extrem.ymin - 0.5 * (Lpic_y - Ly)
        Lpic.ymax = extrem.ymax + 0.5 * (Lpic_y - Ly)
       
        'Picturebox.Scale (Lpic.xmin, Lpic.ymax)-(Lpic.xmax, Lpic.ymin)

    End Sub
<hr size="2" width="100%" />
    Public Sub Trace_section(ByVal tableau() As PointF, ByVal picturebox As PictureBox)
        'Trace une image à partir d'un tableau

        'Valeur extreme
        Dim extrem As extreme
        Call Extrem_section(tableau, extrem)
        info("xmin", extrem.xmin)
        info("xmax", extrem.xmax)
        info("ymin", extrem.ymin)
        info("ymax", extrem.ymax)

        'Redimensionnement

        'Dimension de a picturebox
        Dim largeur As Integer = picturebox.Width
        Dim hauteur As Integer = picturebox.Height

        'Créer une image en fonction de la picturebox
        Dim img As Bitmap = New Bitmap(largeur, hauteur)
        Dim graph As Graphics = Graphics.FromImage(img)

        'Dessin
        graph.DrawPolygon(Pens.Black, tableau)
        graph.Dispose()

        'Affichage sur la picturebox
        picturebox.Image = img

    End Sub
<hr size="2" width="100%" />
Merci de votre aide.

3 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
15 févr. 2007 à 13:05
Bonjour


Déjà quelques remarques sur ce qui a été fait :

   Public Sub Charge_section(ByVal fichier As String, ByRef tableau() As PointF)

peut s'écrire :

   Public Function Charge_section(ByVal fichier as String) as PointF()

Et après tu peux retourner le tableau avec return.


Function Extrem_section(ByVal tableau() As PointF, ByRef extrem As extreme)

        For i As Integer = 0 To tableau.GetUpperBound(0)

            If
extrem.xmin > tableau(i).X Then extrem.xmin = tableau(i).X

            If
extrem.xmax < tableau(i).X Then extrem.xmax = tableau(i).X

            If
extrem.ymin > tableau(i).Y Then extrem.ymin = tableau(i).Y

            If
extrem.ymax < tableau(i).Y Then extrem.ymax = tableau(i).Y

        Next i

End Function

C'est pas unr Function, mais une Sub et même topo :

Function Extrem_section(ByVal tableau() As PointF) As extreme

      Dim lExtrem as new extrem


        For i As Integer = 0 To tableau.GetUpperBound(0)

            If
lextrem.xmin > tableau(i).X Then lextrem.xmin = tableau(i).X

            If
lextrem.xmax < tableau(i).X Then lextrem.xmax = tableau(i).X

            If
lextrem.ymin > tableau(i).Y Then lextrem.ymin = tableau(i).Y

            If
lextrem.ymax < tableau(i).Y Then lextrem.ymax = tableau(i).Y


        Next i

    Return lExtrem


End Function


Et tu peux même retourner un RectangleF qui pourrais être plus pratique dans le reste du code.


Je reprend la function Charge_section

  Public Sub Charge_section(ByVal fichier As String, ByRef tableau() As PointF)

        'Chargement d'un fichier texte dans un tableau


    Dim ltPoints as new list(of PointF)


        Dim pt_x, pt_y As Double

        Dim nb_entree As Integer = 0

        Dim StreamFile As io.TextStream 'Controler l'espace de nom et le nom


        'Lecture

        StreamFile   = 
NewIo.TextStream(  io.File.open(fichier,...)) 'Regarde dans MSDN

        'Charge les données du fichier dans le tableau

        Do While StreamFile.Position<StreamFile.Length

'Récupération de la ligne

               Dim
lStr as String()=Stream.ReadLine().split(","c) 'Je suppose que sur
chaque ligne il y a 2 coordonées et séparées par une ","

          'On récupère les données de la ligne

            ltPoints.add(new pointf(Double.parse(lStr(0)),Double.parse(lStr(1))))

        loop


'Fermeture du flux

         StreamFile=File.Close


'Retour des données

          Return ltPoints.ToArray

    End Function


Pour l'affichage :

Si ton tableau de points s'appelle TabPts et ta structure "extreme" lBounds


for each lPnt as PointF in TabPts

    lPtn.x-=lBounds.xMin

'Idem pour y

Next


Ensuite, tu redimmensionne en fonction de la taille.

Il est plus facile de batiser quelqu'un que de la convertir.(surtout en programmation)
VB (6, A excel, .NET), C++, C#.Net
Mon site
0
alex1496 Messages postés 10 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 1 mars 2007
15 févr. 2007 à 21:59
Bien tout cela est bien mais déja je comprends pas forcement tout mais surtout je rapelle ma question :

"Je n'arrive pas à "retranscrire" l'ancienne fonction scale de la picturebox de vb6 en vb2005. Je travaille sur le tracage de figure géométrique quelconque.
Le forme est trancrit dans une variable de type pointF. Mon soucis est que je peux avoir des points négatif ou positif. Je souhaite tracer ma forme dans une picturebox , l'ajuster (modifier l'echelle pour un meilleur rendu) et la centrer dans la picturebox.

Comment fait on pour redéfinir les coordonnés (origine, hauteur, largeur) sans redéfinir un tableau de type pointF avec les modifications"
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 févr. 2007 à 12:28
Bonjour


A ta dernière question de ton post, je ne connais aucun moyen.

Pour refaire un scale, il faut changer tt tes pts avec le ForEach de mon post précédent.

En VB.NET, Fini les Scale, on cause qu'en pixels (c'est largement
mieux, car les différentes unités étaient vraiment casse noix).


Si tu veux centrer et redim ta forme, change le code dans le dernier ForEach

for each lPnt as PointF in TabPts

    lPtn.x-=lBounds.xMin   'Complete par le code de ton choix

'Idem pour y

Next

Il est plus facile de batiser quelqu'un que de la convertir.(surtout en programmation)
VB (6, A excel, .NET), C++, C#.Net
Mon site
0
Rejoignez-nous