基于MFC的计算机图形学之基本图形生成(1)

基于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);
 }

猜你喜欢

转载自blog.csdn.net/Hui_R_Q_XIONGDA/article/details/86377709