Pierrotdu18> Ton algo à l'air plus simple que le mien et peut être plus rapide je regarderais plus en détail comment ça marche
Mais il ne suffit pas de relier les deux points de ma ligne pour que ça marche: il doivent être reliés obligatoirement du haut vers le bas, pour chaque côté de mon rectangle tout en enregistrant la coordonnée y, de plus je dois trier mes 4 points dans un ordre préçis (avec 3 cas possibles)
Enfin bref j'ai un truc assez artisanal:
[EDIT 2] Retro pédalage: cet algo ne fonctionne pas pour les cas particuliers cités (il plante juste quoi

)
- Code: Select all
.RECT
Data(0,2,L₁+255ʳ,2,6,L₁+255ʳ,0,4,L₁+256ʳ,4,6,L₁+256ʳ,0,6,L₁+255ʳ,0,2,L₁+256ʳ,2,4,L₁+256ʳ,2,6,L₁+256ʳ,0,2,L₁+255ʳ,2,4,L₁+255ʳ,4,6,L₁+255ʳ,0,6,L₁+256ʳ)→GDB1POLY //Une liste de quel point doit être relié à quel autre, dans quel ordre et à quel pointeur je doit stocker ses coordonnées
//Vous pouvez aller directement à lbl SORT
Fix 5
[appvAXECOS]→GDB1COS
L₃→°Z1
L₃+2→°Z2
L₃+4→°DX
L₃+6→°DY
L₃+8→°GD
L₃+10→°FPS
L₃+12→°X1
L₃+14→°Y1
0→FPS
16→R
0→θ
10→Z1
48→X1
32→Y1
Lbl REPEAT
Repeat getKey(15)
FPS++
Pxl-On(0,FPS^64)
getKey(2)-getKey(3)+R→R
getKey(1)-getKey(4)+θ→θ
getKey(54)-getKey(48)+Z1→Z1
getKey(52)-getKey(53)+X1→X1
getKey(49)-getKey(50)+Y1→Y1
128-Z1→Z2
θ-Z1→{L₂}
θ+Z1→{L₂+1}
θ-Z2→{L₂+2}
θ+Z2→{L₂+3}
L₂→Z2
L₁→A
For(4)
COS({Z2})*R//128+X1→{A}
SIN({Z2})*R//128+Y1→{A+1}
Z2++
A+2→A
End
Lbl SORT
For(4) //Je trie mes points (1,2,3,4) par ordre de Y croissant
L₁→r₁
For(3)
If sign{r₁+1}>>sign{r₁+3}
Exch(r₁,r₁+2,2)
End
r₁+2→r₁
End
End
If sign{L₁+2}-sign{L₁+4}>>0 //Le x du point 2 doit être inférieur à celui du point 3
Exch(L₁+2,L₁+4,2)
End
0→r₆
sign{L₁+2}-sign{L₁}→r₁
sign{L₁+4}-sign{L₁+6}→r₂
If r₁>>0 and (r₂>>0) //Si le point avec le Y le plus petit et celui avec le Y le plus grand sont du même côté (les deux à droite) j'ai un cas particulier
16→r₆
ElseIf r₁<<0 and (r₂<<0) //Si ils sont les deux à gauche alors autre cas
32→r₆
End
If r₆
If sign{L₁+2}-sign{L₁+4}>>0 //Selon les situations je dois réinverser les points 2 et 3 lors des cas particuliers pour tracer mes côté dans le bon ordre
Exch(L₁+2,L₁+4,2)
End
End
//mes points ont été triés, j'indique maintenant lesquels devront être relié à partir de la liste de data tout en haut.
r₆+GDB1POLY→r₆→r₅
L₂→r₂
For(8)
{{r₆}+L₁}ʳ→{r₂}ʳ
{{r₆+1}+L₁}ʳ→{r₂+2}ʳ
r₆+4→r₆
r₂+4→r₂
End
//le tracé des lignes (enfin :'( )
Lbl LINE
L₂→r₆
For(4)
{r₅+2}ʳ→A //le pointeur au niveau duquel je range mes coordonnées
r₅+4→r₅
sign{r₆+2}-sign{r₆}→DX
sign{r₆+3}-sign{r₆+1}→DY
If (DX//DY) //le premier cas où la ligne est plus "horizontale" que "verticale"
DY*sign{r₆}//DX-sign{r₆+1}→P //le p du Y=Mx+p
DX<<0?⁻1,1
→GD //Si ma ligne doit être tracée vers la gauche ou la droite
sign{r₆}→r₁ //le x de départ
If DX
For(abs(DX))
r₁*DY//DX-P→r₂ //le Y correspondant
.Pxl-On(r₁,r₂)
r₁→{r₂*2+A} //Je le stocke
r₁+GD→r₁ //incrémentation du x
End
End
Else //l'autre cas où la ligne est plus "verticale" que "horizontale"
Exch(°DX,°DY,2)
sign{r₆+1}→r₁ //J'échange les rôles des x et des y
DY*sign{r₆+1}//DX-sign{r₆}→P
If DX
For(abs(DX))
r₁*DY//DX-P→r₂ //le x en fonction du y
.Pxl-On(r₂,r₁)
r₂→{r₁*2+A} //que je stocke
r₁++ //j'incrémente le y (toujours de +1 puisque mes lignes sont tracées du haut vers le bas)
End
End
End
r₆+4→r₆ //et hop on passe à la ligne d'après
End
//je peux maintenant remplir mon quadrilatère (et pas parallèlogramme, ce serait trop facile)
sign{L₂+1}*2+L₁+255→B //l'endroit ou j'ai rangé mes 2 x )
sign{L₂+1}→A //mon Y de départ
For(abs(sign{L₂+7}-sign{L₂+1})) //le nombre total de lignes
Line(sign{B}>>0*sign{B},A,sign{B+1},A) //un truc très moche
B+2→B
A++
End //arf, c'était long :)
DispGraphClrDraw
End
Lbl SIN
-64
Lbl COS
sign{^256+GDB1COS}
Voilà je vais essayer d'améliorer cette "chose"
Themachine02> Merci pour l'optimisation, j'ajoute aussi vite que possible

Il y avait des trucs évidents et d'autres moins, j'espère ça accélérera un peu
Au sujet des lignes je pensais faire un truc entièrement manuel au lieu de HLine(Y,X1,X2):
Les points à relier: P1(13;32) et P2(49;32)
Fill(32*96+L6+(13/8),49-13/8,-1)
not(e*(13^8)-1)->{32*96+(13/8)+L6}
e*(49^8)-1->{32*96+(49/8)+L6}
(j'espère ne pas avoir écrit de bêtises)
Mais je sais pas si c'est plus rapide.
[edit] A la base l'algo était pour des triangles mais j'ai adapté pour 4 points pour ne pas devoir calculer 2* un même côté