2017-02-07 1 views
0

J'essaie de trouver un algorithme pour construire une grille, basée sur le nombre de pixels et les pixels environnants. Par exemple, disons que j'ai 200 pixels aléatoires. J'ai un pixel a, et je peux obtenir des références à chaque pixel qui l'entoure. Cela est vrai pour tous les pixels. En substance, chaque pixel est une pièce de puzzle, et chaque pièce a une référence à tous ses voisins. Comment ne creat Programmatically la grille de pixels (le puzzle fini) étant donné que les informationsComment créer par programmation une grille de pixels en ne donnant que les pixels voisins

+0

Les références sont-elles commandées de quelque façon que ce soit? Une pièce de puzzle ne vous dit pas seulement à quoi elle se connecte, mais dans quel ordre. Ce qui rendrait relativement facile la construction de la limite extérieure et ensuite le travail vers l'intérieur. – Tommy

+0

En fait non, il n'y a pas de limites finies, juste un tableau d'objets (pixels) qui contiennent un ID, et 4 références à d'autres pixels, un dans chaque direction – user379468

+0

Pouvez-vous expliquer ce que "chaque pixel est un morceau de puzzle"? – cuongptnk

Répondre

0

En supposant que votre

  • entrée est une liste de pixels et chaque pixel possède les attributs top, left, bottom et right (références aux pixels environnants) et votre
  • sortie sera un tableau 2D grid de pixels,

vous pouvez faire comme suit:

def pixel_graph_to_grid(pixels): 
    if len(pixels) == 0: 
     return [[]] 

    # (1) Finding the top left pixel. 
    p = pixels[0] 
    while p.top: 
     p = p.top 
    while p.left: 
     p = p.left 

    # (2) Go row-wise through the image. 
    grid = [] 
    first_of_row = p 
    while True: 
     p = first_of_row 
     row = [p] 
     while p.right: 
      p = p.right 
      row.append(p) 

     grid.append(row) 

     if first_of_row.bottom: 
      first_of_row = first_of_row.bottom 
     else: 
      break 

Vous pouvez aussi faire un peu de comptage similaire à (1) savoir la quantité de mémoire que vous avez à allouer à la grille.

Cet algorithme a un temps d'exécution linéaire et nécessite un espace supplémentaire constant, il devrait donc être optimal.