Red de conocimientos turísticos - Conocimientos sobre calendario chino - Acerca del algoritmo subyacente del dibujo

Acerca del algoritmo subyacente del dibujo

Por lo general, estoy acostumbrado a API, CDC y funciones internas encapsuladas, y puedo aprender fácilmente cosas como dibujar líneas y círculos.

Recientemente estudié gráficos por computadora y tuve que profundizar. en los aspectos internos. Estudie el algoritmo subyacente

¡Publique algunos códigos aquí para compartir!

(Aquí solo se proporciona la función OnDraw de MFC)

1. Tres algoritmos para dibujar líneas:

1. Método DDA (diferenciación numérica):

void CDDALineView::OnDraw(CDC* pDC)

{

CDDALineDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: agregue código de dibujo para datos nativos aquí

int x, x0 (200), y0 (200), x1 (500 ), y1 (500);

flotante dx, dy, y, k

dx=x1-x0

dy=y1-y0;

k=dy/dx;

y=y0

para (x=x0; x=x1; x )

{

pDC-SetPixel(x, (int) (y 0.5), RGB (255, 0, 0));

y =k;

}

2. Algoritmo de dibujo de líneas de punto medio

void CMidpointLineView::OnDraw (CDC* pDC)

{

CMidpointLineDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: agregue código de dibujo para datos nativos aquí

int a , b, d1, d2, d, x, y;

int x0 (200), x1 (500), y0 (200), y1 (500);

a= y0-y1;

b=x1-x0;

d=2*a b;

d1=2*a;

d2=2*(a b);

x=x0;

y=y0;

pDC-SetPixel(x,y,RGB(0,255 , 0 ));

mientras (xx1)

{

si (d0)

{

x;

y

d =d2

}

otro

{

x;

d =d1;

}

pDC-SetPixel(x, y, RGB (0, 255, 0)); >

}

}

3.

Algoritmo de Bresenham:

void CBresenhamline2View::OnDraw(CDC* pDC)

{

CBresenhamline2Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//TODO: agregue código de dibujo para datos nativos aquí

int x0 (200), y0 (200), x1 (500), y1 (500) ;

int x, y, dx, dy;

dx=x1-x0;

dy=y1-y0;

int e=-dx;

x=x0;

y=y0;

para (int i=0; i=dx; i )

{

pDC-SetPixel(x,y,RGB(0,0,255));

x=x 1;

e= e 2*dy;

if (e=0)

{

y;

e=e-2* dx;

}

}

}

2. Algoritmo de dibujo de círculo de punto medio:

void CMidPointCircleView: :OnDraw (CDC* pDC)

{

CMidPointCircleDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

/ / TODO : agregue código de dibujo para datos nativos aquí

int r=100; //Radio

int m (300), n (250); //Coordenadas del centro del círculo

int x, y;

flotante d;

x=0

y=0

d = 1.25-r;

//Algoritmo de dibujo de círculo de punto medio

pDC-SetPixel (m x, n y, RGB (255, 0, 0));

pDC -SetPixel(m y,n x,RGB(255,0,0));

pDC-SetPixel(m-x,n y,RGB(255,0,0));

pDC -SetPixel(m y,n-x,RGB(255,0,0));

pDC-SetPixel(m x,n-y,RGB(255,0,0));

pDC -SetPixel(m-y,n-y,RGB(255,0,0));

pDC-SetPixel(m-x,n-y,RGB(255,0,0));

pDC -SetPixel(m-y,n-x,RGB(255,0,0));

mientras(x=y)

{

if(d0)

d =2*x 3;

else

{

d =2*(x-y) 5;

y--;

}

x;

pDC-SetPixel(mx, n y, RGB (255, 0, 0)); p>

pDC-SetPixel(m y, n x, RGB (255, 0, 0));

pDC-SetP

ixel(m-x,n-x,RGB(255,0,0));

pDC-SetPixel(m-x,n-x,RGB(255,0,0));

pDC- SetPixel(m x,n-y,RGB(255,0,0));

pDC-SetPixel(m-y,n x,RGB(255,0,0));

pDC- SetPixel(m-x,n-y,RGB(255,0,0));

pDC-SetPixel(m-y,n-x,RGB(255,0,0));

}

}