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

C# Discussion :

Quelle structure de données ? [Débutant]


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Quelle structure de données ?
    Bonsoir,

    Pour faire simple, disons que je travaille sur une image bitmap carrée, dont le nombre de pixels par côté est impair. Il existe donc un pixel central.

    J'ai un algorithme qui doit, en partant de ce pixel central, faire croître un "sous-carré". J'ai donc au départ un carré faisant un pixel, puis un carré de 3x3 pixels, puis de 5x5 pixels, etc. Cette itération se termine quand est satisfaite une certaine condition sur un des pixels. Par exemple, disons que je m'arrête quand je rencontre un pixel totalement noir.

    Je dois en parallèle construire une sous-image extraite de l'image d'origine, par copie des pixels. À la fin de chaque itération, quand les pixels traités par cette itération sont validés, je dois les copier de manière à faire croitre ma nouvelle image.

    Note : pour une itération donnée, je ne teste et copie (éventuellement) que les nouveaux pixels (qui forment une bordure). Mon carré est donc "creux".

    La question est donc la suivante : quelle est la meilleure structure de données pour l'ajout des pixels validés ? Si on appelle de manière très générique "tableau" cette structure de données, je pense qu'il me faut un tableau de tableaux, chacun pouvant se voir ajouté un élément en début et en fin.

    Ainsi, à la fin d'une itération, le tableau externe recevrait deux nouveaux éléments tableau (ligne supérieure et inférieure du cadre de pixels, disons), et chacun des tableaux éléments existant au préalable se verrait de même adjoindre un élément à chaque extrémité (bord gauche et droit pour une ligne donnée).

    Quelle est la meilleure structure de données existant dans C#, pour cela ?

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    En somme, tu dessines la bordure d'un carré et tu souhaites stocker les pixels de cette bordure dans une structure de données ? Dans ce cas, autant faire simple, avec un tableau unidimensionnel (une liste plutôt, question de praticité).

    En effet, tu codes une transformation qui, à un itérateur i, associe des points (for(int i = 0; ...) { x = ... y = ... }) et cette transformation peut être utilisée tant pour l'écriture des pixels que pour l'analyse des pixels récupérés.

    Cela dit, si tu préfères vraiment un tableau bidimensionnel, et bien... Soit un vrai tableau bidimensionnel (int[,]) soit des jagged arrays pour ne pas gâcher de la mémoire (int[][])

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    je pense qu'il me faut un tableau de tableaux, chacun pouvant se voir ajouté un élément en début et en fin.
    tu aurais alors de gros problemes de performance, car à chaque fois tes tableaux seraient recopiés entierement pour pouvoir etre redimmentionnés.
    Travaille eventuellement avec des System.Collection.Generic.List, et pourquoi pas des List<List<int>>.

    Mais bon j'imagine que tout ca est loin d'etre ideal. Je devinne que travailler avec des matrices seraient plus adaptés. Je dis ca car souvant en imagerie, pour redimentionner des images on travail avec du calcul matriciel (que je ne maitrise absolument pas) c'est surement pour une bonne raison

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut jagged array,liste de tableau
    bonjour giova_fr
    Bien sur une matrice à 2 domension serait bien adapte.Le seul ennui dans ton traitement que tu as bien vu c'est que tu as besoin de redimensionner à chaque fois ta matrice globale pour poivoir y inserer une nouvelle ligne en haut) au debut & en bas (à la fin).Idem pour les colonnes.
    Un tableau bi-dimensionnel pouvant etre representee de multiple facon en programmation car c'est une structure lineaire en fait.
    Dans ton cas et pour pouvoir redimensionner le monstre en "i" et "j" tout en economisant la memoire je prefererais un class MatricePixel avec 2 membres listes de tableaux unidimensionnel (rowPixels & columPixels).
    L'avantage de liste est d'ajouter mais -surtout pouvoir d'inserer à n'importe quelle position - un tableau "rowPixels" .
    L'autre avantage egalement est de pouvoir inserer un tableau quelque sa dimension,independamment des dimensions des tableaux deja inseres par ailleurs.


    exemple de code illustratif de ce que je veux dire :
    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
     
    Public Class matricePixel
        Private m_rowsPixel As List(Of Point())
        Private m_columnsPixel As List(Of Point()) = New List(Of Point())
        Public Sub New()
            m_rowsPixel = New List(Of Point())
            m_columnsPixel = New List(Of Point())
        End Sub
     
        Public Property RowsPixel() As List(Of Point())
            Get
                Return m_rowsPixel
            End Get
            Set(ByVal value As List(Of Point()))
                m_rowsPixel = value
            End Set
        End Property
     
        Public Property ColumnsPixel() As List(Of Point())
            Get
                Return m_columnsPixel
            End Get
            Set(ByVal value As List(Of Point()))
                m_columnsPixel = value
            End Set
        End Property
     
    End Class
    Public Class Form2
        Private ptPixel As Point
        Private objMatPix As matricePixel
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            objMatPix = New matricePixel
            Dim lignePixel(100) As Point
            Dim colonnePixel(100) As Point
            For I As Integer = 0 To 99
                ptPixel = New Point(I + 1, I + 2)
                lignePixel(I) = ptPixel
                colonnePixel(I) = ptPixel
            Next
           'ajout d'une ligne et colonne complete de dimension "I" 
            objMatPix.RowsPixel.Add(lignePixel)
            objMatPix.columnsPixel.Add(colonnePixel)
            Me.ListBox1.DataSource = objMatPix.RowsPixel(0)
     
            'insere une ligne et colonne complete de dimension "J" 
            ReDim lignePixel(150)
            ReDim colonnePixel(150)
            For I As Integer = 0 To 149
                ptPixel = New Point(I + 1, I + 2)
                lignePixel(I) = ptPixel
                colonnePixel(I) = ptPixel
            Next
            objMatPix.RowsPixel.Insert(1, lignePixel)
            objMatPix.ColumnsPixel.Insert(1, colonnePixel)
            Me.ListBox2.DataSource = objMatPix.RowsPixel(1)
        End Sub
    End Class
    Puisse ceci aider......
    bon code....

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    En somme, tu dessines la bordure d'un carré et tu souhaites stocker les pixels de cette bordure dans une structure de données ? Dans ce cas, autant faire simple, avec un tableau unidimensionnel (une liste plutôt, question de praticité).
    Non, je souhaite ajouter cette bordure aux pixels "internes" déjà stockés.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    tu aurais alors de gros problemes de performance, car à chaque fois tes tableaux seraient recopiés entierement pour pouvoir etre redimmentionnés.
    Travaille eventuellement avec des System.Collection.Generic.List, et pourquoi pas des List<List<int>>.
    C'était clairement l'objet de ma question. C'est pourquoi je parlais de tableau en termes génériques, et pas au sens Array. Je demandais quelle était la structure de données, et il semble donc que ça soit List.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    Bien sur une matrice à 2 domension serait bien adapte.Le seul ennui dans ton traitement que tu as bien vu c'est que tu as besoin de redimensionner à chaque fois ta matrice globale pour poivoir y inserer une nouvelle ligne en haut) au debut & en bas (à la fin).Idem pour les colonnes.
    Tu as bien compris la nature du problème. La solution que tu proposes est complète, polyvalente, mais je n'ai pas besoin d'insérer des lignes ou des colonnes n'importe où.

    Je vais donc l'alléger.

    Merci en tout cas à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle structure de données pour mon projet ?
    Par stallaf dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2010, 17h12
  2. Quelle structure de données ? Analyse des occurrences d'un trigramme
    Par Tidus159 dans le forum Algorithmes et structures de données
    Réponses: 46
    Dernier message: 12/04/2009, 19h35
  3. Quelle structure de données ?
    Par SebSplo dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 27/01/2008, 03h52
  4. quelle structure de donnée par un arbre?
    Par rdh123 dans le forum C#
    Réponses: 1
    Dernier message: 31/12/2007, 15h27
  5. [C++] quelle structure de donnée utiliser pour stocker des vertices ?
    Par johnnyjohnny dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 14/07/2007, 21h44

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