- HubPages»
- Technology»
- Computers & Software»
- Computer Science & Programming»
- Programming Languages
Drawing Lines in Javascript - part 2 in a series
The next step in Javascript Graphics
My last hub showed how to draw rectangles using Javascript. This hub will make use of that capability to draw lines.
There was a comment on my earlier hub about drawing rectangles in Javascript, that it could be done in an HTML 5 canvas element. Aside from the fact that HTML 5 is not yet ubiquitously deployed, an anticipated similar comment about this hub, misses the point that my intention is to talk about the drawing of lines and that Javascript simply provides a medium for describing the process of drawing a line on a computer.
Drawing lines is an interesting programming exercise, because it is surprisingly complex. While a line is a continuous entity, it has to be mapped to pixels, which are descrete rectangles on the screen. This mapping requires floating point arithmetic to calculate the points along the line, and integer arithmetic to map the line to pixels on the screen. The calculation involves loops to calculate all of the points along the line, and conditions to take into account different drawing approaches for different categories of line slope.
I drew six lines to test the correctness of the code: slanted up, mostly horizontal; slanted down,
mostly horizontal; slanted right, mostly verticle; slanted left, mostly vertical, purely vertical;
and purely horizontal. These six types of lines all require slightly different algorithms to draw.
There is also a human factors component to drawing lines. They have to look like proper lines to us. This influences how line drawing algorithms place pixels.
Javascript is a dynamically typed language, meaning that it chooses the type for a variable based on context and what data is stored in that variable. In this example program, it mostly seems to do the right thing. So, I haven't had to add code to round off floating point numbers to integers, etc, but as I develop more examples, this will come up.
Another comment, on an earlier hub about learning programming on your own, suggested that I needed to intruduce concepts in an orderly squence and build upon the basics in order to provide an accessable tutorial. I may be lazy about this. The point is well taken, but it also missinterprets my intention, somewhat. There are lots of good tutorials already on the net. I am not trying to supplant them, just give some pointers that someone might want to research on their own.
I remember a professor once asked his class, "Who thinks you're here to learn from me?". We all raised our hands. He responded, "You're wrong. If everyone just learns from someone else, the end result would be eventual ignorance, because the transmition of knowlegde is imperfect. You are here to learn things that I don't know."
There may be some applications for drawing lines in Javascript in the way that my example program does, but that is not my main intent. I hope it is simply fun and interesting to someone else. I
I plan to build some more complex examples from this line drawing example, later.
line drawing code example
<html> <head> <style type="text/css" > .whiterectangle { color: white; background-color: white; z-index: 0;} .blackrectangle { color: black; background-color: black; z-index: 1;} </style> <script type="text/javascript" > function drawrectangle( myclass, top, left, width, height ) { var bodylist = document.getElementsByTagName( "body" ); var rect = document.createElement( "div" ); var mystyle = 'position:absolute;top:' + top + ";left:" + left + ';width:' + width + ";height:" + height; rect.setAttribute( "class", myclass ); rect.setAttribute( "style", mystyle ); bodylist[0].appendChild( rect ); } function drawline( width, x1, y1, x2, y2 ) { var x, y, nexty, nextx; // ensure x1, y1 is leftmost point if( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; tmp = y2; y2 = y1; y1 = tmp; } var dx = x2 - x1; var dy = y2 - y1; if( dy == 0 ) { // horizontal line drawrectangle( "blackrectangle", y1 - width / 2, x1, dx, width ); return; } else if ( dx == 0 ) { // vertical line drawrectangle( "blackrectangle", y1, x1 - width / 2, width, dy ); return; } var slope = dy / dx; if( slope > 1 || slope < -1 ) { // one x per multiple y if( y1 < y2 ) { y = y1; for( x = x1 ; x < x2 ; x += 1 ) { nexty = y + slope; drawrectangle( "blackrectangle", y, x - width / 2, width, nexty - y ); y = nexty; } } else { y = y1; for( x = x1 ; x < x2 ; x += 1 ) { nexty = y + slope; drawrectangle( "blackrectangle", nexty, x - width / 2, width, y - nexty ); y = nexty; } } } else { // one y per multiple x if( y1 < y2 ){ x = x1; for( y = y1 ; y < y2 ; y += 1 ) { nextx = x + 1 / slope; drawrectangle( "blackrectangle", y + width / 2, x, nextx - x, width ); x = nextx; } } else { x = x2; for( y = y2 ; y < y1 ; y += 1 ) { nextx = x + 1 / slope; drawrectangle( "blackrectangle", y - width / 2, nextx, x - nextx, width ); x = nextx; } } } } </script> </head> <body> <script type="text/javascript" > drawrectangle( "whiterectangle", 0, 0, "100%", "100%" ); // make a background rectangle, not necessary with default browser settings drawline( 4, 110, 50, 400, 60 ); drawline( 4, 110, 50, 120, 100 ); drawline( 4, 110, 50, 100, 100 ); drawline( 4, 110, 50, 400, 40 ); drawline( 4, 500, 50, 500, 100 ); drawline( 4, 475, 75, 525, 75 ); </script> </body> </html>
Screen view of the sample code in action
links to other hubs in this series
- Learning to Program Computers on Your Own
<script type="text/javascript" > alert( "Hello Javascript World!" ); </script> screen-shot of firebug Firebug Open source project site for Firebug. I know you have Javascript available to you,... - Drawing a Rectangle in Javascript - part 1 in a series
Computer programming constantly uses encapsulation; someone else figures out how to do something, and you just use it without having to worry about the details. Functions are one mechanism for encapsulation,...