1. 程式人生 > >基於MFC的計算機圖形學之基本圖形生成(1)

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