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 ) p>
{
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));
}
}