首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDA线算法的实现

DDA线算法的实现
EN

Code Review用户
提问于 2013-09-29 14:18:09
回答 2查看 9K关注 0票数 2

我已经测试了所有的情况,一条线可以是

  1. 垂直
  2. 水平方向
  3. 有一个正或小于1的斜率

函数工作,但我希望它的审查,如是否有溢出,等等。

代码语言:javascript
复制
// Draw line using DDA Algorithm
void Graphics::DrawLine( int x1, int y1, int x2, int y2, Color&color )
{

    float xdiff = x1-x2; 
    float ydiff = y1-y2; 
    int slope  = 1; 
    if ( y1  == y2  )
    {
        slope = 0;
    }
    else if (  x1 == x2 )
    {
        slope = 2; // vertical lines have no slopes...
    }
    else
    {
        slope = (int)xdiff/ydiff; 
    }

    if ( slope <= 1 )
    {    
        int startx = 0;
        int endx   = 0;
        if ( x1 > x2 )
        {
            startx = x2;
            endx   = x1;
        }
        else 
        {
            startx = x1;
            endx   = x2;
        }

        float y = y1; // initial value
        for(int x = startx; x <= endx; x++)
        {
            y += slope;
            DrawPixel(x, (int)abs(y), color);
        }
    }

    else if ( slope > 1 )
    {
        float x = x1; // initial value
        for(int y = y1;y <= y2; y++)
        {
            x += 1/slope;
            DrawPixel((int)x, y, color);
        }

    }

}
EN

回答 2

Code Review用户

回答已采纳

发布于 2014-07-16 15:24:46

以下是当前算法中的一些缺陷。

  • 如果xdiff的大小很大,那么x1-x2将有一个舍入错误,y变量也是如此。
  • slope无缘无故地设置为1,然后立即重新初始化为其他内容。
  • 当大多数斜率不为整数时,slope被限制为整数。
  • 将垂直线的斜率设置为2是不可能的。有些斜坡大于2,但不是垂直线。
  • 在行slope = (int)xdiff/ydiff;中,浇铸的优先级高于除法,因此这将首先将xdiff抛给int,如果xdiff > MAXINT溢出,则丢弃分数部分(如果有),然后将该int除以ydiff。这个实际坡度的概率很小。
  • startxendx无缘无故地初始化为0,然后立即重新初始化为其他东西。
  • 当您多次将slope添加到y (或1/slope到x)时,舍入错误将累积。
  • abs(y)的理由是什么?如果y更改了范围内的符号,这将导致行中的扭结。同样适用于x
票数 5
EN

Code Review用户

发布于 2013-09-30 08:54:54

这毫无意义。slope必须是int,如0、1、2、3、4、…但是垂直线被看作是一条斜率线2?这怎么准确呢?

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/31982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档