package { import flash.display.BitmapData; import flash.display.SimpleButton; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.KeyboardEvent; import flash.display.Bitmap; import flash.geom.Rectangle; public class Main extends Sprite { private var xStart : int, yStart : int; public function Main():void { xStart = -1; drawGrid(); if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.addEventListener(MouseEvent.MOUSE_DOWN, lineDrawStart); } private function drawGrid() : void { graphics.clear(); graphics.lineStyle(1, 0); for (var i : int = 0; i <= 30; ++i ) { graphics.moveTo(10 * i, 0); graphics.lineTo(10*i, 300); graphics.moveTo(0, 10 * i); graphics.lineTo(300, 10*i); } graphics.lineStyle(1, 0x00ff0000); graphics.moveTo(100, 0); graphics.lineTo(100, 300); graphics.moveTo(200, 0); graphics.lineTo(200, 300); graphics.moveTo(0, 100); graphics.lineTo(300, 100); graphics.moveTo(0, 200); graphics.lineTo(300, 200); graphics.lineStyle(1, 0); } private function lineDrawStart(e : MouseEvent) : void { if(xStart < 0) { xStart = e.stageX/10; yStart = e.stageY / 10; } else { drawLine(xStart, yStart, e.stageX/10, e.stageY/10); xStart = -1; } } private function mySetPixel(x : int, y : int) : void { graphics.beginFill(0x0); graphics.drawRect(x * 10, y * 10, 10, 10); graphics.endFill(); } /***************************************** Bresenham's line algorithm begins here ******************************************/ private function drawLine(x1 : int, y1 : int, x2 : int, y2 : int) : void { var dx : int = Math.abs((x2 - x1)<<1), dy : int = Math.abs((y2 - y1)<<1); var x : int = x1, y : int = y1; var error : int; if (dx > dy) { // step 1 in x direction if (x2 < x1) { // if x2 < x1 then swap line's end points -> x2 > x1 drawLine(x2, y2, x1, y1); } else { error = dx >> 1; var smery : int; if (y2 > y1) smery = 1; else smery = -1; while (x <= x2) { mySetPixel(x, y); error -= dy; if (error < 0) { error += dx; y += smery; } ++x; } } } else { // step 1 in y direction if (y2 < y1) { // if y2 < y1 then swap line's end points -> y2 > y1 drawLine(x2, y2, x1, y1); } else { error = dy >> 1; var smerx : int; if (x2 > x1) smerx = 1; else smerx = -1; while (y <= y2) { mySetPixel(x, y); error -= dx; if (error < 0) { error += dy; x += smerx; } ++y; } } } } } }