2010-12-07 5 views
2

Hey. Mes maths ne sont pas géniaux alors j'espère que quelqu'un pourra m'aider avec ça. J'ai un tableau 1D de pixels (représentant une image 2d). Pour accéder à un pixel spécifique, j'utilise cette formule:Afficher les pixels environnants dans le tableau

image.Pixels[row * imageWidth + col] = pixelColor; 

Cela fonctionne, mais je voudrais aussi inclure des pixels autour du pixel sélectionné. Quel est le moyen le plus rapide, sans utiliser de pointeurs directement, d'obtenir un groupe de pixels autour du pixel sélectionné avec un rayon de r et de définir leurs valeurs à pixelColor? J'essaie de créer une application de type peinture et j'aimerais varier les tailles de pinceau, qui seraient dictées par la taille du rayon. Merci pour toute aide.

+2

Le moyen le plus simple serait d'utiliser un tableau 2D. Ou à tout le moins, pour configurer une propriété afin que vous puissiez y accéder comme un tableau 2D. –

Répondre

6

Je ne sais pas C# en particulier, mais quelque chose à l'effet de cela devrait-vous

for (i=-r ; i< r ; i++) { 
    for (j=-(r - i); j<(r - i); j++) { 
     image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour; 
    } 
} 

Modifier ci-dessus peint en fait un diamant, j'ai donné ma première idée de hack pour faire un cercle approprié ci-dessous

for (i=-r ; i<r ; i++) { 
    for (j=-r; j<r; j++) { 
     if((i*i + j*j)<(r*r)){ 
      image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour; 
     } 
    } 
} 
+0

Vous êtes en train de peindre un diamant, pas un cercle. Cela peut être facilement réparé, cependant. –

+0

bon point, mis à jour avec un peintre de cercle naïf! – tobyodavies

3

la façon lente simple serait de parcourir la plage de pixels dans la rangée + - r et col + - r, et calculer la distance de rangée et de colonne ne dépasse pas r. Distance de col, ligne est squareroot (différence de x au carré + différence de y au carré).

Un moyen légèrement plus rapide consiste à comparer le carré du rayon à la différence de x au carré + la différence en y car ils sont comparables.

encore plus rapide est Bresenham's circle algorithm,

Un autre article: Bresenham's Line and Circle Algorithms

Une fois que vous avez la distance de col pour une ligne, vous pouvez remplir les pixels de col - distance au col + la distance, pas besoin de calculer les deux. Vous pouvez donc vous en tirer en ne calculant que la moitié du cercle.

Questions connexes