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

Hé ben j'ai cru que j'allais pas y arriver Crying or Very sad Mais bon au final rien de bien compliqué!

Avec ce programme vous pouvez tracer des ovales (toujours avec un rendu meilleur avec Pixelfnt : http://batch.xoo.it/t2238-BG-exe-Utility-for-Batch-Games.htm)

Ce programme se base sur l'algorithme de tracé de cercle de Bresenham (http://batch.xoo.it/t5975-Faire-des-cercles-methode-de-Bresenham.htm) et se passe en 2 fases.

A voir aussi : http://batch.xoo.it/t5974-Faire-des-cercles-methode-d-Andres.htm http://batch.xoo.it/t5975-Faire-des-cercles-methode-de-Bresenham.htm

Photo à l'appuis:



Explication des variables:

a et b:
Comme vous le voyez ici la variable a est pour le rayon horizontal et la variable b pour l'horizontale.

Comme vous vous en doutez il est possible de dessiner un cercle en faisant a=b=x donc a et b ont une meme valeur on obtient donc ceci


Ce qui peut être intéressant pour 2 choses:
1) On peut dessiner 2 formes avec un seul algorithme donc votre programme final pèsera moins lourd
2) Le dessin se fait d'une manière plus esthétique qu'avec la 1ère méthode (par quadrant et non par octant)

x et y_pos:

Pour spécifier la position de l'ellipse soit via le centre soit via les extrêmes de l'ellipse (comme avec une fenêtre windows)

Comment j'ai fait:

J'ai suivis une
x = 0
y = b
d1 = (10b)² - (a²*100*b) + ((10a)²/4) d1 = b² - (a²*b) + (a²/4)
CALL allume_pixel
:loop
if a²*(100y-50) LEQ b²*(100x+100) goto 2 if a²*(y-.5) LEQ b²*(x+1) goto 2
if d1 >= 0 (
d1 = d1+ b²*(200x+300) - a²*(200y-200) d1 = d1+ b²*((2*x)+3) + a²*((-2*y)+2)
x = x+1
y = y-1
)
d1 = d1+ b²*(200x+300) d1 = d1+ b²*((2*x)+3)
x = x+1
CALL allume_pixel
Goto loop
2:
d2 = b²*(10x+5)² + a²*(10y-10)² - ((10a)²*b²) d2 = b²*(x+.5)² + a²*(y-1)² - (a²*b²)
:loop_1
if y LEQ 0 goto end
if d2 < 0 (
d2 = d2 +b²*(200x+200) - a²*(200y-300) d2 = d2 +b²*((2*x)+2) + a²*((-2*y)+3)
y = y -1
x = x+1
)
d2 =d2 + a²*(200y-300) d2 =d2 + a²*((-2*y)+3)
y = y-1
CALL allume_pixel
Goto loop_1
:end
qui est disponible en cherchant un peu ... Les calculs barrés sont ceux de base car comme on peut le voir il y a des "-0.5" ce qui me donne des nombres rationnels et on sait tous que le batch aime pas cela donc j'ai tout multiplié par 100 comme cela il n'y a pas de problèmes lorsqu'on obtient des ',25'

Encore une fois on peut en faire un algorithme a appeler dans le programme.

Codes:

Pour petites formes[/b]]@echo off
if defined __ goto hello
set __=.
call %0 %* | darkbox
set __=
pause>NUL
goto :eof
:hello
title Draw ellipse Bresenham
mode con cols=600 lines=300
REM Sets de base
set x_pos=10
set y_pos=10
set a=100
set b=60
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
set /a a_carre_cent_b=%a_carre%*100*%b%
set /a dix_a_carre=%dix_a%*%dix_a%
set /a dix_a_carre_divise_quatre=%dix_a_carre%/4
set /a d_un=%dix_b_carre%-%a_carre_cent_b%+%dix_a_carre_divise_quatre%
REM 1ere phase
:loop_1
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
set /a a_carre_cent_y_moins_cinqante=%a_carre%*%cent_y_moins_cinqante%
set /a b_carre_cent_x_plus_cent=%b_carre%*%cent_x_plus_cent%
if %a_carre_cent_y_moins_cinqante% LEQ %b_carre_cent_x_plus_cent% goto 2iemephase
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
set /a b_carre_deux_cent_x_plus_trois_cent=%b_carre%*%deux_cent_x_plus_trois_cent%
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
set /a a_carre_deux_cent_y_plus_deux_cent=%a_carre%*%deux_cent_y_plus_deux_cent%
if %d_un% GEQ 0 goto calcul_1
set /a d_un+=%b_carre_deux_cent_x_plus_trois_cent%
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
set /a b_carre_dix_x_plus_cinq_carre=%b_carre%*%dix_x_plus_cinq_carre%
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
set /a a_carre_dix_y_moins_dix_carre=%a_carre%*%dix_y_moins_dix_carre%
set /a dix_a_carre_b_carre=%dix_a_carre%*%b_carre%
set /a d_deux=%b_carre_dix_x_plus_cinq_carre%+%a_carre_dix_y_moins_dix_carre%-%dix_a_carre_b_carre%
:loop_2
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
if %y% EQU 0 goto end
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
set /a a_carre_deux_cent_y_plus_trois_cent=%a_carre%*%deux_cent_y_plus_trois_cent%
if %d_deux% LSS 0 goto calcul_2
set /a d_deux-=%a_carre%*%deux_cent_y_plus_trois_cent%
set /a y-=1
goto loop_2
:calcul_1
set /a d_un=%d_un%+%b_carre_deux_cent_x_plus_trois_cent%-%a_carre_deux_cent_y_plus_deux_cent%
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
set /a b_carre_deux_cent_x_plus_deux_cent=%b_carre%*%deux_cent_x_plus_deux_cent%
set /a d_deux=%d_deux%+%b_carre_deux_cent_x_plus_deux_cent%-%a_carre_deux_cent_y_plus_trois_cent%
set /a x+=1
set /a y-=1
goto loop_2
:end
pause>nul


Appeler le code
Code:
call:draw_ellipse a b x_pos y_pos


Soit
a: rayon horizontal
b: rayon vertical
x_pos: position x
y_pos: position y

Pour petites formes[/b]]:draw_ellipse
set x_pos=%~3
set y_pos=%~4
set a=%~1
set b=%~2
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
set /a a_carre_cent_b=%a_carre%*100*%b%
set /a dix_a_carre=%dix_a%*%dix_a%
set /a dix_a_carre_divise_quatre=%dix_a_carre%/4
set /a d_un=%dix_b_carre%-%a_carre_cent_b%+%dix_a_carre_divise_quatre%
REM 1ere phase
:loop_1
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
set /a a_carre_cent_y_moins_cinqante=%a_carre%*%cent_y_moins_cinqante%
set /a b_carre_cent_x_plus_cent=%b_carre%*%cent_x_plus_cent%
if %a_carre_cent_y_moins_cinqante% LEQ %b_carre_cent_x_plus_cent% goto 2iemephase
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
set /a b_carre_deux_cent_x_plus_trois_cent=%b_carre%*%deux_cent_x_plus_trois_cent%
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
set /a a_carre_deux_cent_y_plus_deux_cent=%a_carre%*%deux_cent_y_plus_deux_cent%
if %d_un% GEQ 0 goto calcul_1
set /a d_un+=%b_carre_deux_cent_x_plus_trois_cent%
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
set /a b_carre_dix_x_plus_cinq_carre=%b_carre%*%dix_x_plus_cinq_carre%
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
set /a a_carre_dix_y_moins_dix_carre=%a_carre%*%dix_y_moins_dix_carre%
set /a dix_a_carre_b_carre=%dix_a_carre%*%b_carre%
set /a d_deux=%b_carre_dix_x_plus_cinq_carre%+%a_carre_dix_y_moins_dix_carre%-%dix_a_carre_b_carre%
:loop_2
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
if %y% EQU 0 goto:eof
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
set /a a_carre_deux_cent_y_plus_trois_cent=%a_carre%*%deux_cent_y_plus_trois_cent%
if %d_deux% LSS 0 goto calcul_2
set /a d_deux-=%a_carre%*%deux_cent_y_plus_trois_cent%
set /a y-=1
goto loop_2
:calcul_1
set /a d_un=%d_un%+%b_carre_deux_cent_x_plus_trois_cent%-%a_carre_deux_cent_y_plus_deux_cent%
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
set /a b_carre_deux_cent_x_plus_deux_cent=%b_carre%*%deux_cent_x_plus_deux_cent%
set /a d_deux=%d_deux%+%b_carre_deux_cent_x_plus_deux_cent%-%a_carre_deux_cent_y_plus_trois_cent%
set /a x+=1
set /a y-=1
goto loop_2

:draw_ellipse
set a=%~1
set b=%~2
set /a x_pos=%~3-%a%
set /a y_pos=%~4-%b%
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
set /a a_carre_cent_b=%a_carre%*100*%b%
set /a dix_a_carre=%dix_a%*%dix_a%
set /a dix_a_carre_divise_quatre=%dix_a_carre%/4
set /a d_un=%dix_b_carre%-%a_carre_cent_b%+%dix_a_carre_divise_quatre%
REM 1ere phase
:loop_1
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
set /a a_carre_cent_y_moins_cinqante=%a_carre%*%cent_y_moins_cinqante%
set /a b_carre_cent_x_plus_cent=%b_carre%*%cent_x_plus_cent%
if %a_carre_cent_y_moins_cinqante% LEQ %b_carre_cent_x_plus_cent% goto 2iemephase
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
set /a b_carre_deux_cent_x_plus_trois_cent=%b_carre%*%deux_cent_x_plus_trois_cent%
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
set /a a_carre_deux_cent_y_plus_deux_cent=%a_carre%*%deux_cent_y_plus_deux_cent%
if %d_un% GEQ 0 goto calcul_1
set /a d_un+=%b_carre_deux_cent_x_plus_trois_cent%
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
set /a b_carre_dix_x_plus_cinq_carre=%b_carre%*%dix_x_plus_cinq_carre%
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
set /a a_carre_dix_y_moins_dix_carre=%a_carre%*%dix_y_moins_dix_carre%
set /a dix_a_carre_b_carre=%dix_a_carre%*%b_carre%
set /a d_deux=%b_carre_dix_x_plus_cinq_carre%+%a_carre_dix_y_moins_dix_carre%-%dix_a_carre_b_carre%
:loop_2
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
if %y% EQU 0 goto:eof
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
set /a a_carre_deux_cent_y_plus_trois_cent=%a_carre%*%deux_cent_y_plus_trois_cent%
if %d_deux% LSS 0 goto calcul_2
set /a d_deux-=%a_carre%*%deux_cent_y_plus_trois_cent%
set /a y-=1
goto loop_2
:calcul_1
set /a d_un=%d_un%+%b_carre_deux_cent_x_plus_trois_cent%-%a_carre_deux_cent_y_plus_deux_cent%
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
set /a b_carre_deux_cent_x_plus_deux_cent=%b_carre%*%deux_cent_x_plus_deux_cent%
set /a d_deux=%d_deux%+%b_carre_deux_cent_x_plus_deux_cent%-%a_carre_deux_cent_y_plus_trois_cent%
set /a x+=1
set /a y-=1
goto loop_2


Le problème avec ce genre de programme c'est que il a besoin de créer une variable qui le guide ici d_un et d_deux. Ces variables forment des nombres qui sont plus grand que la limite 32 bits donc j'ai du faire une alternative et pour presque chaque calcul, appeler un code qui le calcule vu que set /a ne sait pas le faire. Ces alternatives sont plus lourdes et cela prend plus de temps pour dessiner la forme.

@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if defined __ goto hello
set __=.
call %0 %* | darkbox
set __=
pause>NUL
goto :eof
:hello
echo /h 0
mode con cols=1000 lines=1000
pixelfnt 2
call:draw_ellipse 150 100 0 0

pause>nul&exit
:draw_ellipse
set x_pos=%~3
set y_pos=%~4
set a=%~1
set b=%~2
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set /a cent_b=100*%b%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
REM call:multiplication %dix_b% %dix_b% dix_b_carre
call:multiplication %a_carre% %cent_b% a_carre_cent_b
REM call:multiplication %dix_a% %dix_a% dix_a_carre
set /a dix_a_carre=%dix_a%*%dix_a%
call:diviser_par_quatre %dix_a_carre% dix_a_carre_divise_quatre
call:add_sous %dix_b_carre% -%a_carre_cent_b% dix_b_carre_moins_a_carre_cent_b
call:add_sous %dix_b_carre_moins_a_carre_cent_b% %dix_a_carre_divise_quatre% d_un
REM 1ere phase
:loop_1
REM call:add_sous %x% %a% x_quatrieme_quadrant
REM call:add_sous %y% %b% y_quatrieme_quadrant
REM set x_premier_quadrant=%x_quatrieme_quadrant%
REM call:multiplication 2 %y% deux_y
REM call:add_sous %y_quatrieme_quadrant% -%deux_y% y_premier_quadrant
REM call:multiplication 2 %x% deux_x
REM call:add_sous %x_quatrieme_quadrant% -%deux_x% x_troisieme_quadrant
REM set y_troisieme_quadrant=%y_quatrieme_quadrant%
REM set x_deuxieme_quadrant=%x_troisieme_quadrant%
REM call:add_sous %y_troisieme_quadrant% -%deux_y% y_deuxieme_quadrant
REM call:add_sous %x_premier_quadrant% %x_pos% x_premier_quadrant
REM call:add_sous %y_premier_quadrant% %y_pos% y_premier_quadrant
REM call:add_sous %x_deuxieme_quadrant% %x_pos% x_deuxieme_quadrant
REM call:add_sous %y_deuxieme_quadrant% %y_pos% y_deuxieme_quadrant
REM call:add_sous %x_troisieme_quadrant% %x_pos% x_troisieme_quadrant
REM call:add_sous %y_troisieme_quadrant% %y_pos% y_troisieme_quadrant
REM call:add_sous %x_quatrieme_quadrant% %x_pos% x_quatrieme_quadrant
REM call:add_sous %y_quatrieme_quadrant% %y_pos% y_quatrieme_quadrant
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
REM call:multiplication 100 %y% cent_y
REM call:multiplication 100 %x% cent_x
REM call:add_sous %cent_y% -50 cent_y_moins_cinqante
REM call:add_sous %cent_x% 100 cent_x_plus_cent
REM call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
REM call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
call:islarger %a_carre_cent_y_moins_cinqante% %b_carre_cent_x_plus_cent% result
if "%result%" EQU "lss" goto 2iemephase
if "%result%" EQU "equ" goto 2iemephase
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 300 deux_cent_x_plus_trois_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
call:multiplication %b_carre% %deux_cent_x_plus_trois_cent% b_carre_deux_cent_x_plus_trois_cent
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -200 deux_cent_y_plus_deux_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
call:multiplication %a_carre% %deux_cent_y_plus_deux_cent% a_carre_deux_cent_y_plus_deux_cent
call:islarger %d_un% 0 result
set zero=0
if "%result%" EQU "gtr" goto calcul_1
if "%result%" EQU "equ" goto calcul_1
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent% d_un
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
REM call:multiplication 10 %x% dix_x
REM call:add_sous %dix_x% 5 dix_x_plus_cinq
REM call:multiplication %dix_x_plus_cinq% %dix_x_plus_cinq% dix_x_plus_cinq_carre
REM call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
REM call:multiplication 10 %y% dix_y
REM call:add_sous %dix_y% -10 dix_y_moins_dix
REM call:multiplication %dix_y_moins_dix% %dix_y_moins_dix% dix_y_moins_dix_carre
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
call:multiplication %a_carre% %dix_y_moins_dix_carre% a_carre_dix_y_moins_dix_carre
call:multiplication %dix_a_carre% %b_carre% dix_a_carre_b_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre% %a_carre_dix_y_moins_dix_carre% b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre% -%dix_a_carre_b_carre% d_deux
:loop_2
REM Voir dans loop_1 => meme code
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
if %y% EQU 0 exit /b
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -300 deux_cent_y_plus_trois_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:islarger %d_deux% 0 result
if "%result%" EQU "lss" goto calcul_2
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% -%a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a y-=1
goto loop_2
:calcul_1
call:add_sous %b_carre_deux_cent_x_plus_trois_cent% -%a_carre_deux_cent_y_plus_deux_cent% b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent% d_un
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 200 deux_cent_x_plus_deux_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
call:multiplication %b_carre% %deux_cent_x_plus_deux_cent% b_carre_deux_cent_x_plus_deux_cent
call:add_sous %b_carre_deux_cent_x_plus_deux_cent% -%a_carre_deux_cent_y_plus_trois_cent% b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% %b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a x+=1
set /a y-=1
goto loop_2



:multiplication
setlocal enableextensions
setlocal enabledelayedexpansion
setlocal
set _num1=%1
set _num2=%2
set signe_moins=
set test_moins_num_un=!_num1:~0,+1!
set test_moins_num_deux=!_num2:~0,+1!
if "!test_moins_num_un!" NEQ "-" if "!test_moins_num_deux!" EQU "-" (
set _num2=!_num2:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" NEQ "-" (
set _num1=!_num1:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" EQU "-" (
set _num1=!_num1:~+1!
set _num2=!_num2:~+1!
)
set _result=0
set aa=f
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set _num%%a=!_num%%a:%%b=%%b !
)
)
for %%a in (!_num1!) do set /a _num1cnt+=1 & set _!_num1cnt!_num1=%%a
for %%a in (!_num2!) do set /a _num2cnt+=1 & set _!_num2cnt!_num2=%%a
if !_num1cnt! equ 1 if !_num2cnt! equ 1 (
set /a _result=!_num1! * !_num2!
set aa=t
)
if "!aa!"=="f" (
for /l %%b in (!_num2cnt!,-1,1) do (
for /l %%a in (!_num1cnt!,-1,1) do (
set /a _tmp=!_%%b_num2! * !_%%a_num1! !_plus! !_co!
set _co=
set _plus=
if !_tmp! gtr 9 set _co=!_tmp:~0,1!& set _tmp=!_tmp:~-1!& set _plus=+
set _num3_%%b=!_num3_%%b!!_spc!!_tmp!
set _spc=
set _tmp=
)
if defined _co set _num3_%%b=!_num3_%%b! !_co!& set _co=& set _plus=
set _num3_%%b=!_zero!!_num3_%%b!
set _zero=0!_spc1!!_zero!
set _spc1=
for %%a in (!_num3_%%b!) do (
set /a _cnt+=1
for %%c in (!_cnt!) do set _num4_%%c=!_num4_%%c!%%a+
)
set _cnt=
)
for /f %%a in ('set _num4') do set /a _colcnt+=1
for /l %%a in (1,1,!_colcnt!) do set /a _num5_%%a=!_num4_%%a:~0,-1!
for /l %%a in (1,1,!_colcnt!) do (
if defined _co set /a _num5_%%a=!_num5_%%a! + !_co!
set _co=
if !_num5_%%a! gtr 9 (
set _co=!_num5_%%a:~0,-1!
set _num6=!_num5_%%a:~-1!!_num6!
) else (
set _num6=!_num5_%%a!!_num6!
)
set _result=!_co!!_num6!
)
)
)
(
endlocal
endlocal
endlocal
set %~3=%signe_moins%%_result%
exit /b
)

:diviser_par_quatre
set nbr=0
set a_diviser=%~1
:loop
if "!a_diviser:~+%nbr%!" EQU "" (
set debut_a_retirer=0
set /a fin_a_retirer=%nbr%-2
goto loop_diviser_par_quatre
set divise_par_quatre=
set
)
set /a nbr+=1
goto loop
:loop_diviser_par_quatre
set hello=%a_diviser_2%!a_diviser:~%debut_a_retirer%,-%fin_a_retirer%!
set /a partie_divise_par_quatre=%hello%/4
set /a moins=%partie_divise_par_quatre%*4
set /a a_diviser_2=%hello%-%moins%
set divise_par_quatre=%divise_par_quatre%%partie_divise_par_quatre%
if %fin_a_retirer% EQU 0 (
set %~2=%divise_par_quatre%
exit /b
)
if %debut_a_retirer% NEQ 0 set /a debut_a_retirer+=1
if %debut_a_retirer% EQU 0 set /a debut_a_retirer+=2
set /a fin_a_retirer-=1
goto loop_diviser_par_quatre


:add_sous
setlocal enabledelayedexpansion
set num1=%1
set num2=%2
set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" NEQ "-" (
call:add
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
call:sous %num1% !num2! results 2
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set num1=!num1:~1!
call:sous !num1! %num2% results 1
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" (
set num1=!num1:~1!
set num2=!num2:~1!
call:add
if !results! NEQ 0 call:correction_zero
)
(
endlocal
set %3=%results%
exit /b
)

:add
call:longueur_num %num1% longueur_num1
call:longueur_num %num2% longueur_num2
set max_add=%longueur_num1%
REM si les termes sont egaux
set long_num=num1

if %longueur_num1% GTR %longueur_num2% (
set max_add=%longueur_num2%
set long_num=num1
)
if %longueur_num1% LSS %longueur_num2% (
set max_add=%longueur_num1%
set long_num=num2
)
set dixaine_a_rajouter=
set nbr=0
set /a a_retirer_debut_num1=%longueur_num1%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
:loop_add
if %max_add% EQU %nbr% (
set a_rajouter=
if "!%long_num%:~0,-%nbr%!" NEQ "" set a_rajouter=!%long_num%:~0,-%nbr%!
if defined dixaine_a_rajouter set /a a_rajouter=!%long_num%:~0,-%nbr%!+%dixaine_a_rajouter%
if defined long_num set results=!a_rajouter!!results!
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" set results=-!results!
exit /b
)
if %nbr% EQU 0 (
set chiffre_num1=!num1:~-1!
set chiffre_num2=!num2:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!num1:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!num2:~%a_retirer_debut_num2%,-%nbr%!
)
if defined dixaine_a_rajouter (
set /a chiffre_num1+=1
set dixaine_a_rajouter=
)
set /a somme=%chiffre_num1%+%chiffre_num2%
if %somme% GTR 9 (
set dixaine_a_rajouter=1
set somme=!somme:~1!
)
set results=%somme%%results%
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_add
:sous
call:islarger %num1% %num2% result
set terme_un=%1
set terme_deux=%2
if "%result%" EQU "equ" (
set %3=0
exit /b
)
set signe_moins=
if "%4" EQU "1" if "%result%" EQU "gtr" set signe_moins=-
if "%result%" EQU "lss" (
if "%4" EQU "2" set signe_moins=-
set terme_un=%2
set terme_deux=%1
)
set dixaine_a_retirer=0
set nbr=0
call:longueur_num %terme_un% longueur_terme_un
set /a a_retirer_debut_num1=%longueur_terme_un%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
set /a longueur_terme_un-=1
:loop_sous
if %nbr% EQU 0 (
set chiffre_num1=!terme_un:~-1!
set chiffre_num2=!terme_deux:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!terme_un:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!terme_deux:~%a_retirer_debut_num2%,-%nbr%!
)
if "%chiffre_num2%" EQU "" set chiffre_num2=0
if %dixaine_a_retirer% NEQ 0 (
set /a chiffre_num2+=%dixaine_a_retirer%
set dixaine_a_retirer=0
)
set /a soustraction=%chiffre_num1%-%chiffre_num2%
if "!soustraction:~0,+1!" EQU "-" (
set /a dixaine_a_retirer+=1
set /a soustraction=1%chiffre_num1%-%chiffre_num2%
)
set %3=%soustraction%!%3!
if %nbr% EQU %longueur_terme_un% (
set %3=%signe_moins%!%3!
exit /b
)
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_sous

:longueur_num
set num=%1
:loop_longueur_num
if "%num%" EQU "" exit /b
set num=!num:~+1!
set /a %2+=1
goto loop_longueur_num
:correction_zero
set moins=
:loop_correction_zero
if "%results:~0,+1%" EQU "-" (
set moins=ok
set results=%results:~+1%
)
if %results:~0,+1% NEQ 0 (
if "%moins%" EQU "ok" set results=-%results%
exit /b
)
set results=%results:~1%
goto loop_correction_zero
:islarger
set num1cnt=
set num2cnt=
set num1=%1
set num2=%2

set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" EQU "-" (
set num1=!num1:~1!
)
if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set %3=gtr
exit /b
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set %3=lss
exit /b
)
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set num%%a=!num%%a:%%b=%%b !
)
)
for %%a in (!num1!) do set /a num1cnt+=1 & set _!num1cnt!num1=%%a
for %%a in (!num2!) do set /a num2cnt+=1 & set _!num2cnt!num2=%%a
if !num1cnt! NEQ !num2cnt! (
if !num1cnt! GTR !num2cnt! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
for /l %%a in (1,1,!num1cnt!) do (
if !_%%anum1! NEQ !_%%anum2! (
if !_%%anum1! GTR !_%%anum2! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
)
set %3=equ
:traitement_moins
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" EQU "-" (
if "!%3!" EQU "gtr" (
set %3=lss
exit /b
)
if "!%3!" EQU "lss" (
set %3=gtr
exit /b
)
)
exit /b

@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if defined __ goto hello
set __=.
call %0 %* | darkbox
set __=
pause>NUL
goto :eof
:hello
echo /h 0
mode con cols=1000 lines=1000
pixelfnt 2
call:draw_ellipse 50 10 180 110

pause>nul&exit
:draw_ellipse
set /a x_pos=%~3-%~1
set /a y_pos=%~4-%~2
set a=%~1
set b=%~2
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set /a cent_b=100*%b%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
REM call:multiplication %dix_b% %dix_b% dix_b_carre
call:multiplication %a_carre% %cent_b% a_carre_cent_b
REM call:multiplication %dix_a% %dix_a% dix_a_carre
set /a dix_a_carre=%dix_a%*%dix_a%
call:diviser_par_quatre %dix_a_carre% dix_a_carre_divise_quatre
call:add_sous %dix_b_carre% -%a_carre_cent_b% dix_b_carre_moins_a_carre_cent_b
call:add_sous %dix_b_carre_moins_a_carre_cent_b% %dix_a_carre_divise_quatre% d_un
REM 1ere phase
:loop_1
REM call:add_sous %x% %a% x_quatrieme_quadrant
REM call:add_sous %y% %b% y_quatrieme_quadrant
REM set x_premier_quadrant=%x_quatrieme_quadrant%
REM call:multiplication 2 %y% deux_y
REM call:add_sous %y_quatrieme_quadrant% -%deux_y% y_premier_quadrant
REM call:multiplication 2 %x% deux_x
REM call:add_sous %x_quatrieme_quadrant% -%deux_x% x_troisieme_quadrant
REM set y_troisieme_quadrant=%y_quatrieme_quadrant%
REM set x_deuxieme_quadrant=%x_troisieme_quadrant%
REM call:add_sous %y_troisieme_quadrant% -%deux_y% y_deuxieme_quadrant
REM call:add_sous %x_premier_quadrant% %x_pos% x_premier_quadrant
REM call:add_sous %y_premier_quadrant% %y_pos% y_premier_quadrant
REM call:add_sous %x_deuxieme_quadrant% %x_pos% x_deuxieme_quadrant
REM call:add_sous %y_deuxieme_quadrant% %y_pos% y_deuxieme_quadrant
REM call:add_sous %x_troisieme_quadrant% %x_pos% x_troisieme_quadrant
REM call:add_sous %y_troisieme_quadrant% %y_pos% y_troisieme_quadrant
REM call:add_sous %x_quatrieme_quadrant% %x_pos% x_quatrieme_quadrant
REM call:add_sous %y_quatrieme_quadrant% %y_pos% y_quatrieme_quadrant
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
REM call:multiplication 100 %y% cent_y
REM call:multiplication 100 %x% cent_x
REM call:add_sous %cent_y% -50 cent_y_moins_cinqante
REM call:add_sous %cent_x% 100 cent_x_plus_cent
REM call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
REM call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
call:islarger %a_carre_cent_y_moins_cinqante% %b_carre_cent_x_plus_cent% result
if "%result%" EQU "lss" goto 2iemephase
if "%result%" EQU "equ" goto 2iemephase
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 300 deux_cent_x_plus_trois_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
call:multiplication %b_carre% %deux_cent_x_plus_trois_cent% b_carre_deux_cent_x_plus_trois_cent
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -200 deux_cent_y_plus_deux_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
call:multiplication %a_carre% %deux_cent_y_plus_deux_cent% a_carre_deux_cent_y_plus_deux_cent
call:islarger %d_un% 0 result
set zero=0
if "%result%" EQU "gtr" goto calcul_1
if "%result%" EQU "equ" goto calcul_1
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent% d_un
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
REM call:multiplication 10 %x% dix_x
REM call:add_sous %dix_x% 5 dix_x_plus_cinq
REM call:multiplication %dix_x_plus_cinq% %dix_x_plus_cinq% dix_x_plus_cinq_carre
REM call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
REM call:multiplication 10 %y% dix_y
REM call:add_sous %dix_y% -10 dix_y_moins_dix
REM call:multiplication %dix_y_moins_dix% %dix_y_moins_dix% dix_y_moins_dix_carre
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
call:multiplication %a_carre% %dix_y_moins_dix_carre% a_carre_dix_y_moins_dix_carre
call:multiplication %dix_a_carre% %b_carre% dix_a_carre_b_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre% %a_carre_dix_y_moins_dix_carre% b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre% -%dix_a_carre_b_carre% d_deux
:loop_2
REM Voir dans loop_1 => meme code
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
echo /g %x_premier_quadrant% %y_premier_quadrant% /a 219 /g %x_deuxieme_quadrant% %y_deuxieme_quadrant% /a 219 /g %x_troisieme_quadrant% %y_troisieme_quadrant% /a 219 /g %x_quatrieme_quadrant% %y_quatrieme_quadrant% /a 219
if %y% EQU 0 exit /b
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -300 deux_cent_y_plus_trois_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:islarger %d_deux% 0 result
if "%result%" EQU "lss" goto calcul_2
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% -%a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a y-=1
goto loop_2
:calcul_1
call:add_sous %b_carre_deux_cent_x_plus_trois_cent% -%a_carre_deux_cent_y_plus_deux_cent% b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent% d_un
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 200 deux_cent_x_plus_deux_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
call:multiplication %b_carre% %deux_cent_x_plus_deux_cent% b_carre_deux_cent_x_plus_deux_cent
call:add_sous %b_carre_deux_cent_x_plus_deux_cent% -%a_carre_deux_cent_y_plus_trois_cent% b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% %b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a x+=1
set /a y-=1
goto loop_2



:multiplication
setlocal enableextensions
setlocal enabledelayedexpansion
setlocal
set _num1=%1
set _num2=%2
set signe_moins=
set test_moins_num_un=!_num1:~0,+1!
set test_moins_num_deux=!_num2:~0,+1!
if "!test_moins_num_un!" NEQ "-" if "!test_moins_num_deux!" EQU "-" (
set _num2=!_num2:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" NEQ "-" (
set _num1=!_num1:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" EQU "-" (
set _num1=!_num1:~+1!
set _num2=!_num2:~+1!
)
set _result=0
set aa=f
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set _num%%a=!_num%%a:%%b=%%b !
)
)
for %%a in (!_num1!) do set /a _num1cnt+=1 & set _!_num1cnt!_num1=%%a
for %%a in (!_num2!) do set /a _num2cnt+=1 & set _!_num2cnt!_num2=%%a
if !_num1cnt! equ 1 if !_num2cnt! equ 1 (
set /a _result=!_num1! * !_num2!
set aa=t
)
if "!aa!"=="f" (
for /l %%b in (!_num2cnt!,-1,1) do (
for /l %%a in (!_num1cnt!,-1,1) do (
set /a _tmp=!_%%b_num2! * !_%%a_num1! !_plus! !_co!
set _co=
set _plus=
if !_tmp! gtr 9 set _co=!_tmp:~0,1!& set _tmp=!_tmp:~-1!& set _plus=+
set _num3_%%b=!_num3_%%b!!_spc!!_tmp!
set _spc=
set _tmp=
)
if defined _co set _num3_%%b=!_num3_%%b! !_co!& set _co=& set _plus=
set _num3_%%b=!_zero!!_num3_%%b!
set _zero=0!_spc1!!_zero!
set _spc1=
for %%a in (!_num3_%%b!) do (
set /a _cnt+=1
for %%c in (!_cnt!) do set _num4_%%c=!_num4_%%c!%%a+
)
set _cnt=
)
for /f %%a in ('set _num4') do set /a _colcnt+=1
for /l %%a in (1,1,!_colcnt!) do set /a _num5_%%a=!_num4_%%a:~0,-1!
for /l %%a in (1,1,!_colcnt!) do (
if defined _co set /a _num5_%%a=!_num5_%%a! + !_co!
set _co=
if !_num5_%%a! gtr 9 (
set _co=!_num5_%%a:~0,-1!
set _num6=!_num5_%%a:~-1!!_num6!
) else (
set _num6=!_num5_%%a!!_num6!
)
set _result=!_co!!_num6!
)
)
)
(
endlocal
endlocal
endlocal
set %~3=%signe_moins%%_result%
exit /b
)

:diviser_par_quatre
set nbr=0
set a_diviser=%~1
:loop
if "!a_diviser:~+%nbr%!" EQU "" (
set debut_a_retirer=0
set /a fin_a_retirer=%nbr%-2
goto loop_diviser_par_quatre
set divise_par_quatre=
set
)
set /a nbr+=1
goto loop
:loop_diviser_par_quatre
set hello=%a_diviser_2%!a_diviser:~%debut_a_retirer%,-%fin_a_retirer%!
set /a partie_divise_par_quatre=%hello%/4
set /a moins=%partie_divise_par_quatre%*4
set /a a_diviser_2=%hello%-%moins%
set divise_par_quatre=%divise_par_quatre%%partie_divise_par_quatre%
if %fin_a_retirer% EQU 0 (
set %~2=%divise_par_quatre%
exit /b
)
if %debut_a_retirer% NEQ 0 set /a debut_a_retirer+=1
if %debut_a_retirer% EQU 0 set /a debut_a_retirer+=2
set /a fin_a_retirer-=1
goto loop_diviser_par_quatre


:add_sous
setlocal enabledelayedexpansion
set num1=%1
set num2=%2
set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" NEQ "-" (
call:add
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
call:sous %num1% !num2! results 2
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set num1=!num1:~1!
call:sous !num1! %num2% results 1
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" (
set num1=!num1:~1!
set num2=!num2:~1!
call:add
if !results! NEQ 0 call:correction_zero
)
(
endlocal
set %3=%results%
exit /b
)

:add
call:longueur_num %num1% longueur_num1
call:longueur_num %num2% longueur_num2
set max_add=%longueur_num1%
REM si les termes sont egaux
set long_num=num1

if %longueur_num1% GTR %longueur_num2% (
set max_add=%longueur_num2%
set long_num=num1
)
if %longueur_num1% LSS %longueur_num2% (
set max_add=%longueur_num1%
set long_num=num2
)
set dixaine_a_rajouter=
set nbr=0
set /a a_retirer_debut_num1=%longueur_num1%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
:loop_add
if %max_add% EQU %nbr% (
set a_rajouter=
if "!%long_num%:~0,-%nbr%!" NEQ "" set a_rajouter=!%long_num%:~0,-%nbr%!
if defined dixaine_a_rajouter set /a a_rajouter=!%long_num%:~0,-%nbr%!+%dixaine_a_rajouter%
if defined long_num set results=!a_rajouter!!results!
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" set results=-!results!
exit /b
)
if %nbr% EQU 0 (
set chiffre_num1=!num1:~-1!
set chiffre_num2=!num2:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!num1:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!num2:~%a_retirer_debut_num2%,-%nbr%!
)
if defined dixaine_a_rajouter (
set /a chiffre_num1+=1
set dixaine_a_rajouter=
)
set /a somme=%chiffre_num1%+%chiffre_num2%
if %somme% GTR 9 (
set dixaine_a_rajouter=1
set somme=!somme:~1!
)
set results=%somme%%results%
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_add
:sous
call:islarger %num1% %num2% result
set terme_un=%1
set terme_deux=%2
if "%result%" EQU "equ" (
set %3=0
exit /b
)
set signe_moins=
if "%4" EQU "1" if "%result%" EQU "gtr" set signe_moins=-
if "%result%" EQU "lss" (
if "%4" EQU "2" set signe_moins=-
set terme_un=%2
set terme_deux=%1
)
set dixaine_a_retirer=0
set nbr=0
call:longueur_num %terme_un% longueur_terme_un
set /a a_retirer_debut_num1=%longueur_terme_un%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
set /a longueur_terme_un-=1
:loop_sous
if %nbr% EQU 0 (
set chiffre_num1=!terme_un:~-1!
set chiffre_num2=!terme_deux:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!terme_un:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!terme_deux:~%a_retirer_debut_num2%,-%nbr%!
)
if "%chiffre_num2%" EQU "" set chiffre_num2=0
if %dixaine_a_retirer% NEQ 0 (
set /a chiffre_num2+=%dixaine_a_retirer%
set dixaine_a_retirer=0
)
set /a soustraction=%chiffre_num1%-%chiffre_num2%
if "!soustraction:~0,+1!" EQU "-" (
set /a dixaine_a_retirer+=1
set /a soustraction=1%chiffre_num1%-%chiffre_num2%
)
set %3=%soustraction%!%3!
if %nbr% EQU %longueur_terme_un% (
set %3=%signe_moins%!%3!
exit /b
)
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_sous

:longueur_num
set num=%1
:loop_longueur_num
if "%num%" EQU "" exit /b
set num=!num:~+1!
set /a %2+=1
goto loop_longueur_num
:correction_zero
set moins=
:loop_correction_zero
if "%results:~0,+1%" EQU "-" (
set moins=ok
set results=%results:~+1%
)
if %results:~0,+1% NEQ 0 (
if "%moins%" EQU "ok" set results=-%results%
exit /b
)
set results=%results:~1%
goto loop_correction_zero
:islarger
set num1cnt=
set num2cnt=
set num1=%1
set num2=%2

set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" EQU "-" (
set num1=!num1:~1!
)
if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set %3=gtr
exit /b
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set %3=lss
exit /b
)
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set num%%a=!num%%a:%%b=%%b !
)
)
for %%a in (!num1!) do set /a num1cnt+=1 & set _!num1cnt!num1=%%a
for %%a in (!num2!) do set /a num2cnt+=1 & set _!num2cnt!num2=%%a
if !num1cnt! NEQ !num2cnt! (
if !num1cnt! GTR !num2cnt! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
for /l %%a in (1,1,!num1cnt!) do (
if !_%%anum1! NEQ !_%%anum2! (
if !_%%anum1! GTR !_%%anum2! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
)
set %3=equ
:traitement_moins
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" EQU "-" (
if "!%3!" EQU "gtr" (
set %3=lss
exit /b
)
if "!%3!" EQU "lss" (
set %3=gtr
exit /b
)
)
exit /b



Après je vous conseille d'utiliser les codes comme suit:
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if defined __ goto hello
set __=.
call %0 %* | darkbox
set __=
pause>NUL
goto :eof
:hello
echo /h 0
mode con cols=100 lines=30
echo en cours
call:draw_ellipse 50 10 180 110
mode con cols=1000 lines=1000
pixelfnt 2
echo %draw%>> code.txt
echo %draw%
pause>nul&exit
:draw_ellipse
set /a x_pos=%~3-%~1
set /a y_pos=%~4-%~2
set a=%~1
set b=%~2
REM Sets pour calculs
set /a a_carre=%a%*%a%
set /a b_carre=%b%*%b%
set /a a_b=%a%*%b%
set /a dix_b=10*%b%
set /a dix_a=10*%a%
set /a cent_b=100*%b%
set x=0
set y=%b%
set /a dix_b_carre=%dix_b%*%dix_b%
REM call:multiplication %dix_b% %dix_b% dix_b_carre
call:multiplication %a_carre% %cent_b% a_carre_cent_b
REM call:multiplication %dix_a% %dix_a% dix_a_carre
set /a dix_a_carre=%dix_a%*%dix_a%
call:diviser_par_quatre %dix_a_carre% dix_a_carre_divise_quatre
call:add_sous %dix_b_carre% -%a_carre_cent_b% dix_b_carre_moins_a_carre_cent_b
call:add_sous %dix_b_carre_moins_a_carre_cent_b% %dix_a_carre_divise_quatre% d_un
REM 1ere phase
:loop_1
REM call:add_sous %x% %a% x_quatrieme_quadrant
REM call:add_sous %y% %b% y_quatrieme_quadrant
REM set x_premier_quadrant=%x_quatrieme_quadrant%
REM call:multiplication 2 %y% deux_y
REM call:add_sous %y_quatrieme_quadrant% -%deux_y% y_premier_quadrant
REM call:multiplication 2 %x% deux_x
REM call:add_sous %x_quatrieme_quadrant% -%deux_x% x_troisieme_quadrant
REM set y_troisieme_quadrant=%y_quatrieme_quadrant%
REM set x_deuxieme_quadrant=%x_troisieme_quadrant%
REM call:add_sous %y_troisieme_quadrant% -%deux_y% y_deuxieme_quadrant
REM call:add_sous %x_premier_quadrant% %x_pos% x_premier_quadrant
REM call:add_sous %y_premier_quadrant% %y_pos% y_premier_quadrant
REM call:add_sous %x_deuxieme_quadrant% %x_pos% x_deuxieme_quadrant
REM call:add_sous %y_deuxieme_quadrant% %y_pos% y_deuxieme_quadrant
REM call:add_sous %x_troisieme_quadrant% %x_pos% x_troisieme_quadrant
REM call:add_sous %y_troisieme_quadrant% %y_pos% y_troisieme_quadrant
REM call:add_sous %x_quatrieme_quadrant% %x_pos% x_quatrieme_quadrant
REM call:add_sous %y_quatrieme_quadrant% %y_pos% y_quatrieme_quadrant
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
set draw=%draw% /4ga %x_premier_quadrant% %y_premier_quadrant% 219 %x_deuxieme_quadrant% %y_deuxieme_quadrant% 219 %x_troisieme_quadrant% %y_troisieme_quadrant% 219 %x_quatrieme_quadrant% %y_quatrieme_quadrant% 219
REM call:multiplication 100 %y% cent_y
REM call:multiplication 100 %x% cent_x
REM call:add_sous %cent_y% -50 cent_y_moins_cinqante
REM call:add_sous %cent_x% 100 cent_x_plus_cent
REM call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
REM call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
set /a cent_y=100*%y%
set /a cent_x=100*%x%
set /a cent_y_moins_cinqante=%cent_y%-50
set /a cent_x_plus_cent=%cent_x%+100
call:multiplication %a_carre% %cent_y_moins_cinqante% a_carre_cent_y_moins_cinqante
call:multiplication %b_carre% %cent_x_plus_cent% b_carre_cent_x_plus_cent
call:islarger %a_carre_cent_y_moins_cinqante% %b_carre_cent_x_plus_cent% result
if "%result%" EQU "lss" goto 2iemephase
if "%result%" EQU "equ" goto 2iemephase
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 300 deux_cent_x_plus_trois_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_trois_cent=%deux_cent_x%+300
call:multiplication %b_carre% %deux_cent_x_plus_trois_cent% b_carre_deux_cent_x_plus_trois_cent
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -200 deux_cent_y_plus_deux_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_deux_cent=%deux_cent_y%-200
call:multiplication %a_carre% %deux_cent_y_plus_deux_cent% a_carre_deux_cent_y_plus_deux_cent
call:islarger %d_un% 0 result
set zero=0
if "%result%" EQU "gtr" goto calcul_1
if "%result%" EQU "equ" goto calcul_1
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent% d_un
set /a x+=1
goto loop_1
REM 2ieme phase
:2iemephase
REM call:multiplication 10 %x% dix_x
REM call:add_sous %dix_x% 5 dix_x_plus_cinq
REM call:multiplication %dix_x_plus_cinq% %dix_x_plus_cinq% dix_x_plus_cinq_carre
REM call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
REM call:multiplication 10 %y% dix_y
REM call:add_sous %dix_y% -10 dix_y_moins_dix
REM call:multiplication %dix_y_moins_dix% %dix_y_moins_dix% dix_y_moins_dix_carre
set /a dix_x=10*%x%
set /a dix_x_plus_cinq=%dix_x%+5
set /a dix_x_plus_cinq_carre=%dix_x_plus_cinq%*%dix_x_plus_cinq%
call:multiplication %b_carre% %dix_x_plus_cinq_carre% b_carre_dix_x_plus_cinq_carre
set /a dix_y=10*%y%
set /a dix_y_moins_dix=%dix_y%-10
set /a dix_y_moins_dix_carre=%dix_y_moins_dix%*%dix_y_moins_dix%
call:multiplication %a_carre% %dix_y_moins_dix_carre% a_carre_dix_y_moins_dix_carre
call:multiplication %dix_a_carre% %b_carre% dix_a_carre_b_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre% %a_carre_dix_y_moins_dix_carre% b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre
call:add_sous %b_carre_dix_x_plus_cinq_carre_a_carre_dix_y_moins_dix_carre% -%dix_a_carre_b_carre% d_deux
:loop_2
REM Voir dans loop_1 => meme code
set /a x_quatrieme_quadrant=%x%+%a%
set /a y_quatrieme_quadrant=%y%+%b%
set x_premier_quadrant=%x_quatrieme_quadrant%
set /a y_premier_quadrant=%y_quatrieme_quadrant%-(2*%y%)
set /a x_troisieme_quadrant=%x_quatrieme_quadrant%-(2*%x%)
set y_troisieme_quadrant=%y_quatrieme_quadrant%
set x_deuxieme_quadrant=%x_troisieme_quadrant%
set /a y_deuxieme_quadrant=%y_troisieme_quadrant%-(2*%y%)
set /a x_premier_quadrant+=%x_pos%
set /a y_premier_quadrant+=%y_pos%
set /a x_deuxieme_quadrant+=%x_pos%
set /a y_deuxieme_quadrant+=%y_pos%
set /a x_troisieme_quadrant+=%x_pos%
set /a y_troisieme_quadrant+=%y_pos%
set /a x_quatrieme_quadrant+=%x_pos%
set /a y_quatrieme_quadrant+=%y_pos%
set draw=%draw% /4ga %x_premier_quadrant% %y_premier_quadrant% 219 %x_deuxieme_quadrant% %y_deuxieme_quadrant% 219 %x_troisieme_quadrant% %y_troisieme_quadrant% 219 %x_quatrieme_quadrant% %y_quatrieme_quadrant% 219
if %y% EQU 0 exit /b
REM call:multiplication 200 %y% deux_cent_y
REM call:add_sous %deux_cent_y% -300 deux_cent_y_plus_trois_cent
set /a deux_cent_y=200*%y%
set /a deux_cent_y_plus_trois_cent=%deux_cent_y%-300
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:islarger %d_deux% 0 result
if "%result%" EQU "lss" goto calcul_2
call:multiplication %a_carre% %deux_cent_y_plus_trois_cent% a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% -%a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a y-=1
goto loop_2
:calcul_1
call:add_sous %b_carre_deux_cent_x_plus_trois_cent% -%a_carre_deux_cent_y_plus_deux_cent% b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent
call:add_sous %d_un% %b_carre_deux_cent_x_plus_trois_cent_moins_a_carre_deux_cent_y_plus_deux_cent% d_un
set /a x+=1
set /a y-=1
goto loop_1
:calcul_2
REM call:multiplication 200 %x% deux_cent_x
REM call:add_sous %deux_cent_x% 200 deux_cent_x_plus_deux_cent
set /a deux_cent_x=200*%x%
set /a deux_cent_x_plus_deux_cent=%deux_cent_x%+200
call:multiplication %b_carre% %deux_cent_x_plus_deux_cent% b_carre_deux_cent_x_plus_deux_cent
call:add_sous %b_carre_deux_cent_x_plus_deux_cent% -%a_carre_deux_cent_y_plus_trois_cent% b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent
call:add_sous %d_deux% %b_carre_deux_cent_x_plus_deux_cent_moins_a_carre_deux_cent_y_plus_trois_cent% d_deux
set /a x+=1
set /a y-=1
goto loop_2



:multiplication
setlocal enableextensions
setlocal enabledelayedexpansion
setlocal
set _num1=%1
set _num2=%2
set signe_moins=
set test_moins_num_un=!_num1:~0,+1!
set test_moins_num_deux=!_num2:~0,+1!
if "!test_moins_num_un!" NEQ "-" if "!test_moins_num_deux!" EQU "-" (
set _num2=!_num2:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" NEQ "-" (
set _num1=!_num1:~+1!
set signe_moins=-
)
if "!test_moins_num_un!" EQU "-" if "!test_moins_num_deux!" EQU "-" (
set _num1=!_num1:~+1!
set _num2=!_num2:~+1!
)
set _result=0
set aa=f
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set _num%%a=!_num%%a:%%b=%%b !
)
)
for %%a in (!_num1!) do set /a _num1cnt+=1 & set _!_num1cnt!_num1=%%a
for %%a in (!_num2!) do set /a _num2cnt+=1 & set _!_num2cnt!_num2=%%a
if !_num1cnt! equ 1 if !_num2cnt! equ 1 (
set /a _result=!_num1! * !_num2!
set aa=t
)
if "!aa!"=="f" (
for /l %%b in (!_num2cnt!,-1,1) do (
for /l %%a in (!_num1cnt!,-1,1) do (
set /a _tmp=!_%%b_num2! * !_%%a_num1! !_plus! !_co!
set _co=
set _plus=
if !_tmp! gtr 9 set _co=!_tmp:~0,1!& set _tmp=!_tmp:~-1!& set _plus=+
set _num3_%%b=!_num3_%%b!!_spc!!_tmp!
set _spc=
set _tmp=
)
if defined _co set _num3_%%b=!_num3_%%b! !_co!& set _co=& set _plus=
set _num3_%%b=!_zero!!_num3_%%b!
set _zero=0!_spc1!!_zero!
set _spc1=
for %%a in (!_num3_%%b!) do (
set /a _cnt+=1
for %%c in (!_cnt!) do set _num4_%%c=!_num4_%%c!%%a+
)
set _cnt=
)
for /f %%a in ('set _num4') do set /a _colcnt+=1
for /l %%a in (1,1,!_colcnt!) do set /a _num5_%%a=!_num4_%%a:~0,-1!
for /l %%a in (1,1,!_colcnt!) do (
if defined _co set /a _num5_%%a=!_num5_%%a! + !_co!
set _co=
if !_num5_%%a! gtr 9 (
set _co=!_num5_%%a:~0,-1!
set _num6=!_num5_%%a:~-1!!_num6!
) else (
set _num6=!_num5_%%a!!_num6!
)
set _result=!_co!!_num6!
)
)
)
(
endlocal
endlocal
endlocal
set %~3=%signe_moins%%_result%
exit /b
)

:diviser_par_quatre
set nbr=0
set a_diviser=%~1
:loop
if "!a_diviser:~+%nbr%!" EQU "" (
set debut_a_retirer=0
set /a fin_a_retirer=%nbr%-2
goto loop_diviser_par_quatre
set divise_par_quatre=
set
)
set /a nbr+=1
goto loop
:loop_diviser_par_quatre
set hello=%a_diviser_2%!a_diviser:~%debut_a_retirer%,-%fin_a_retirer%!
set /a partie_divise_par_quatre=%hello%/4
set /a moins=%partie_divise_par_quatre%*4
set /a a_diviser_2=%hello%-%moins%
set divise_par_quatre=%divise_par_quatre%%partie_divise_par_quatre%
if %fin_a_retirer% EQU 0 (
set %~2=%divise_par_quatre%
exit /b
)
if %debut_a_retirer% NEQ 0 set /a debut_a_retirer+=1
if %debut_a_retirer% EQU 0 set /a debut_a_retirer+=2
set /a fin_a_retirer-=1
goto loop_diviser_par_quatre


:add_sous
setlocal enabledelayedexpansion
set num1=%1
set num2=%2
set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" NEQ "-" (
call:add
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
call:sous %num1% !num2! results 2
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set num1=!num1:~1!
call:sous !num1! %num2% results 1
if !results! NEQ 0 call:correction_zero
)
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" (
set num1=!num1:~1!
set num2=!num2:~1!
call:add
if !results! NEQ 0 call:correction_zero
)
(
endlocal
set %3=%results%
exit /b
)

:add
call:longueur_num %num1% longueur_num1
call:longueur_num %num2% longueur_num2
set max_add=%longueur_num1%
REM si les termes sont egaux
set long_num=num1

if %longueur_num1% GTR %longueur_num2% (
set max_add=%longueur_num2%
set long_num=num1
)
if %longueur_num1% LSS %longueur_num2% (
set max_add=%longueur_num1%
set long_num=num2
)
set dixaine_a_rajouter=
set nbr=0
set /a a_retirer_debut_num1=%longueur_num1%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
:loop_add
if %max_add% EQU %nbr% (
set a_rajouter=
if "!%long_num%:~0,-%nbr%!" NEQ "" set a_rajouter=!%long_num%:~0,-%nbr%!
if defined dixaine_a_rajouter set /a a_rajouter=!%long_num%:~0,-%nbr%!+%dixaine_a_rajouter%
if defined long_num set results=!a_rajouter!!results!
if "%test_moins_num_un%%test_moins_num_deux%" EQU "--" set results=-!results!
exit /b
)
if %nbr% EQU 0 (
set chiffre_num1=!num1:~-1!
set chiffre_num2=!num2:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!num1:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!num2:~%a_retirer_debut_num2%,-%nbr%!
)
if defined dixaine_a_rajouter (
set /a chiffre_num1+=1
set dixaine_a_rajouter=
)
set /a somme=%chiffre_num1%+%chiffre_num2%
if %somme% GTR 9 (
set dixaine_a_rajouter=1
set somme=!somme:~1!
)
set results=%somme%%results%
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_add
:sous
call:islarger %num1% %num2% result
set terme_un=%1
set terme_deux=%2
if "%result%" EQU "equ" (
set %3=0
exit /b
)
set signe_moins=
if "%4" EQU "1" if "%result%" EQU "gtr" set signe_moins=-
if "%result%" EQU "lss" (
if "%4" EQU "2" set signe_moins=-
set terme_un=%2
set terme_deux=%1
)
set dixaine_a_retirer=0
set nbr=0
call:longueur_num %terme_un% longueur_terme_un
set /a a_retirer_debut_num1=%longueur_terme_un%-1
set /a a_retirer_debut_num2=%longueur_num2%-1
set /a longueur_terme_un-=1
:loop_sous
if %nbr% EQU 0 (
set chiffre_num1=!terme_un:~-1!
set chiffre_num2=!terme_deux:~-1!
)
if %nbr% NEQ 0 (
set chiffre_num1=!terme_un:~%a_retirer_debut_num1%,-%nbr%!
set chiffre_num2=!terme_deux:~%a_retirer_debut_num2%,-%nbr%!
)
if "%chiffre_num2%" EQU "" set chiffre_num2=0
if %dixaine_a_retirer% NEQ 0 (
set /a chiffre_num2+=%dixaine_a_retirer%
set dixaine_a_retirer=0
)
set /a soustraction=%chiffre_num1%-%chiffre_num2%
if "!soustraction:~0,+1!" EQU "-" (
set /a dixaine_a_retirer+=1
set /a soustraction=1%chiffre_num1%-%chiffre_num2%
)
set %3=%soustraction%!%3!
if %nbr% EQU %longueur_terme_un% (
set %3=%signe_moins%!%3!
exit /b
)
set /a a_retirer_debut_num1-=1
set /a a_retirer_debut_num2-=1
set /a nbr+=1
goto loop_sous

:longueur_num
set num=%1
:loop_longueur_num
if "%num%" EQU "" exit /b
set num=!num:~+1!
set /a %2+=1
goto loop_longueur_num
:correction_zero
set moins=
:loop_correction_zero
if "%results:~0,+1%" EQU "-" (
set moins=ok
set results=%results:~+1%
)
if %results:~0,+1% NEQ 0 (
if "%moins%" EQU "ok" set results=-%results%
exit /b
)
set results=%results:~1%
goto loop_correction_zero
:islarger
set num1cnt=
set num2cnt=
set num1=%1
set num2=%2

set test_moins_num_un=!num1:~0,+1!
set test_moins_num_deux=!num2:~0,+1!
if "%test_moins_num_un%" EQU "-" (
set num1=!num1:~1!
)
if "%test_moins_num_deux%" EQU "-" (
set num2=!num2:~1!
)
if "%test_moins_num_un%" NEQ "-" if "%test_moins_num_deux%" EQU "-" (
set %3=gtr
exit /b
)
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" NEQ "-" (
set %3=lss
exit /b
)
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set num%%a=!num%%a:%%b=%%b !
)
)
for %%a in (!num1!) do set /a num1cnt+=1 & set _!num1cnt!num1=%%a
for %%a in (!num2!) do set /a num2cnt+=1 & set _!num2cnt!num2=%%a
if !num1cnt! NEQ !num2cnt! (
if !num1cnt! GTR !num2cnt! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
for /l %%a in (1,1,!num1cnt!) do (
if !_%%anum1! NEQ !_%%anum2! (
if !_%%anum1! GTR !_%%anum2! (
set %3=gtr
goto traitement_moins
) else (
set %3=lss
goto traitement_moins
)
)
)
set %3=equ
:traitement_moins
if "%test_moins_num_un%" EQU "-" if "%test_moins_num_deux%" EQU "-" (
if "!%3!" EQU "gtr" (
set %3=lss
exit /b
)
if "!%3!" EQU "lss" (
set %3=gtr
exit /b
)
)
exit /b



Prochains projets:

Algorithme de traçage de droites
Algorithme de traçage d'arcs de cercle

Enjoy!!



Dernière édition par programme le Hier à 17:42; édité 3 fois

______________________________________________________

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


Répondre en citant
Message Faire des ellipses 
Petit problème apres a=127 b=300 je travaille a la résolution

Si qq sait.... Hesitez pas




______________________________________________________

Programme
Skype
Répondre en citant
Message Faire des ellipses 
programme a écrit:
Petit problème apres a=127 b=300 je travaille a la résolution

Si qq sait.... Hesitez pas



Bugs résolus !




______________________________________________________

Programme
Skype
Message Faire des ellipses 


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