首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDA绘制算法

DDA绘制算法
EN

Code Review用户
提问于 2015-08-20 09:52:51
回答 1查看 1.2K关注 0票数 -1

我正在使用WinBGIm

代码语言:javascript
复制
#include <iostream>
#include <cmath>
#include "graphics.h"

void Swap(double &a, double &b)
{
    double x = a;
    a = b;
    b = x;
}

double Round(double number)
{
     return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5);
}

void PlotPixel(int x, int y, int color)
{
    const int radius = 1;
    setcolor(color);
    circle(400+x,300-y,radius);
}

void DDALine(double x1, double y1, double x2, double y2, int color)
{
    //Is it really required?
    if(x1>x2 || y1>y2)
    {
        Swap(x1, x2);
        Swap(y1, y2);
    }
    //////////////////////???

    double xi = x1;
    double yi = y1;
    double deltaY = y2 - y1;
    double deltaX = x2 - x1;
    double m  = deltaY / deltaX;

    //Is it really required?
    /*if(x1 == x2)
    {
        m = 2;
    }*/

    if(abs(m)<=1)
    {
        while (xi<=x2)
        {
            yi = yi + m;
            yi = Round(yi);
            PlotPixel(xi, yi, color);
            xi = xi + 1;
        }       
    }
    if(abs(m)>1)
    {
        while (yi<=y2)
        {
            xi = xi + 1/m;
            xi = Round(xi);
            PlotPixel(xi, yi, color);
            yi = yi + 1;
        }   
    }   
}

int main()
{
    int gm=DETECT, gd=DETECT;
    initwindow(1024, 800,"Er");

    DDALine(-200, 0, 200, 0, BLUE);
    DDALine(0, 200, 0, -200, BLUE);
    ///////////////////////////////
    DDALine(-100, -100, -100, -100, WHITE);
    DDALine(-100, -100, -100, 100, WHITE);
    DDALine(-100, -100, 100, -100, WHITE);
    DDALine(-100, -100, 100, 100, WHITE);
    DDALine(-100, 100, -100, -100, WHITE);
    DDALine(-100, 100, -100, 100, WHITE);
    DDALine(-100, 100, 100, -100, WHITE);
    DDALine(-100, 100, 100, 100, WHITE);
    /////////////////////////////
    DDALine(100, -100, -100, -100, WHITE);
    DDALine(100, -100, -100, 100, WHITE);
    DDALine(100, -100, 100, -100, WHITE);
    DDALine(100, -100, 100, 100, WHITE);
    DDALine(100, 100, -100, -100, WHITE);
    DDALine(100, 100, -100, 100, WHITE);
    DDALine(100, 100, 100, -100, WHITE);
    DDALine(100, 100, 100, 100, WHITE);



    getch();
    closegraph();
}

输出:

EN

回答 1

Code Review用户

发布于 2015-08-20 17:14:14

只画直线或45度线

这里的代码似乎是错误的:

while (xi<=x2) { yi = yi + m; yi = Round(yi); PlotPixel(xi, yi, color); xi = xi + 1; }

您在每一步都舍入yi,这意味着在每一步中,您都要向yi添加0或1。这意味着你只能画直线或45度的线。相反,您应该做的是保持yi不四舍五入,但在圆角位置绘制像素,如下所示:

代码语言:javascript
复制
    while (xi<=x2)
    {
        yi = yi + m;
        PlotPixel(xi, Round(yi), color);
        xi = xi + 1;
    }

当然,另一个循环需要以同样的方式修复。我还建议将m反转一次,而不是每次循环一次。另外,您不需要其他的if语句,它可能只是一个else。全面变动:

代码语言:javascript
复制
if(abs(m)<=1)
{
    while (xi<=x2)
    {
        yi = yi + m;
        PlotPixel(xi, Round(yi), color);
        xi = xi + 1;
    }       
}
else
{
    m = 1/m;
    while (yi<=y2)
    {
        xi = xi + m;
        PlotPixel(Round(xi), yi, color);
        yi = yi + 1;
    }   
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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