X1: Y1:
X2: Y2:
Algorithm
<!DOCTYPE html> <html> <head> <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> <script type="text/javascript" src="lineCanvas.js"> </script> </head> <body> <h1>Drawing Lines</h1> <script> var canvas1 = new lineCanvas(300, 300); canvas1.Redisplay(); </script> <p> X1: <input type="text" maxLength = "3" size = "3" id="x1", onchange="canvas1.SetVar('x1')"> Y1: <input type="text" maxLength = "3" size = "3" id="y1", onchange="canvas1.SetVar('y1')"> <p> X2: <input type="text" maxLength = "3" size = "3" id="x2", onchange="canvas1.SetVar('x2')"> Y2: <input type="text" maxLength = "3" size = "3" id="y2", onchange="canvas1.SetVar('y2')"> <p> <script> canvas1.FixInterface(); </script> Algorithm <select id="algo" onchange="canvas1.SetAlgorithm(this.value); canvas1.Redisplay()"> <option value="0">Brute Force</option> <option value="1">DDA</option> <option value="2">Bresenham's</option> </select> <p> <button type="button" id="Redraw" onclick="canvas1.Redisplay()">Redraw</button> </pre>lineCanvas.js
var BRUTE = '0'; var DDA = '1'; var BRESSENHAMS = '2'; function lineCanvas(width, height, locID) { if (width == undefined || width < 0) { width = 300; } if (height == undefined || height < 0) { height = 300; } var canvas = document.createElement('canvas') canvas.height = height; canvas.width = width; if(locID == undefined) { document.body.appendChild(canvas); } else { div = document.getElementById(locID); if (null == div) { document.body.appendChild(canvas); } else { div.appendChild(canvas); } } document.body.appendChild(canvas); this.width = width; this.height = height; this.clearColor = "#ffffff"; this.ctx = canvas.getContext("2d"); this.x1 = Math.floor(this.width * .1); this.y1 = Math.floor(this.height * .1); this.x2 = Math.floor(this.width * .9); this.y2 = Math.floor(this.height * .9); this.algorithm = BRUTE; return this; } lineCanvas.prototype = { SetClearColor: function(color) { this.clearColor = color; return; }, Clear: function() { this.ctx.fillStyle=this.clearColor; this.ctx.fillRect(0,0,this.width,this.height); return; }, SetVar: function(id) { var node = document.getElementById(id); var value = parseInt(node.value); if (id == "x1") { this.x1= Clamp(0, this.width, value); } else if (id == "x2") { this.x2= Clamp(0, this.width, value); } else if (id == "y1") { this.y1= Clamp(0, this.height, value); } else if (id == "y2") { this.y2= Clamp(0, this.height, value); } this.FixPoints(); this.FixInterface(); }, FixPoints: function() { if (this.x1 > this.x2) { t = this.x1; this.x1 = this.x2; this.x2 = t; t = this.y1; this.y1 = this.y2; this.y2 = t; } return; }, FixInterface: function() { var node; node = document.getElementById("x1"); node.value = this.x1; node = document.getElementById("x2"); node.value = this.x2; node = document.getElementById("y1"); node.value = this.y1; node = document.getElementById("y2"); node.value = this.y2; }, SetAlgorithm: function(algorithm) { this.algorithm = algorithm; return; }, PlotPoint: function(x,y) { y = this.height-y; this.ctx.fillStyle="#ff0000"; this.ctx.fillRect(x,y,2,2); }, BruteForce: function() { var x,y; var m; if (this.x1 == this.x2) { console.log(Math.min(this.y1, this.y2), Math.max(this.y1,this.y2)); for(y =Math.min(this.y1, this.y2); y <= Math.max(this.y1,this.y2) ; y++) { this.PlotPoint(this.x1, y); } } else { m = (this.y1-this.y2)/(this.x1-this.x2) } for(x=this.x1; x<=this.x2; x++) { y = Math.round(this.y1 + m * (x-this.x1)); this.PlotPoint(x,y); } return; }, DDALine: function() { var dx, dy; var x,y; var ys, ye; var m; dx = this.x2-this.x1; dy = this.y2-this.y1; if (dx == 0) { ys = Math.min(this.y1, this.y2); ye = Math.max(this.y1, this.y2); for(y=ys; y <= ye; y++) { this.PlotPoint(this.x1,y); } } if (Math.abs(dx) >= Math.abs(dy)) { y = this.y1; for(x=this.x1;x<= this.x2;x++) { this.PlotPoint(x,y); y = y+dy/dx; } } else { if (this.y1 < this.y2) { x = this.x1; ys = this.y1; ye = this.y2; m = dx/dy; } else { x = this.x2; ys = this.y2; ye = this.y1; m = -dx/dy; } for(y = ys; y <= ye; y++) { this.PlotPoint(Math.round(x),y); x = x+m; } } return; }, Bresenhams() { var dx, dy, d; var x,y; dy = this.y2-this.y1; dx = this.x2-this.x1; if (dy > dx || dy<0) { console.log("Bresenham's only implemented for slope between 0 and 1"); return; } d = 0 y = this.y1; A = -2 * dx; B = 2 * dy; for(x = this.x1; x <= this.x2; x++) { this.PlotPoint(x,y); if (d >= 0) { d += A; y++; } d += B; } return; }, Redisplay: function() { this.Clear(); switch (this.algorithm) { case BRUTE: this.BruteForce(); break; case DDA: this.DDALine(); break; case BRESSENHAMS: this.Bresenhams(); break; default: console.log("Unknown alogorithm", this.algorithm); } return; } }; function Clamp(low, high, value) { if (value < low) { value = low; } if (value > high) { value = high; } return value; }