This blog is under construction

Saturday 31 August 2013

C program to implement Bresenham line drawing algorithm

Bresenham Line Drawing Algorithm For Slope Less Than 1:
Step 1: Get the line endpoints from the user.
            (Xstart, Ystart) and (Xend, Yend) are the endpoints of a line.

Step 2:  Calculate dx, dy, 2dy and (2dy - 2dx)
            dx = Xend - Xstart
            dy = Yend - Ystart

Step 3:  Find the initial value of the decision parameter(P).
            P0 = 2dy - dx

Step 4: If Pk < 0, then the next points to plot are(k starts at 0)
           Xk + 1 = Xk + 1
           Yk + 1 = Yk
           and Pk + 1 = Pk + 2dy

           Otherwise, the next points to plot are
           Xk + 1 = Xk + 1
           Yk + 1 = Yk + 1
           and Pk + 1 = Pk + 2dy - 2dx

Step 5:  Repeat step 4 dx times.


Write a C program to implement Bresenham line drawing algorithm:  


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

  int main() {
        /* request auto detection */
        int gdriver = DETECT, gmode;
        int x1 = 0, y1 = 0, x2, y2;
        int err, x, y, dx, dy, dp, xEnd;
        int twody, twodxdy;

        /* initialize graphic driver */
        initgraph(&gdriver, &gmode, "C:/TURBOC3/BGI");
        err = graphresult();

        if (err != grOk) {
                /* error occurred */
                printf("Graphics Error: %s\n",
                                grapherrormsg(err));
                return 0;
        }

        /* max position in x and y axis */
        x2 = getmaxx();
        y2 = getmaxy();

        /* draws line from (0, 0) to (x2, y2) */
        dx = x2 - x1;
        dy = y2 - y1;

        twody = 2 * dy;
        twodxdy = 2 * (dy - dx);

        dp = twody - dx;

        if (x1 > x2) {
                x = x2;
                y = y2;
                xEnd = x1;
        } else {
                x = x1;
                y = y1;
                xEnd = x2;
        }

        /* put a dot at the position (x, y) */
        putpixel(x, y, WHITE);

        /* calculate x and y successor and plot the points */
        while (x < xEnd) {
                x = x + 1;
                if (dp < 0) {
                        dp = dp + twody;
                } else {
                        y = y + 1;
                        dp = dp + twodxdy;
                }

                /* put a dot at the given position(x, y) */
                putpixel(x, y, WHITE);

                /* sleep for 50 milliseconds */
                delay(50);
        }

        getch();

        /* deallocate memory allocated for graphic screen */
        closegraph();

        return 0;
  }



Output: (Bresenham's Line Drawing Algorithm)


1 comment: