Created
March 15, 2012 00:36
-
-
Save anonymous/2040733 to your computer and use it in GitHub Desktop.
Finding the triangle containing a point
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ; | |
import flash.display.Sprite; | |
import flash.display.Stage; | |
import flash.display.StageAlign; | |
import flash.display.StageScaleMode; | |
import flash.events.Event; | |
import flash.Lib; | |
/** | |
* ... | |
* @author William Bundy | |
*/ | |
class Main | |
{ | |
static var stage:Stage; | |
static function main() | |
{ | |
stage = Lib.current.stage; | |
stage.scaleMode = StageScaleMode.NO_SCALE; | |
stage.align = StageAlign.TOP_LEFT; | |
// entry point | |
createBox(16, 16, 256, 64); | |
createBox(16, 96, 64, 256); | |
} | |
static function createBox(offsetX:Float, offsetY:Float, width:Int, height:Int):Void | |
{ | |
var box:Sprite = new Sprite(); | |
var lineThickness:Float = 2.0; | |
var lineDefaultColor:Int = 0; | |
var lineClosestColor:Int = 0x00CC00; | |
var boxwidth:Int = width; | |
var boxheight:Int = height; | |
var boxOffsetX:Float = offsetX; | |
var boxOffsetY:Float = offsetY; | |
stage.addChild(box); | |
var closest:Int = 0; // top=0, right=1, bottom=2, left=3, for the sides | |
stage.addEventListener(Event.ENTER_FRAME, function(e:Event):Void | |
{ | |
var mx:Float = stage.mouseX; | |
var my:Float = stage.mouseY; | |
//See if the pointer is inside the box | |
// x1 x2 y1 y2 | |
if (mx > boxOffsetX && mx < boxOffsetX + boxwidth && my > boxOffsetY && my < boxOffsetY + boxheight) | |
{ | |
var ratio:Float = boxwidth / boxheight; | |
// x1 | |
var distLeft:Float = mx - boxOffsetX; | |
// x2 | |
var distRight:Float = (boxwidth + boxOffsetX) - mx; | |
if (ratio > 1) | |
{ | |
distLeft /= ratio; | |
distRight /= ratio; | |
} | |
var minHorizDist:Float = Math.min(distLeft, distRight); | |
// y1 | |
var distTop:Float = my - boxOffsetY; | |
// y2 | |
var distBottom:Float = (boxOffsetY + boxheight) - my; | |
if (ratio < 1) | |
{ | |
distTop *= ratio; | |
distBottom *= ratio; | |
} | |
var minVertDist:Float = Math.min(distTop, distBottom); | |
var minDist:Float = Math.min(minHorizDist, minVertDist); | |
switch(minDist) | |
{ | |
case distLeft: | |
closest = 3; | |
case distRight: | |
closest = 1; | |
case distTop: | |
closest = 0; | |
case distBottom: | |
closest = 2; | |
} | |
} | |
else | |
{ | |
//if the pointer is outside the box | |
closest = -1; | |
} | |
box.graphics.clear(); | |
//top | |
if (closest == 0) | |
box.graphics.lineStyle(lineThickness, lineClosestColor); | |
else | |
box.graphics.lineStyle(lineThickness, lineDefaultColor); | |
box.graphics.moveTo(boxOffsetX, boxOffsetY); | |
box.graphics.lineTo(boxOffsetX + boxwidth, boxOffsetY); | |
//right | |
if (closest == 1) | |
box.graphics.lineStyle(lineThickness, lineClosestColor); | |
else | |
box.graphics.lineStyle(lineThickness, lineDefaultColor); | |
box.graphics.lineTo(boxOffsetX + boxwidth, boxOffsetY + boxheight); | |
//bottom | |
if (closest == 2) | |
box.graphics.lineStyle(lineThickness, lineClosestColor); | |
else | |
box.graphics.lineStyle(lineThickness, lineDefaultColor); | |
box.graphics.lineTo(boxOffsetX, boxOffsetY + boxheight); | |
//down | |
if (closest == 3) | |
box.graphics.lineStyle(lineThickness, lineClosestColor); | |
else | |
box.graphics.lineStyle(lineThickness, lineDefaultColor); | |
box.graphics.lineTo(boxOffsetX, boxOffsetY); | |
box.graphics.lineStyle(lineThickness, lineDefaultColor); | |
box.graphics.lineTo(boxOffsetX + boxwidth, boxOffsetY + boxheight); | |
box.graphics.moveTo(boxOffsetX + boxwidth, boxOffsetY); | |
box.graphics.lineTo(boxOffsetX, boxOffsetY + boxheight); | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment