Skip to content

Instantly share code, notes, and snippets.

Created March 15, 2012 00:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/2040733 to your computer and use it in GitHub Desktop.
Save anonymous/2040733 to your computer and use it in GitHub Desktop.
Finding the triangle containing a point
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