I am writing a simple geometry editor (i.e., user can create, move and deform
circles and
polygons). I am *not* adding geometric shapes to display list. Instead, I am
managing
them myself. (This may be a bad idea, but doesn't really affect my overall
question.)
Here is a method that is defined on my Polygon class. I would like to know why
it returns
true when (x, y) is on top of a polygon and shapeFlag is false -- but returns
false when (x,
y) is on top of a polygon and shapeFlag is true.
override public function containsPoint(x:Number,
y:Number):Boolean
{
var shapeFlag:Boolean = false;
var testShape:Shape = new Shape();
testShape.graphics.beginFill(0x0000FF, 1.0);
testShape.graphics.lineStyle(1.0, 0x0000FF, 1.0);
this.renderInteractionShape(testShape.graphics);
testShape.graphics.endFill();
return ((testShape == null) ? false :
testShape.hitTestPoint(x, y, shapeFlag));
}
With shapeFlag = false, any points in the polygon's bounding rectangle will
cuse
containsPoint() to return true. I need to deal with non-rectangular shapes and
rotated
rectangles.
Performance is important, so generating and regenerating bitmaps would be
suboptimal.
Then again, if that is part of the solution, then I could cache bitmaps of
unmoved shapes.
Here's Polygon.renderInteractionShape() for completeness. The MPPoint class
wraps a
point and provides some UI.
override public function
renderInteractionShape(graphics:Graphics):void
{
var scale:Number = drawing.getScale();
var pt:MPPoint = _vertices[0];
graphics.moveTo(pt.x * scale, pt.y * scale);
for (var i:int = 1; i < _numSides; i++)
{
pt = _vertices[i];
graphics.lineTo(pt.x * scale, pt.y * scale);
}
// close up the polygon.
pt = _vertices[0];
graphics.lineTo(pt.x * scale, pt.y * scale);
}
Thanks in advance,
-ec