Алгоритм Брезенхема для вывода эллипса
Комментариев:
Одно время у меня была мания на, всякого рода, графические библиотечки :) Они еще не раз появятся на этом сайте.
Казалось бы — убитое время: Ан нет, опыт написания подобных очень пригодился при разработке своего клона GD, который выводит курс валют и информер погоды на www.novgorod.ru, счетчик и кое-какие графики на top.novgorod.ru.
Здесь приведена неотъемлемая часть такое библиотек — Алгоритм Брезенхема для вывода эллипса, самый быстрый из подобных.
#include <conio.h>#include <stdlib.h>//############################ Вывод точки ##################################void putpixel(unsigned int X,unsigned int Y,unsigned char Color){asm {mov ax, [Y]mov dx, 320imul dxadd ax, [X]mov di, axpush esmov ax, 0xA000mov es, axmov al,[Color]stosbpop es}}//################ Алгорит Брезенхема для рисования эллипса #################void ellipse(int x, int y, int a, int b, int color){int col,i,row,bnew;long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;b_square=b*b;a_square=a*a;row=b;col=0;two_a_square=a_square<<1;four_a_square=a_square<<2;four_b_square=b_square<<2;two_b_square=b_square<<1;d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square);while(a_square*(row)>b_square*(col)){putpixel(col+x,row+y,color);putpixel(col+x,y-row,color);putpixel(x-col,row+y,color);putpixel(x-col,y-row,color);if (d>=0){row--;d-=four_a_square*(row);}d+=two_b_square*(3+(col<<1));col++;}d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square;while ((row) + 1){putpixel(col+x,row+y,color);putpixel(col+x,y-row,color);putpixel(x-col,row+y,color);putpixel(x-col,y-row,color);if (d<=0){col++;d+=four_b_square*col;}row--;d+=two_a_square*(3-(row <<1));}}void main(void){int X,Y;asm mov ax,0x0013asm int 0x10while (!kbhit()) putpixel(random(320),random(200),random(255));getch();while (!kbhit()){X=50+random(220);Y=50+random(100);ellipse(X,Y,1+random(48),1+random(48),random(255));}getch();}
Download this code: demo_320.cpp