能不能准确得到已知屏幕两点LineTo经过的像素坐标?也就是说GDI的LineTo实现的原理是什么?

解决方案 »

  1.   

    知道前后两点的坐标,然后不就是简单的算术问题吗?
    a(x0,y0)
    b(x1,y1)
    c(x,y)
    那么
    (x-x0)/(y-y0)=(x1-x0)/(y1-y0)
    y1=y0表示水平线
      

  2.   

    把x从x0逐步加1到x1,然后求解。
      

  3.   

    我记得好像是一系列的头尾2点中的许多散点组成的直线~算法我到是真忘了。还是在大学是在图书馆见过。好像是一本c语言图形教材~好多基本的api的算法都有具体实现~
      

  4.   

    这个和计算机图形学有关的,关键是要看Windows画线采用的何种算法,譬如中点算法等等。
      

  5.   

    >>能不能准确得到已知屏幕两点LineTo经过的像素坐标?可以使用windowsAPI函数:LineDDA(); 可以从回调函数中得知哪些点将被绘制>>也就是说GDI的LineTo实现的原理是什么?
    有几种直线转化算法,比如:  
    template <class TPicture> //
    void _line_fast(const TPicture& iter,int x0,int y0,int x1,int y1,value_type cValue)
    {
    int x_inc,y_inc; int x =x0;
    int y =y0;
    int dx = x1-x0;
    int dy = y1-y0;
    if (dx>=0)
    {
       x_inc = 1;
    }
    else
    {
       x_inc = -1;
       dx    = -dx;
    } if (dy>=0) 
    {
       y_inc = 1;
    }
    else
    {
       y_inc = -1;
       dy    = -dy;
    }  int dx2 = dx + dx;
    int dy2 = dy + dy; if (dx > dy) 
    {
    int error = dy2 - dx;
    for (int index=0;index<dx;++index)
    {
    iter.set(x,y,cValue);
    if (error >= 0)
    {
    error-=dx2;
    y+=y_inc;
    }
    error+=dy2;
    x+=x_inc;
    }
    }
    else
    {
    int error = dx2 - dy;
    for(int index=0;index<dy;++index)
    {
    iter.set(x,y,cValue);
    if (error >= 0)
    {
    error-=dy2;
    x+=x_inc;
    }
    error+=dx2;
    y+=y_inc;

    }
    }