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

Reply via email to