Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
Tracer des lignes
Auteur Message
Répondre en citant
Message Tracer des lignes 
Bonjour,

Me revoilà avec du graphisme de précision Very Happy

Voici un bout de code pour tracer des lignes (des droites) qui utilise l'algorithme de Bresenham

Rendu


https://fr.wikipedia.org/wiki/Algorithme_de_tracé_de_segment_de_Bresenham

procédure tracerSegment(entier x1, entier y1, entier x2, entier y2) est
déclarer entier dx, dy;

si (dx ← x2 - x1) ≠ 0 alors
si dx > 0 alors
si (dy ← y2 - y1) ≠ 0 alors
si dy > 0 alors
// vecteur oblique dans le 1er quadran

si dx ≥ dy alors
// vecteur diagonal ou oblique proche de l’horizontale, dans le 1er octant
déclarer entier e ;
dx ← (e ← dx) × 2 ; dy ← dy × 2 ; // e est positif
boucle sans fin // déplacements horizontaux
tracePixel(x1, y1) ;
interrompre boucle si (x1 ← x1 + 1) = x2 ;
si (e ← e - dy) < 0 alors
y1 ← y1 + 1 ; // déplacement diagonal
e ← e + dx ;
fin si ;
fin boucle ;
sinon
// vecteur oblique proche de la verticale, dans le 2d octant
déclarer entier e ;
dy ← (e ← dy) × 2 ; dx ← dx × 2 ; // e est positif
boucle sans fin // déplacements verticaux
tracePixel(x1, y1) ;
interrompre boucle si (y1 ← y1 + 1) = y2 ;
si (e ← e - dx) < 0 alors
x1 ← x1 + 1 ; // déplacement diagonal
e ← e + dy ;
fin si ;
fin boucle ;
fin si ;

sinon // dy < 0 (et dx > 0)
// vecteur oblique dans le 4e cadran

si dx ≥ -dy alors
// vecteur diagonal ou oblique proche de l’horizontale, dans le 8e octant
déclarer entier e ;
dx ← (e ← dx) × 2 ; dy ← dy × 2 ; // e est positif
boucle sans fin // déplacements horizontaux
tracePixel(x1, y1) ;
interrompre boucle si (x1 ← x1 + 1) = x2 ;
si (e ← e + dy) < 0 alors
y1 ← y1 - 1 ; // déplacement diagonal
e ← e + dx ;
fin si ;
fin boucle ;
sinon // vecteur oblique proche de la verticale, dans le 7e octant
déclarer entier e ;
dy ← (e ← dy) × 2 ; dx ← dx × 2 ; // e est négatif
boucle sans fin // déplacements verticaux
tracePixel(x1, y1) ;
interrompre boucle si (y1 ← y1 - 1) = y2 ;
si (e ← e + dx) > 0 alors
x1 ← x1 + 1 ; // déplacement diagonal
e ← e + dy ;
fin si ;
fin boucle ;
fin si ;

fin si ;
sinon // dy = 0 (et dx > 0)

// vecteur horizontal vers la droite
répéter
tracePixel(x1, y1) ;
jusqu’à ce que (x1 ← x1 + 1) = x2 ;

fin si ;
sinon // dx < 0
si (dy ← y2 - y1) ≠ 0 alors
si dy > 0 alors
// vecteur oblique dans le 2d quadran

si -dx ≥ dy alors
// vecteur diagonal ou oblique proche de l’horizontale, dans le 4e octant
déclarer entier e ;
dx ← (e ← dx) × 2 ; dy ← dy × 2 ; // e est négatif
boucle sans fin // déplacements horizontaux
tracePixel(x1, y1) ;
interrompre boucle si (x1 ← x1 - 1) = x2 ;
si (e ← e + dy) ≥ 0 alors
y1 ← y1 + 1 ; // déplacement diagonal
e ← e + dx ;
fin si ;
fin boucle ;
sinon
// vecteur oblique proche de la verticale, dans le 3e octant
déclarer entier e ;
dy ← (e ← dy) × 2 ; dx ← dx × 2 ; // e est positif
boucle sans fin // déplacements verticaux
tracePixel(x1, y1) ;
interrompre boucle si (y1 ← y1 + 1) = y2 ;
si (e ← e + dx) ≤ 0 alors
x1 ← x1 - 1 ; // déplacement diagonal
e ← e + dy ;
fin si ;
fin boucle ;
fin si ;

sinon // dy < 0 (et dx < 0)
// vecteur oblique dans le 3e cadran

si dx ≤ dy alors
// vecteur diagonal ou oblique proche de l’horizontale, dans le 5e octant
déclarer entier e ;
dx ← (e ← dx) × 2 ; dy ← dy × 2 ; // e est négatif
boucle sans fin // déplacements horizontaux
tracePixel(x1, y1) ;
interrompre boucle si (x1 ← x1 - 1) = x2 ;
si (e ← e - dy) ≥ 0 alors
y1 ← y1 - 1 ; // déplacement diagonal
e ← e + dx ;
fin si ;
fin boucle ;
sinon // vecteur oblique proche de la verticale, dans le 6e octant
déclarer entier e ;
dy ← (e ← dy) × 2 ; dx ← dx × 2 ; // e est négatif
boucle sans fin // déplacements verticaux
tracePixel(x1, y1) ;
interrompre boucle si (y1 ← y1 - 1) = y2 ;
si (e ← e - dx) ≥ 0 alors
x1 ← x1 - 1 ; // déplacement diagonal
e ← e + dy ;
fin si ;
fin boucle ;
fin si ;

fin si ;
sinon // dy = 0 (et dx < 0)

// vecteur horizontal vers la gauche
répéter
tracePixel(x1, y1) ;
jusqu’à ce que (x1 ← x1 - 1) = x2 ;

fin si ;
fin si ;
sinon // dx = 0
si (dy ← y2 - y1) ≠ 0 alors
si dy > 0 alors

// vecteur vertical croissant
répéter
tracePixel(x1, y1) ;
jusqu’à ce que (y1 ← y1 + 1) = y2 ;

sinon // dy < 0 (et dx = 0)

// vecteur vertical décroissant
répéter
tracePixel(x1, y1) ;
jusqu’à ce que (y1 ← y1 - 1) = y2 ;

fin si ;
fin si ;
fin si ;
// le pixel final (x2, y2) n’est pas tracé.
fin procédure ;


La marche à suivre peu moins compréhensible que mes précédents programmes donc

- ne prenez pas en compte les "fin si;" mais tenez vous-en aux "sinon"
- les "sinon" sont à meme hauteur que les "si" donc pour savoir de quelle partie le "sinon" fait partie, remontez et cherchez le si qui correspond


Syntaxe
Code:

call:trace_segment couleur code_ascii x_un y_un x_deux y_deux  x/y: x/y:



soit x_un y_un les coordonnées du 1er point et x_deux y_deux les coordonnées du 2ieme point

Le code ASCII est pour le caractère avec lequel la droite sera tracée

Les x/y: sont des limites: explications en images


Comme on peut le voir, on délimite la droite dans un certain carré. Ici on peut délimiter entre un x et un y, un y et un x, un x et un x, un y et un y. Cette fonction se révèle utile quand on veut tracer une ligne exactement sur une autre mais qu'on ne sait pas où passe la droite

N'hésitez pas à utiliser pixelfnt pour un rendu meilleur

Code:
@echo off
if defined __ goto hello
set __=.
call %0 %* | darkbox
set __=
pause>NUL
goto :eof
:hello
mode 1000,1000
pixelfnt 1
REM mode 100,50

call:trace_segment c 219 100 100 300 150 x:110 y:140
pause>nul
call:trace_segment c 219 100 100 300 100 x:150 x:250
call:trace_segment c 219 300 100 300 300
call:trace_segment c 219 300 300 100 300
call:trace_segment c 219 100 300 100 100
call:trace_segment 1 219 100 100 300 300
call:trace_segment 2 219 125 100 275 300
call:trace_segment 3 219 150 100 250 300
call:trace_segment 4 219 175 100 225 300
call:trace_segment 5 219 200 100 200 300
call:trace_segment 6 219 225 100 175 300
call:trace_segment 7 219 250 100 150 300
call:trace_segment 8 219 275 100 125 300
call:trace_segment 9 219 300 100 100 300
call:trace_segment a 219 300 125 100 275
call:trace_segment b 219 300 150 100 250
call:trace_segment c 219 300 175 100 225
call:trace_segment d 219 300 200 100 200
call:trace_segment e 219 300 225 100 175
call:trace_segment f 219 300 250 100 150
call:trace_segment 1 219 300 275 100 125
pause>nul
:trace_segment
setlocal enabledelayedexpansion enableextensions
set premiere_restriction=%7
set deuxieme_restriction=%8
set x_un=%3
set y_un=%4
set x_deux=%5
set y_deux=%6
set /a dx=%x_deux%-%x_un%
set /a dy=%y_deux%-%y_un%
if %dx% NEQ 0 (
 REM 1
   if %dx% GTR 0 (
    REM 2
      if %dy% NEQ 0 (
       REM 3
         if %dy% GTR 0 (
          REM 4
            if %dx% GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_premier_octant
            REM 5
            if %dx% LSS %dy% goto vecteur_oblique_proche_verticale_dans_second_octant
            REM sinon 5
         )
         REM 4
         REM sinon 4
         set /a test_dy=-%dy%
         if %dx% GEQ !test_dy! goto vecteur_oblique_proche_horizontale_dans_huitieme_octant REM donc dy lss 0, dx gtr 0
         goto vecteur_oblique_proche_verticale_dans_septieme_octant
      )
      REM 3
      goto vecteur_horizontal_vers_droite REM dy = 0, dx gtr 0
   )
   REM 2
   REM dx lss 0
      if %dy% NEQ 0 (
         if %dy% GTR 0 (
            set /a test_dx=-%dx%
            if !test_dx! GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_quatrieme_octant
            goto vecteur_oblique_proche_verticale_dans_troisieme_octant
         )
         REM dy LSS 0, dx LSS 0
            if %dx% LEQ %dy% goto vecteur_oblique_proche_horizontale_dans_cinquieme_octant
            goto vecteur_oblique_proche_verticale_dans_sixieme_octant
      )
      goto vecteur_horizontal_vers_gauche REM dy = 0, dx lss 0
)
 REM 1
 REM dx=0
   if %dy% NEQ 0 (
      if %dy% GTR 0 goto vecteur_vertical_croissant
      goto vecteur_vertical_decroissant REM dy LSS 0, dx = 0
   )
 exit /b

:vecteur_oblique_proche_horizontale_dans_premier_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_premier_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% LSS 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_premier_octant
:vecteur_oblique_proche_verticale_dans_second_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_second_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% LSS 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_second_octant
:vecteur_oblique_proche_horizontale_dans_huitieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% LSS 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
:vecteur_oblique_proche_verticale_dans_septieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_septieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% GTR 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_septieme_octant
:vecteur_horizontal_vers_droite
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_droite
:vecteur_oblique_proche_horizontale_dans_quatrieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% GEQ 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
:vecteur_oblique_proche_verticale_dans_troisieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% LEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
:vecteur_oblique_proche_horizontale_dans_cinquieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% GEQ 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
:vecteur_oblique_proche_verticale_dans_sixieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% GEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
:vecteur_horizontal_vers_gauche
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_gauche
:vecteur_vertical_croissant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_croissant
:vecteur_vertical_decroissant
if /i "!premiere_restriction:~0,+2!" EQU "x:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %x_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if /i "!premiere_restriction:~0,+2!" EQU "y:" (
   if /i "!deuxieme_restriction:~0,+2!" EQU "y:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %y_un% echo /cga 0x%1 %x_un% %y_un% %2
   if /i "!deuxieme_restriction:~0,+2!" EQU "x:" if !premiere_restriction:~+2! LSS %y_un% if !deuxieme_restriction:~+2! GTR %x_un% echo /cga 0x%1 %x_un% %y_un% %2
)
if not defined premiere_restriction echo /cga 0x%1 %x_un% %y_un% %2
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_decroissant


Cette option de limites réduit considérablement la vitesse de l'affichage, cette limite n'est pas souvent nécessaire donc voici un code sans limite

Code:
:trace_segment
setlocal enabledelayedexpansion
echo /c 0x%1
set x_un=%3
set y_un=%4
set x_deux=%5
set y_deux=%6
set /a dx=%x_deux%-%x_un%
set /a dy=%y_deux%-%y_un%
if %dx% NEQ 0 (
REM 1
   if %dx% GTR 0 (
   REM 2
      if %dy% NEQ 0 (
      REM 3
         if %dy% GTR 0 (
         REM 4
            if %dx% GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_premier_octant
           REM 5
            if %dx% LSS %dy% goto vecteur_oblique_proche_verticale_dans_second_octant
           REM sinon 5
         )
        REM 4
        REM sinon 4
         set /a test_dy=-%dy%
         if %dx% GEQ !test_dy! goto vecteur_oblique_proche_horizontale_dans_huitieme_octant REM donc dy lss 0, dx gtr 0
         goto vecteur_oblique_proche_verticale_dans_septieme_octant
      )
     REM 3
      goto vecteur_horizontal_vers_droite REM dy = 0, dx gtr 0
   )
  REM 2
  REM dx lss 0
      if %dy% NEQ 0 (
         if %dy% GTR 0 (
            set /a test_dx=-%dx%
            if !test_dx! GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_quatrieme_octant
            goto vecteur_oblique_proche_verticale_dans_troisieme_octant
         )
        REM dy LSS 0, dx LSS 0
            if %dx% LEQ %dy% goto vecteur_oblique_proche_horizontale_dans_cinquieme_octant
            goto vecteur_oblique_proche_verticale_dans_sixieme_octant
      )
      goto vecteur_horizontal_vers_gauche REM dy = 0, dx lss 0
)
REM 1
REM dx=0
   if %dy% NEQ 0 (
      if %dy% GTR 0 goto vecteur_vertical_croissant
      goto vecteur_vertical_decroissant REM dy LSS 0, dx = 0
   )
 exit /b
 
:vecteur_oblique_proche_horizontale_dans_premier_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_premier_octant
echo /ga %x_un% %y_un% 219
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% LSS 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_premier_octant
:vecteur_oblique_proche_verticale_dans_second_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_second_octant
echo /ga %x_un% %y_un% 219
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% LSS 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_second_octant
:vecteur_oblique_proche_horizontale_dans_huitieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
echo /ga %x_un% %y_un% 219
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% LSS 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
:vecteur_oblique_proche_verticale_dans_septieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_septieme_octant
echo /ga %x_un% %y_un% 219
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% GTR 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_septieme_octant
:vecteur_horizontal_vers_droite
echo /ga %x_un% %y_un% 219
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_droite
:vecteur_oblique_proche_horizontale_dans_quatrieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
echo /ga %x_un% %y_un% 219
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% GEQ 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
:vecteur_oblique_proche_verticale_dans_troisieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
echo /ga %x_un% %y_un% 219
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% LEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
:vecteur_oblique_proche_horizontale_dans_cinquieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
echo /ga %x_un% %y_un% 219
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% GEQ 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
:vecteur_oblique_proche_verticale_dans_sixieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
echo /ga %x_un% %y_un% 219
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% GEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
:vecteur_horizontal_vers_gauche
echo /ga %x_un% %y_un% 219
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_gauche
:vecteur_vertical_croissant
echo /ga %x_un% %y_un% 219
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_croissant
:vecteur_vertical_decroissant
echo /ga %x_un% %y_un% 219
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_decroissant


Pour éviter ce code j'en ai aussi créé un qui calcule la 2ieme coordonnée

Synthaxe

Code:
 call:get_pos x/y valeur x_un y_un x_deux y_deux


Valeur étant par exemple la valeur de x pour laquelle on cherche sa valeur de y

Code:
@echo off
mode 100,30
setlocal enabledelayedexpansion enableextensions
:debut
cls
set /p x_y=  Quelle coordonnee cherchez-vous? :
echo.
set /p valeur=  Valeur :
echo.
set /p x_pos_1=  x_pos_un :
echo.
set /p y_pos_1=  y_pos_un :
echo.
set /p x_pos_2=  x_pos_deux :
echo.
set /p y_pos_2=  y_pos_deux :
echo.
echo  Calculs...
call:get_pos %x_y% %valeur% %x_pos_1% %y_pos_1% %x_pos_2% %y_pos_2%
if /i "%x_y%" EQU "x" echo %y%
if /i "%x_y%" EQU "y" echo %x%
pause >nul
goto debut
:get_pos
setlocal enabledelayedexpansion
color c
set x_un=%3
set y_un=%4
set x_deux=%5
set y_deux=%6
set /a dx=%x_deux%-%x_un%
set /a dy=%y_deux%-%y_un%
if %dx% NEQ 0 (
 REM 1
   if %dx% GTR 0 (
    REM 2
      if %dy% NEQ 0 (
       REM 3
         if %dy% GTR 0 (
          REM 4
            if %dx% GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_premier_octant
            REM 5
            if %dx% LSS %dy% goto vecteur_oblique_proche_verticale_dans_second_octant
            REM sinon 5
         )
         REM 4
         REM sinon 4
         set /a test_dy=-%dy%
         if %dx% GEQ !test_dy! goto vecteur_oblique_proche_horizontale_dans_huitieme_octant REM donc dy lss 0, dx gtr 0
         goto vecteur_oblique_proche_verticale_dans_septieme_octant
      )
      REM 3
      goto vecteur_horizontal_vers_droite REM dy = 0, dx gtr 0
   )
   REM 2
   REM dx lss 0
      if %dy% NEQ 0 (
         if %dy% GTR 0 (
            set /a test_dx=-%dx%
            if !test_dx! GEQ %dy% goto vecteur_oblique_proche_horizontale_dans_quatrieme_octant
            goto vecteur_oblique_proche_verticale_dans_troisieme_octant
         )
         REM dy LSS 0, dx LSS 0
            if %dx% LEQ %dy% goto vecteur_oblique_proche_horizontale_dans_cinquieme_octant
            goto vecteur_oblique_proche_verticale_dans_sixieme_octant
      )
      goto vecteur_horizontal_vers_gauche REM dy = 0, dx lss 0
)
 REM 1
 REM dx=0
   if %dy% NEQ 0 (
      if %dy% GTR 0 goto vecteur_vertical_croissant
      goto vecteur_vertical_decroissant REM dy LSS 0, dx = 0
   )
 exit /b

:vecteur_oblique_proche_horizontale_dans_premier_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_premier_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% LSS 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_premier_octant
:vecteur_oblique_proche_verticale_dans_second_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_second_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% LSS 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_second_octant
:vecteur_oblique_proche_horizontale_dans_huitieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% LSS 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_huitieme_octant
:vecteur_oblique_proche_verticale_dans_septieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_septieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% GTR 0 (
   set /a x_un+=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_septieme_octant
:vecteur_horizontal_vers_droite
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un+=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_droite
:vecteur_oblique_proche_horizontale_dans_quatrieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e+=%dy%
if %e% GEQ 0 (
   set /a y_un+=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_quatrieme_octant
:vecteur_oblique_proche_verticale_dans_troisieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e+=%dx%
if %e% LEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_troisieme_octant
:vecteur_oblique_proche_horizontale_dans_cinquieme_octant
set e=%dx%
set /a dx=%e%*2
set /a dy*=2
:loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
set /a e-=%dy%
if %e% GEQ 0 (
   set /a y_un-=1
   set /a e+=%dx%
)
goto loop_vecteur_oblique_proche_horizontale_dans_cinquieme_octant
:vecteur_oblique_proche_verticale_dans_sixieme_octant
set e=%dy%
set /a dy=%e%*2
set /a dx*=2
:loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
set /a e-=%dx%
if %e% GEQ 0 (
   set /a x_un-=1
   set /a e+=%dy%
)
goto loop_vecteur_oblique_proche_verticale_dans_sixieme_octant
:vecteur_horizontal_vers_gauche
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a x_un-=1
if %x_un% EQU %x_deux% (
   endlocal
   exit /b
)
goto vecteur_horizontal_vers_gauche
:vecteur_vertical_croissant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un+=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_croissant
:vecteur_vertical_decroissant
if /i "%1" EQU "x" if %x_un% EQU %2 goto endlocal
if /i "%1" EQU "y" if %y_un% EQU %2 goto endlocal
set /a y_un-=1
if %y_un% EQU %y_deux% (
   endlocal
   exit /b
)
goto vecteur_vertical_decroissant
:endlocal
(
   endlocal
   set x=%x_un%
   set y=%y_un%
   exit /b
)

Comme on le voit sur le rendu mon but ultime est de tracer des formes. C'est bientot fini, je ferai un post avec tous les codes afin de ne pas inonder la page Wink




______________________________________________________

Programme
Skype
Message Publicité 
PublicitéSupprimer les publicités ?


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch