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

Six lines to test the six different cases.
Six lines to test the six different cases.

More by this Author


Comments

No comments yet.

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working