1

Edited_3638

2

A priori, comme ça sans même regarder le code je dirais que ça vient du sens de dessin de tes lignes... Après je peux me tromper mais bon ^^
Logiquement dessiner une ligne de A à B ou de B à A par rasterisation n'est pas nécéssairement une chose équivalente... (une ligne de 3x2 pixels illustre parfaitement le problème)
Je sais pas ce qu'il en est réellement pke flemme de regarder le code mais voilà mon avis.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

Tu remplis avec des lignes horizontales ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

vu que les "trou" sont des lignes, c'est que non ^^
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

5

C'est bien ce que je pensais, je voulais vérifier smile
À mon avis, c'est surtout ça le pb... Et puis tu iras nettement plus vite avec des lignes horizontales, non ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

6

Godzil :
vu que les "trou" sont des lignes, c'est que non ^^

euh non pas forcément, c'est tout simplement que le calcul de la frontière n'est pas le même pour les deux triangles, mais ça ne veut pas dire qu'il ne remplit pas avec des lignes horizontales...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

7

Edited_3639

8

ah oui tiens je sais pas pkoi j'avais cru que le code était top secret ^^

ben c'est très simple, comme dit GC il faut que le calcul des paramètre de la ligne ne dépende pas de l'ordre des extrémités mais juste de la paire formée par les extrémités, donc il faut choisir un ordre prédéfini sur les extrémités qui ne dépende que des coordonnées de l'extrémité et toujours tracer de la première extrémité vers la deuxième... dans ton cas y1<=y2<=y3 donc tu as déjà un ordre sur tes extrémités (c'est pas tout à fait un ordre total si y1=y2, mais ça ne pose pas de pb si les tracés (x1,y)->(x2,y) et (x2,y)->(x1,y) coïncident), donc il suffit de tracer systématiquement les segments dans l'ordre y1->y2 / y2->y3 / y1->y3 smile (donc par exemple dans ton code dx3 = x3-x1 et pas le contraire)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

Edited_3640

10

Orion_
:
Pollux :
(donc par exemple dans ton code dx3 = x3-x1 et pas le contraire)
ça ne change rien helas :/

oui, ça n'explique pas les différences de plus d'un pixel (qui seraient de toute façon masquée par le bug dont je parle plus bas) : c'est tout simplement que ta boucle do/while (faite avec des goto :/) devrait être une vraie boucle while...
j'ai reflechis la dessus et le probleme disparait si je change mes if du debut par des >= au lieu de >.

oui mais non ça ça ne change rien, ça peut changer l'ordre dans des cas particulier mais un code pas buggé marche avec des > ssi il marche avec des >=...


autre remarque : tu devrais faire
for (t = x; t < xx; t++) Pixel(s, t, y2, c);
et pas
for (t = x; t <= xx; t++) Pixel(s, t, y2, c);
(sinon tu traces un pixel en trop : des triangles de couleurs différentes qui se touchent sans se recouvrir vont déborder chacun d'un pixel, et donc ça va être supra-moche puisque le résultat va dépendre de l'ordre de tracé des triangles)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

11

Edited_3641

12

Tu compte le "bord" dans ton calcul de remplissage ?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13

Orion_
:
Pollux :
oui, ça n'explique pas les différences de plus d'un pixel (qui seraient de toute façon masquée par le bug dont je parle plus bas) : c'est tout simplement que ta boucle do/while (faite avec des goto :/) devrait être une vraie boucle while...

heu avec goto ou avec un do/while ça ne change absolument rien grin le probleme ce situe en X, ou dans le calcul de la pente, pas dans la hauteur y, je te comprend pas trop la confus

une boucle do/while et une boucle while, c'est pas pareil trinon

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

14

Orion_
:
Pollux :
autre remarque : tu devrais faire
for (t = x; t < xx; t++) Pixel(s, t, y2, c);
et pas
for (t = x; t <= xx; t++) Pixel(s, t, y2, c);
(sinon tu traces un pixel en trop : des triangles de couleurs différentes qui se touchent sans se recouvrir vont déborder chacun d'un pixel, et donc ça va être supra-moche puisque le résultat va dépendre de l'ordre de tracé des triangles)

heu si je fait ça j'ai encore plus de trou ... et le remplissage avec le <= arrive pile au bord de mon rectangle de clipping donc c'est bon confus

oui tu as encore plus de trous mais c'est à cause du bug de la boucle do/while qui apparaît mieux, quand tu l'auras corrigé tu n'en auras pas... et ton rectangle de clipping est trop petit d'un pixel si ça n'arrive pas jusqu'au bord quand tu clippes et que tu dessines sans déborder ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

Edited_3642

16

Orion_, comment tu le dessines ton polygone vert ? Si ce sont 2 triangles, l'erreur se trouve peut-être dans leurs coordonnées.

Pour faire un arrondi, dans les calculs, je ferais plutôt :
x = (x+(1<<15))>>16;
avatar

17

Thepro :
Pour faire un arrondi, dans les calculs, je ferais plutôt :
x = (x+(1<<15))>>16;

oui, ou pour que ça soit plus rapide
x1 = (x1<<16)+(1<<15)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

18

Edited_3643

19

mais la 2è remarque de thepro est très juste, ça vaut largement les 4 cycles supplémentaires par triangle ^^ (même si y aura pas de trou si tu le fais pas, tes lignes seront très disymétriques : le tracé d'une ligne symétrique par rapport à un point n'est pas vraiment symétrique par rapport à ce point dans ta version actuelle)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)