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:

@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

: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



Prochains projets:

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

Enjoy!!



Dernière édition par programme le Mar 3 Avr 2018 - 20:59; édité 1 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
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