Dessin de lignes diagonales sur une image
Hi im essayant de dessiner des lignes diagonales à travers une image en haut à gauche à en bas à gauche voici mon code jusqu'à présent.
width = getWidth(picture)
height = getHeight(picture)
for x in range(0, width):
for y in range(0, height):
pixel = getPixel(picture, x, y)
setColor(pixel, black)
Grâce
- Vous devez mentionner le graphique de la bibliothèque que vous utilisez...
- im en utilisant jython de l'environnement pour les étudiants
Vous devez vous connecter pour publier un commentaire.
La plupart des bibliothèques graphiques ont une certaine façon de tracer une ligne directement.
Dans JES il est le
addLine
fonction, de sorte que vous pourriez faireSi vous êtes coincé avec le réglage de pixels, vous devriez jeter un oeil à Bresenham Ligne De L'Algorithme, qui est l'un des la plupart des algorithmes efficaces pour dessiner des lignes.
Une note à votre code: Ce que vous faites avec deux boucles imbriquées est la suivante
donc, fondamentalement, vous êtes le remplissage de l'ensemble de l'image avec des pixels noirs.
MODIFIER
Pour dessiner plusieurs lignes diagonales dans l'ensemble de l'image (en laissant un espace entre eux), vous pouvez utiliser la boucle suivante
Cela vous donne une image, comme par exemple (l'exemple est dessiné à la main ...)
Cela rend l'utilisation de la écrêtage la fonctionnalité, la plupart des bibliothèques graphiques fournir, c'est à dire les parties de la ligne qui ne sont pas dans l'image sont tout simplement ignorés. Notez que sans
2*width
(c'est à dire six
va seulement jusqu'àwith
), seule la partie supérieure gauche de la moitié de l'seraient les lignes dessinées...addLine
? Si vous utilisez (0,0) et (largeur,hauteur) que les points d'extrémité de la ligne, il faut être à travers l'ensemble de l'image, après tout ...Je voudrais ajouter quelques considérations mathématiques de la discussion...
(Juste parce qu'il est triste de constater que JES est addLine fonction dessine lignes noires seulement et est assez limité...)
Remarque : le code suivant utilise La Bresenham Ligne de l'Algorithme souligné par
MartinStettner
(merci à lui).Remarque : Pour comprendre le code suivant, vous aurez besoin de se rappeler un peu de votre base de l'école des cours de mathématiques (équation de droite & trigonométrie).
Code :
De sortie (Peinture de Pierre Soulages) :
Espère que cela a donné du plaisir et des idées pour JES les élèves... Et pour les autres aussi...
m
, au début dedrawInfiniteLine()
, tend à être infinie (float débordement). Cela peut être évité en faisant quelque chose comme:if (abs(m) > 100.0): m = 100.0
droite après le calcul dem
...Où est-ce que votre
picture
objet vient d'où? Quel est-il? Ce n'est pas de travail à ce jour? Et quelle bibliothèque pour l'accès à l'image que vous souhaitez utiliser? (Je veux dire, où obtenez-vous ou avez l'intention d'obtenir "getWidth getHeight, getPixel, setColor) à partir de?Je pense que pas de bibliothèque qui vous donne un "pixel" comme un ensemble d'objets qui peuvent être utilisés dans un setColor appel n'existe pas, et si elle le fait, ce serait la chose la plus lente dans le Monde - peut-être dans la galaxie.
D'autre part, si ces méthodes n'existent pas et à votre Image, le code ci-dessus doit couvrir toutes les images en noir - vous que vous obtenez tous les possibles "y" (valeurs de 0 à la taille) à l'intérieur de tous les possibles valeurs de x (de 0 à largeur) de l'image, et de couleur Noire.
Dessin d'une ligne serait vous obliger à changer de x et y en même temps, de plus comme:
(à l'aide d'un autre "imaginaire de la bibliothèque", mais de plus en plus plausible:
Ce serait le genre de travail, mais la ligne ne serait pas parfaite, sauf si l'image était parfaitement carré - sinon il serait ignorer les pixels dans le plus large sens de l'image. Pour résoudre le plus raffiné de l'algorithme est nécessaire - mais qui est deuxième, vous avez un véritable chemin pour accéder aux pixels sur une image - comme l'utilisation de Python Imaging Library (PIL ou Oreiller), ou pygame, ou une autre bibliothèque.
getPixel
...