Although drawing a two-dimensional line is a functional already duplicated by C's lineto() function, it is important to the graphics programmer to understand how a line is drawn, and so we will study how to do it using only the single-pixel drawing function, putpixel().
To make a line, you must first determine the slope. This is how steep the line is; In pixel terms, it is how much one axis changes whenever you add 1 to the other axis.
To determine the slope, first determine the differences for the two axes. For example, if the first point's x value is 10 and the second point's x value is 30, then the difference for x is 20. Once you have the two differences, divide the x difference by the y difference. The result is the slope, or how much x changes when you add 1 to y.
As an example, imagine a line which extends at a 45 degree angle, like this:
/ / / / / / / /
(Assuming you're not viewing this in 40-column monospace text mode, that line probably isn't really 45 degrees. But that's okay.) Further suppose that the x axis goes from 10 to 30, and that the y axis does as well. Difference for both axes is 20. 20 divided by 20 is, obviously, 1, meaning that x increases by 1 when you add 1 to y.
A slightly more complicated example now... A line of 22.5 degrees.
/ | / | / | /
(Yes, it does look horrible.) Anyway, now imagine that x extends from 10 to 30 again, and y goes from 10 to 50. x difference is 20. y difference is 40. 20 / 40 = 0.5, meaning that x increases by 0.5 when you add 1 to y.
Based on what we've learned here, we can make a program to plot a course between two set points on the screen. Such a program might look something like this one right here:
#include <stdio.h> #include <graphics.h> main() { /* The two lines below just initialize the graphics mode. */ double x1, y1, x2, y2, x, y; /* Prompt for the coordinates of each end of the line... */ printf("x1? "); scanf("%lf", &x1); printf("y1? "); scanf("%lf", &y1); printf("x2? "); scanf("%lf", &x2); printf("y2? "); scanf("%lf", &y2); int gdriver=VGA, gmode=2; initgraph(&gdriver, &gmode, "C:\\TC\\BGI"); double xdiff, ydiff; /* If x1 is smaller than x2, subtract x1 from x2 to get xdiff, and vice versa. Same goes for ydiff. */ if (x1 < x2) {xdiff = x2 - x1;} if (x1 > x2) {xdiff = x1 - x2;} if (y1 < y2) {ydiff = y2 - y1;} if (y1 > y2) {ydiff = y1 - y2;} double m = xdiff / ydiff; //m is the slope, how much x changes when you ++ y x = x1; /* If y1 is less than y2, keep adding to y. If y2 is less than y1, keep subtracting from y. */ if (y1 < y2) { for (y = y1; y < y2; y = y + 1) { putpixel (x, y, 9); /* If x1 is smaller than x2, keep adding the slope to x. If x2 is smaller than x1, keep subtracting the slope from x. */ if (x1 < x2) { x = x + m; } else {x = x - m; } }} else for (y = y1; y > y2; y = y - 1) { putpixel (x, y, 9); if (x1 < x2) { x = x + m; } else {x = x - m; } } printf("%f",m); }