Bresenham 的线条绘制算法

Posted

技术标签:

【中文标题】Bresenham 的线条绘制算法【英文标题】:Bresenham's Line Drawing Algorithm 【发布时间】:2014-04-11 10:30:11 【问题描述】:

我编写了这段代码。此代码处理 dx 和 dy 大于 0 的情况。但是,当其中一个小于 0 时该怎么办。算法说 m 应该被视为绝对值,x 和 y 应该递减。但是如何在第二个 for 循环中递减 i(x) 呢?

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>

void illuminate (int x, int y,  int col)

    putpixel(x+320,240-y,col);



void main (void)

    int i,x1,y1,x2,y2,j;
    float dx,dy,m,e;
    int gdriver=DETECT,gmode;

    initgraph(&gdriver,&gmode, "C:\\TurboC3\\BGI");
    printf("\nEnter the coordinates of initial point\n");
    scanf("%d%d",&x1,&y1);
    printf("\nEnter the coordinates of final point\n");
    scanf("%d%d",&x2,&y2);

    dx = x2 - x1;
    dy = y2 - y1;
    m = abs(dy)/abs(dx);
    j = y1;
    e = m - 1;

    line(320,0,320,480);
    line(0,240,640,240);

    if ( dx >= 0 && dy >= 0 )   
    
        for (i=x1;i<x2-1;i++)
        
            illuminate(i,j,4);
            if ( e>= 0 )
            
                j = j+1;
                e = e-1.0;
            
            e = e+m;
        
    
    else
    
        for (i=x1;i<x2-1;i++)
        
            illuminate(i,j,4);
            if (e>=0)
            
                j = j-1;
                e = e-1.0;
            
            e = e+m;
        
    
    getch();

【问题讨论】:

【参考方案1】:

处理这种情况的一种简单方法是在某个容器中“绘制”直线相对于 x 轴的镜像,然后再次镜像。您实际上不必这样做,但这种思维方式可能会帮助您确定我们应该在哪里放置否定。 dx 为正或负时的代码非常相似,仅在几个符号上有所不同。

【讨论】:

以上是关于Bresenham 的线条绘制算法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Bresenham创建任意厚度的线?

Bresenham Line光栅化不连接像素

直线的中点Bresenham算法的实现

用Bresenham算法绘制多边形的算法

RPG游戏中Bresenham算法推导以及应用

Bresenham画线算法详解及其OpenGL编程实现