关于画图底层算法

时间:2010-05-07 18:37:10  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:微分)法: void CDDALineView::OnDraw(CDC*...
  正文:

平时, 用惯了API、CDC和封装好的内部函数,关于画线,画圆这些东西都是信手拈来...
最近学习计算机图形学,不得不深入内部研究一下底层算法...
在这里贴几个代码分享一下!
(这里只给出MFC的OnDraw函数)

一、画线的三个算法:
1。DDA(数值微分)法:

void CDDALineView::OnDraw(CDC* pDC)
{
  CDDALineDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  int x,x0(200),y0(200),x1(500),y1(500);
  float dx,dy,y,k;
  dx=x1-x0;
  dy=y1-y0;
  k=dy/dx;
  y=y0;
  for(x=x0;x<=x1;x++)
  {
    pDC->SetPixel(x,(int)(y+0.5),RGB(255,0,0));
    y+=k;
  }
}

2.中点画线算法

void CMidpointLineView::OnDraw(CDC* pDC)
{
  CMidpointLineDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  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));
  while(x<x1)
  {
    if(d<0)
    {
      x++;
      y++;
      d+=d2;
    }
    else
    {
      x++;
      d+=d1;
    }
    pDC->SetPixel(x,y,RGB(0,255,0));
  }
}

3。Bresenham算法:

void CBresenhamline2View::OnDraw(CDC* pDC)
{
  CBresenhamline2Doc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  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;
  for(int i=0;i<=dx;i++)
  {
    pDC->SetPixel(x,y,RGB(0,0,255));
    x=x+1;
    e=e+2*dy;
    if(e>=0)
    {
      y++;
      e=e-2*dx;
    }
  }
}

二、中点画圆算法:

void CMidPointCircleView::OnDraw(CDC* pDC)
{
  CMidPointCircleDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  int r=100;      //半径
  int m(300),n(250);   //圆心坐标
  int x,y;
  float d;
  x=0;
  y=0+r;
  d=1.25-r;
  //中点画圆算法

  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+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));
  while(x<=y)
  {
    if(d<0)
      d+=2*x+3;
    else
    {
      d+=2*(x-y)+5;
      y--;
    }
    x++;
    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+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));    
  }
} "关于画图底层算法"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/VC/2010-05-07/13923.html


关键字:

关于《关于画图底层算法》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td