Quelques optimisations : (untested, as ever)
- Code: Tout sélectionner
Lbl POLY
POLY*20+L₁+30
→F
Copy(F,L₃,4)
Copy(F+10,L₃+4,4)
Lbl SORT
For(4)ʳ
L₃→r₁
For(3)ʳ
If sign{r₁+1}-sign{r₁+3}>>0
Exch(r₁,r₁+2,2)
End
r₁+2→r₁
End
End
//les points sont rangés par y croissant
//détéction du cas particulier: les points 2 et 3 sont du même côté de la droite passant par les points 1 et 4
sign{L₃+6}-sign{L₃}→r₂
sign{L₃+7}-sign{L₃+1}→r₁
r₁*sign{L₃}-(r₂*sign{L₃+1})→r₃
//calcul de l'équation carthésienne de cette droite, de la forme R1*X-R2*Y-R3=0
r₁*sign{L₃+2}-(r₂*sign{L₃+3})-r₃>>0→r₄ //test pour le point 2
r₁*sign{L₃+4}-(r₂*sign{L₃+5})-r₃>>0+r₄→r₄ //test pour le point 3
r₄-1??0,12 //cas standard ou cas particulier
→r₆
If
If sign{L₃+3}-sign{L₃+5}>>0
Exch(L₃+2,L₃+4,2)
End
End
r₆+GDB1POLY→r₆+2→r₅
L₃+8→r₂
For(8)ʳ //je range dans L3+8 quel point doit être relié à quel autre
{{r₆}+L₃}ʳ→{r₂}ʳ
{{r₆+1}+L₃}ʳ→{r₂+2}ʳ
r₆+3→r₆
r₂+4→r₂
End
Lbl RECTLINE //le calcul des coordonnées de tous mes points
//zone d’optimisation
L₃+4
For(4)ʳ
+4→r₆
sign{+2}-sign{r₆}*256//(sign{r₆+3}-sign{r₆+1}→DY)→DELTA
If DY
sign{r₆+1}*2+{r₅+3→r₅}+L₃+255→r₂
sign{r₆}*256→r₁
For(DY)ʳ
Select(,/256→{r₂}+2→r₂)+DELTA //optimisation x2 :p
End
End
r₆
End
sign{L₃+1}→r₁*2+L₃+253→r₂
For(sign{L₃+7}-sign{L₃+1})ʳ
HLine(r₁++,sign{r₂+2→r₂},sign{r₂+1}) //je trace enfin mes lignes
End