DDA
void CLzsdView::OnDda()
{
CDC*pDC=GetDC();
RedrawWindow();
int x0,y0,x1,y1;
float dx,dy,k,x,y;
x0=100,y0=100,x1=300,y1=500;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
if(abs(k) <= 1)
{
y=y0;
for(int i=x0;i<=x1;i++)
{
pDC->SetPixel(i,int(y+0.5),RGB(255,0,0));
y=y+k;
}
}else{
k = 1/k;
x = x0;
for(int i = y0; i <= y1; i++){
pDC->SetPixel(int(x+0.5),i,RGB(255,0,0));
x=x+k;
}
}
}
中值画线法
void CLzsdView::OnMid()
{
CDC*pDC=GetDC();
int x0,y0,x1,y1;
int a,b,delta1,delta2,d,x,y;
x0=100,y0=100,x1=200,y1=400;
a=y0-y1;
b=x1-x0;
int cx = (b >= 0 ? 1 : (b = -b, -1));
int cy = (a <= 0 ? 1 : (a = -a, -1));
x=x0;
y=y0;
pDC->SetPixel(x,y,RGB(0,0,255));
if(-a <= b){
d=2*a+b;
delta1=2*a;
delta2=2*(a+b);
while(x != x1)
{
if(d < 0)
{
y += cy, d += delta2;
}else{
d += delta1;
}
x += cx;
pDC->SetPixel(x,y,RGB(0,255,0));
}
}else{
d = 2 * b + a;
delta1 = 2 * b;
delta2 = 2 * (a + b);
while(y != y1)
{
if(d < 0)
d += delta1;
else
x += cx, d += delta2;
y += cy;
pDC->SetPixel(x,y,RGB(0,255,0));
}
}
}
BRESENHAM画线法
void CLzsdView::OnBre()
{
CDC*pDC=GetDC();
int x,y,x0,y0,x1,y1;
x0=100,y0=100,x1=200,y1=500;
x = x0;
y = y0;
int dy = abs(y1-y0);
int dx = abs(x1-x0);
int s1 = x1 > x0?1:-1;
int s2 = y1 > y0?1:-1;
bool interchage = false;
if(dy>dx){
int temp = dx;
dx = dy;
dy = temp;
interchage = true;
}
int p = 2 * dy - dx;
for(int i = 0; i < dx; i++)
{
pDC->SetPixel(x,y,RGB(0,0,255));
if (p >= 0)
{
if (!interchage)
y += s2;
else
x += s1;
p -= 2 * dx;
}
if (!interchage)
x += s1;
else
y += s2;
p += 2 * dy;
}
}