我想问一下像windows自带的画图软件中的“直线”是怎么实现的。 

解决方案 »

  1.   

    moveto, lineto, polyline, polylineto...
      

  2.   

    pDC->MoveTo(m_1.x,m_1.y);
    pDC->LineTo(m_2.x,m_2.y);
    自己定义m_1,m_1为CPoint型
      

  3.   

    我用bresenham直线生成算法写了一个画直线的函数,若需要源码和我联系(送)。
    画圆的我也有。
      

  4.   

    鼠标ON_move的时候画一条直线,当鼠标坐标改变时(前提是一直按着左键),在以前画的直线上,反色画一条直线,同是在新坐标处画一条新直线,如此,便实现了WINDOWS的直线功能。
      

  5.   

    对,送就感到很亲切。呵呵! 我也有,而且,多中方法都有!bresenham 法; 中点法;数值微分法;等等呵呵,还有圆的,呵呵,刚好学这个图形学,老师让做的!!要的话,说话就ok!
      

  6.   

    ac669(龙龙酒),shaolunyuan(袁绍伦)
     非常感谢!
    我非常需要不知道有没有画椭圆的算法我很想学图形学, 但不知道该从何学起,希望各位多多指点。
      

  7.   

    这是从我的计算机图形学实习程序(已调试无误)中直接copy来的,应该没有错误.void CMy003View::Bresenham_circle(CPoint point,double r,COLORREF color)
     //point为圆心,r为半径,color为作图颜色.
    {     //Bresenham算法画圆
       int x,y,d,x0,y0;
        x0=point.x;
    y0=point.y;
        x=0;
    y=(int)r;
    d=(int)r;
    CDC *cdc;
    cdc=GetDC();
    cdc->SetPixel(point.x,point.y,color);  //点亮圆心.
    while(x<y)
    {
      cdc->SetPixel((x0+x),(y0+y),color);
             cdc->SetPixel((x0+y),(y0+x),color);
              cdc->SetPixel((x0+y),(y0-x),color);
              cdc->SetPixel((x0+x),(y0-y),color);
      cdc->SetPixel((x0-x),(y0-y),color);
              cdc->SetPixel((x0-y),(y0-x),color);
      cdc->SetPixel((x0-y),(y0+x),color);
              cdc->SetPixel((x0-x),(y0+y),color);
      if(d<0)
      d+=4*x+6;
      else
    {  d+=4*(x-y)+10;
       y--;
    }
    x++;
    }
    if(x==y)
    {
      cdc->SetPixel((x0+x),(y0+y),color);
              cdc->SetPixel((x0+y),(y0+x),color);
              cdc->SetPixel((x0+y),(y0-x),color);
              cdc->SetPixel((x0+x),(y0-y),color);
      cdc->SetPixel((x0-x),(y0-y),color);
              cdc->SetPixel((x0-y),(y0-x),color);
      cdc->SetPixel((x0-y),(y0+x),color);
              cdc->SetPixel((x0-x),(y0+y),color);
    }
    cdc->SetPixel(point.x,point.y,bgcolor);  //删除圆心.
    ReleaseDC(cdc);
    }    //Bresenham_circle
    ///////////////////////////////////////////////////////////////////
    void CMy003View::Bresenham_line(CPoint p1,CPoint p2,COLORREF color)
    {  //Bresenham算法画直线
    CDC *cdc=GetDC();
      long xa,xb,ya,yb,x,y,dx,dy,s1,s2,temp,change;
      //color=505;
      xa=p1.x;
      xb=p2.x;
      ya=p1.y;
      yb=p2.y;
      x=xa;    y=ya;     dx=abs(xb-xa);   dy=abs(yb-ya);
      if((xb-xa)>0)  s1=1;  else s1=-1;
      if((yb-ya)>0)  s2=1;  else s2=-1;
      if(dy>dx)
    {  temp=dx;
           dx=dy;
       dy=temp;
       change=1;
    }
    else  change=0;
    int e=-dx;
    for(int i=0;i<dx;i++)
    {  cdc->SetPixel(x,y,color);
       if(change==1)  y+=s2;
       else x+=s1;
       e=e+2*dy;
       while(e>=0)
    { if(change==1)  x+=s1;
           else y=y+s2;
       e=e-2*dx;
    }
    }
    }
    ///////////////////////////////////////////////////////////////////