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 ?
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:
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....