IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Probléme Tracé Graphique


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut Probléme Tracé Graphique
    Boujour,

    Je suis en train de développer un programme qui génère une liste de point(x,y). Je trouve le point le plus proche de mon origine et je le définit comme ma nouvelle origine.
    Ensuite je cherche le point le plus proche, je les relies ensembles. Depuis le dernier point que j'ai trouvé je cherche le plus proche je les relies ensembles ainsi de suite.

    Mon problème c'est le tracé du graphique lorsque j'ai un grand nombre de point celui-ci apparait furtivement.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Dim newBitmap As Bitmap = New Bitmap(895, 599)
    Dim g As Graphics = Graphics.FromImage(newBitmap)
    Dim Matrice(2000, 3), i, j, CoordX, CoordY, x_origine, y_origine, distance_min As Integer
    Dim pt_prec, calc_d, xa, ya, pt_o, ml_pt, ml_pt2, d_min As Integer
    Dim Résultat As String
    Dim nb_point As String
     
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Résultat = ""
            nb_point = InputBox("Saisir un nombre de nb_point.", "Nombre de nb_point", 5)
            '#######On génére les points#######
            For i = 1 To nb_point
                Matrice(i, 0) = Str(i)
                Matrice(i, 1) = Int(500 * Rnd() + 1)
                Matrice(i, 2) = Int(500 * Rnd() + 1)
            Next
            '#######On trace les points#######
            For i = 1 To nb_point
                CoordX = Matrice(i, 1)
                CoordY = Matrice(i, 2)
                g.DrawLine(Pens.White, CoordX, CoordY - 2, CoordX, CoordY + 2)
                g.DrawLine(Pens.White, CoordX - 2, CoordY, CoordX + 2, CoordY)
            Next
     
            ''#######Affichage des résultats#######
            'For i = 1 To nb_point
            '    For j = 0 To 3
            '        Résultat = Résultat & Matrice(i, j) & "  "
            '    Next j
            '    Résultat = Résultat & Chr(10)
            'Next i
            'MsgBox(Résultat)
     
            '#######On cherche le point d'origine#######
            x_origine = 0
            y_origine = 0
            distance_min = 9999
            For i = 1 To nb_point
                calc_d = Math.Sqrt((xa - Matrice(i, 1)) ^ 2 + (ya - Matrice(i, 2)) ^ 2)
                If calc_d < distance_min Then
                    xa = Matrice(i, 1)
                    ya = Matrice(i, 2)
                    pt_o = Matrice(i, 0)
                    distance_min = calc_d
                End If
            Next
            Matrice(pt_o, 3) = 1
     
            '#######On trace le chemin#######
            pt_prec = Matrice(pt_o, 0)
            For i = 1 To nb_point
                d_min = 10000
                ml_pt = 0
                For j = 1 To nb_point
                    If Matrice(j, 3) = 0 Then
                        ml_pt2 = Math.Sqrt((Matrice(pt_prec, 1) - Matrice(j, 1)) ^ 2 + (Matrice(pt_prec, 2) - Matrice(j, 2)) ^ 2)
                        If ml_pt2 <= d_min Then
                            d_min = ml_pt2
                            ml_pt = Matrice(j, 0)
                        End If
                    End If
                Next
                Matrice(ml_pt, 3) = 1
                g.DrawLine(Pens.Green, Matrice(pt_prec, 1), Matrice(pt_prec, 2), Matrice(ml_pt, 1), Matrice(ml_pt, 2))
                pt_prec = Matrice(ml_pt, 0)
            Next
        End Sub
    Si quelqu'un peut m'aider.

    Merci.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Au lieu d'utiliser un crayon de 1 pixel de large (ce que tu fais avec Pens.White) crée toi un crayon plus large, genre 2 ou 3 pixels, ça devrais aller...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    J'ai déclaré un nouveau crayon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim whitePen As New Pen(Color.White, 3)
    Mais des que je veut tracer 150 et plus ça disparait.

    Dans mon form1_load j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g = Me.PictureBox1.CreateGraphics
    Me.PictureBox1.BackColor = Color.Black

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par j-lo28 Voir le message
    form1_load
    Au lieu de mettre dans form1_load, met le code du dessin dans l'évènement Paint du form ou de la pictureBox ... enfin ...

    Il y a un truc qui me chagrine quand même : comment tu fais exactement ton dessin ? normalement tu devrais créer un bitmap, peindre dedans, et assigner ce bitmap comme Image de la pictureBox ... là je vois pas trop ce que tu fais.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Voila le code.
    Je créer un bitmap au début enfin il me semble je suis pas expert.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Imports System.Drawing
    Public Class Form1
        Dim newBitmap As Bitmap = New Bitmap(1000, 800)
        Dim g As Graphics = Graphics.FromImage(newBitmap)
        Dim whitePen As New Pen(Color.White, 5)
        Dim redPen As New Pen(Color.Red, 1)
        Dim pen_pt_or As New Pen(Color.Green, 10)
        Dim Matrice(2000, 3), i, j, CoordX, CoordY, x_origine, y_origine, distance_min As Integer
        Dim pt_prec, calc_d, xa, ya, pt_o, ml_pt, ml_pt2, d_min As Integer
        Dim Résultat As String
        Dim nb_point As String
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            g = Me.PictureBox1.CreateGraphics
            Me.PictureBox1.BackColor = Color.Black
        End Sub
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Résultat = ""
            nb_point = NumericUpDown1.Value 'InputBox("Saisir un nombre de nb_point.", "Nombre de nb_point", 5)
            '#######On génére les points#######
            For i = 1 To nb_point
                Matrice(i, 0) = Str(i)
                Matrice(i, 1) = Int(820 * Rnd() + 1)
                Matrice(i, 2) = Int(695 * Rnd() + 1)
            Next
            '#######On trace les points#######
            For i = 1 To nb_point
                CoordX = Matrice(i, 1)
                CoordY = Matrice(i, 2)
                g.DrawLine(whitePen, CoordX, CoordY - 2, CoordX, CoordY + 2)
                g.DrawLine(whitePen, CoordX - 2, CoordY, CoordX + 2, CoordY)
            Next
     
            ''#######Affichage des résultats#######
            'For i = 1 To nb_point
            '    For j = 0 To 3
            '        Résultat = Résultat & Matrice(i, j) & "  "
            '    Next j
            '    Résultat = Résultat & Chr(10)
            'Next i
            'MsgBox(Résultat)
     
            '#######On cherche le point d'origine#######
            x_origine = 0
            y_origine = 0
            distance_min = 9999
            For i = 1 To nb_point
                calc_d = Math.Sqrt((xa - Matrice(i, 1)) ^ 2 + (ya - Matrice(i, 2)) ^ 2)
                If calc_d < distance_min Then
                    xa = Matrice(i, 1)
                    ya = Matrice(i, 2)
                    pt_o = Matrice(i, 0)
                    distance_min = calc_d
                End If
            Next
            Matrice(pt_o, 3) = 1
            g.DrawLine(pen_pt_or, Matrice(pt_o, 1), Matrice(pt_o, 2) - 2, Matrice(pt_o, 1), Matrice(pt_o, 2) + 2)
            g.DrawLine(pen_pt_or, Matrice(pt_o, 1) - 2, Matrice(pt_o, 2), Matrice(pt_o, 1) + 2, Matrice(pt_o, 2))
     
            '#######On trace le chemin#######
            pt_prec = Matrice(pt_o, 0)
            For i = 2 To nb_point
                d_min = 10000
                ml_pt = 0
                For j = 1 To nb_point
                    If Matrice(j, 3) = 0 Then
                        ml_pt2 = Math.Sqrt((Matrice(pt_prec, 1) - Matrice(j, 1)) ^ 2 + (Matrice(pt_prec, 2) - Matrice(j, 2)) ^ 2)
                        If ml_pt2 <= d_min Then
                            d_min = ml_pt2
                            ml_pt = Matrice(j, 0)
                        End If
                    End If
                Next
                Matrice(ml_pt, 3) = 1
                g.DrawLine(redPen, Matrice(pt_prec, 1), Matrice(pt_prec, 2), Matrice(ml_pt, 1), Matrice(ml_pt, 2))
                pt_prec = Matrice(ml_pt, 0)
            Next
        End Sub
    End Class
    En tout cas ta solution fonctionne.
    Serait-il possible d'avoir l'explication entre la solution Load et Paint.

    Merci

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par j-lo28 Voir le message
    Voila le code.
    Je créer un bitmap au début enfin il me semble je suis pas expert.
    bah là tu fais un truc bizarre.
    En gros ce que tu devrais avoir c'est dans Button3_Click :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Dim newBitmap As Bitmap = New Bitmap(1000, 800)
        Dim g As Graphics = Graphics.FromImage(newBitmap)
     
        Faire le dessin dans g
     
        g.Flush()
     
       Me.PictureBox1.Image = newBitmap
    cf. Tu crées le bitmap, tu crées le graphics qui correspond au bitmap, tu dessines dans le bitmap, et tu affiches le bitmap résultant dans la pictureBox.

    Citation Envoyé par j-lo28 Voir le message
    Serait-il possible d'avoir l'explication entre la solution Load et Paint.
    L'explication c'est le le dessin dans un contrôle en WinForms (et sur Windows plus simplement) via un objet Graphics pour un contrôle quelconque n'est pas permanent. L'affichage demeure inchangé jusqu'à ce que Windows demande à la fenêtre de se repeindre. Et c'est à ça que sert l'évènement Paint car pour qu'un dessin soit vraiment "permanent" sur un contrôle il faut effectuer le dessin à chaque fois que cela est nécessaire, et quand c'est nécessaire Paint est appelé.
    La solution du bitmap que j'ai proposé au dessus devrais éviter de recréer l'image à chaque fois que la fenêtre doit être peinte car le contrôle PictureBox se charge de faire le rendu du bitmap dès que nécessaire, sans avoir besoin de le reconstruire.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/08/2006, 13h44
  2. Problème Kit graphique
    Par Requiem32 dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 31/07/2006, 12h15
  3. [VBA-E]Problème Variable/Graphique
    Par 47-47 dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 21/02/2006, 10h34
  4. problème carte graphique NVIDIA
    Par reboots dans le forum Windows XP
    Réponses: 12
    Dernier message: 12/10/2005, 16h28
  5. problème avec graphique dans état access
    Par petitmic dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo