Computing a Picture
The Equation of a Line
How to draw a line that is not horizontal is obviously the next question. To accomplish that, we need to apply some simple mathematics. One of the math lessons says that a line can be described by one linear function:
- f(x) = ax + b
It is common to use horizontal axis of a graph for values of variable x, and to use vertical axis for values of function f(x). But, since coordinates in computer graphics are commonly labeled by names x and y, we can rewrite the equation above as:
- y = ax + b
In this equation, x and y are coordinates, or more precisely, the mathematical variable x represents the number of a column, and mathematical variable y represents the number of a row. The mathematical variable b represents the y-intercept, and the mathematical variable a represents the slope of the line.
We need to pick some values for a and b to draw a particular line. Let us choose the value of 0.3 for the slope a and the value 0 for the y-intercept b. The equation is then:
- y = 0.3x + 0
Let us draw a piece of the line that is determined by the equation above. Our piece will be a part of the line lying between columns numbered 50 and 500:
for (int x=50; x<500; x++) { int y = 0.3*x + 0; putpixel(surface, x, y, makecol(0,0,255) ); }
The complete program is given below:
#include <allegro.h> int main() { if (allegro_init()!=0) return 1; set_color_depth(32); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0)!=0) return 2; BITMAP* surface = create_bitmap(SCREEN_W, SCREEN_H); install_keyboard(); clear_to_color(surface, makecol(255,255,255) ); for (int x=50; x<500; x++) { int y = 0.3*x; putpixel(surface, x, y, makecol(0,0,255) ); } blit(surface, screen, 0,0,0,0,SCREEN_W,SCREEN_H); while (!keypressed()) rest(20); return 0; } END_OF_MAIN()
The program produces the image on the right.
However, since the y-intercept b equals 0, should not the line be directed towards the origin in the lower left corner of the image? Also, the slope a is positive, so it would be expected that the line is rising up instead of falling down. In short, this is not quite a line that would be expected given the equation used.
How to explain this strange discrepancy?