Bien... Ce que je peux te proposer c'est que si tu as les coordonnées du centre (x0, y0), alors tu peux calculer les nombres que t'as dans les pixel de coordonnée (x, y) par abs(x-x0) + abs(y-y0).
Et t'as plus qu'à leur associer une couleur.
Le seul soucis c'est que tu vas parcourir autant de pixels à colorier que de pixels à ne pas colorier.
Donc si tu veux vraiment optimiser tu peux dessiner des losanges en partant du centre.
Pour une distance d du centre, il est facile de calculer les coordonnées des 4 coins.
Puis à partir de ces coordonnées il est facile de se déplacer en diagonale pour colorier les pixels.
Bonjour,
Voici une idée que je te propose. Pour chaque case, tu peux associer un couple de coordonnées (voir l'image en PJ).
Du coup je traiterai le problème avec les diagonales dont les coordonnées sont facilement paramétrable. Pour celles que j'ai dessinée, la N-ième diagonales et de la forme (i, N-i) avec i variant de 0 à N, ce qui en terme d'algorithme donne.
Il te reste à modéliser les autre diagonales et à les mettre dans les boucles.
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 Saisir N; // taille du losange Lire N; Pour k allant de N à 0 par pas de -1 Pour i allant de 0 à k // diagonale du carré en haut à droite case(i,k-i) <-- k; case(i,k-i) <-- Couleur(k); // diagonale du carré en haut à gauche // à toi de jouer ... // diagonale du carré en bas à droite // à toi de jouer ... // diagonale du carré en bas à gauche // à toi de jouer ... FinPour FinPour
Voila une idée possible, mais comme toujours en algo il existe plusieurs chemins.
Bon courage
Bonjour,
Désolé d'avoir pris autant de temps pour répondre, mais j'étais un peu débordé...
Déja je suis contant que les solutions auxquelles j'ai pensé soit proposé![]()
@Celelibi : C'est la solution que j'ai adopté.
@sologne : J'ai pensé à cette solution mais j'ai l’impression quelle est coûteuse en ressource, après j'avoue que je l'ai pas testé donc je ne sais pas...
@souviron34 : Même si ce n'est plus nécessaire, oui il s'agissait des losanges reguliers.
Merci à tous pour voter aide
Bonjour,
je déterre mais c'est pour la bonne cause, je propose un algo finalisé pour le langage Pascal.
Testé sous Linux/Lazarus mais ça devrait fonctionner sous Windows/Delphi, il n'y a rien de particulier dans le code : juste que je dessine un losange de 100x100 plein de vert en haut à gauche de la fiche, et que je lui rajoute une bordure rouge pour bien voir.
Enjoy :
Code pascal : 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 procedure TForm1.Button1Click(Sender: TObject); var h,w,centre :integer; begin centre := 100 div 2; with Canvas do begin for h := 0 to centre do // hauteur for w := 0 to h do // largeur begin pixels[abs(w-centre), abs(w-h+centre)] := clGreen; // en haut à gauche pixels[abs(w+centre), abs(w-h+centre)] := clGreen; // en haut à droite pixels[abs(w-h+centre), abs(w+centre)] := clGreen; // en bas à gauche pixels[abs(h-w+centre), abs(w+centre)] := clGreen; // en bas à droite end; // bordure rouge pen.Color:=clRed; pen.Style:=psSolid; Polyline([Point(50, 0), Point(100, 50), Point(50, 100), Point(0, 50), Point(50, 0)]); end; end;
Bah, au final on (enfin, moi) arrive au même code.
Merci aux contributeurs qui m'ont mis sur la piste
Partager