基于MFC的计算机图形学之基本图形生成(1)
1.DDA中点画线
下面的代码是在doc.cpp中加的,在view里面还要添加相应的菜单响应函数和鼠标移动函数
int x,x0,y0,x1,y1,flag;
float m,y;
DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画
//直线端点由鼠标确定后存放在group[0]、group[1]
x0=group[0].x; y0=group[0].y;
x1=group[1].x; y1=group[1].y;
if(x0==x1&&y0==y1)return;
if(x0==x1)//垂直线
{
if(y0>y1)
{
x=y0;y0=y1;y1=x;
}
for(x=y0;x<=y1;x++)
{
DCPoint->SetPixel(x0,x,m_crColor);
}
return;
}
if(y0==y1)//水平线
{
if(x0>x1)
{
x=x0;x0=x1;x1=x;
}
for(x=x0;x<=x1;x++)
{
DCPoint->SetPixel(x,y0,m_crColor);
}
return;
}
if(x0>x1)
{
x=x0;x0=x1;x1=x;//交换起始、终止点x=y0;y0=y1;y1=x;
y=y0;y0=y1;y1=y;
}
flag=0;
if(x1-x0>y1-y0&&y1-y0>0)flag=1;
if(x1-x0>y0-y1&&y0-y1>0)
{
flag=2;y0=-y0;y1=-y1;
}
if(y1-y0>x1-x0)
{
flag=3;x=x0;x0=y0;y0=x;x=x1;x1=y1;y1=x;
}
if(y0-y1>x1-x0)
{
flag=4;x=x0;x0=-y0;y0=x;x=x1;x1=-y1;y1=x;
}
m=(float)(y1-y0)/(float)(x1-x0);
for(x=x0,y=(float)y0;x<=x1;x++,y=y+m)
{
if(flag==1)DCPoint->SetPixel(x,int(y),m_crColor);
if(flag==2)DCPoint->SetPixel(x,-int(y),m_crColor);
if(flag==3)DCPoint->SetPixel(int(y),x,m_crColor);
if(flag==4)DCPoint->SetPixel(int(y),-x,m_crColor);
}
中点画线
int x,x0,y0,x1,y1,flag;
DCPoint->SetROP2(R2_COPYPEN); //绘图方法为直接画
//直线端点由鼠标确定后存放在group[0]、group[1]
x0=group[0].x;y0=group[0].y;
x1=group[1].x;y1=group[1].y;
if(x0==x1&&y0==y1)return;
if(x0==x1)//垂直线
{
if(y0>y1)
{
x=y0;
y0=y1;
y1=x;
}
for(x=y0;x<=y1;x++)
DCPoint->SetPixel(x0, x,m_crColor);
return;
}
if(y0==y1)//水平线
{
if(x0>x1)
{
x=x0;
x0=x1;
x1=x;
}
for(x=x0;x<=x1;x++)
DCPoint->SetPixel(x, y0,m_crColor);
return;
}
if(x0>x1)
{
x=x0;x0=x1;x1=x;//交换起始、终止点
x=y0;y0=y1;y1=x;
}
flag=0;
if(x1-x0>y1-y0&&y1-y0>0)flag=1;
if(x1-x0>y0-y1&&y0-y1>0)
{
flag=2;y0=-y0;y1=-y1;
}
if(y1-y0>x1-x0)
{
flag=3;x=x0;x0=y0;y0=x;x=x1;x1=y1;y1=x;
}
if(y0-y1>x1-x0)
{
flag=4;x=x0;x0=-y0;y0=x;x=x1;x1=-y1;y1=x;
}
int a,b,delta1,delta2,d,y;
a=y0-y1;
b=x1-x0;
d=2*a+b;
delta1=2*a;
delta2=2*(a+b);
x=x0;
y=y0;
while(x<x1)
{
if(d<0)
{
x++;
y++;
d+=delta2;
}
else
{
x++;
d+=delta1;
}
if(flag==1)DCPoint->SetPixel(x,int(y),m_crColor);
if(flag==2)DCPoint->SetPixel(x,-int(y),m_crColor);
if(flag==3)DCPoint->SetPixel(int(y),x,m_crColor);
if(flag==4)DCPoint->SetPixel(int(y),-x,m_crColor);
}