Skip to main content

Hit test on Graphics2D object?



I have a few Graphics2D objects (Line2D, Rectangle2D, Ellipse2D, Rectangle2D) and a GeneralPath. I know that if I want to hit test on them I could use the .contains(Point) method, but I need to hit test on these objects when they are not filled in. So I just want to test if the user clicked on their border/line. I don't need to worry about the thickness of the border for now. Let's say that I just need to worry if the user clicked within 10 pixels from the border/line.





I do have a MouseListener where I can get the coordinates of the mouse click, and my Graphics2D objects are stored on a data structure that I iterate over. I just don't know how to hit test on the lines/borders.





Any suggestions will be appreciated!


Comments

  1. I've never had cause to use it, but it looks like your best bet is the Graphics2D.hit() method here.

    Just use a 1px*1px rectangle at the mouse position, and set the onStroke parameter to true, and make sure that the Clip, Transform, and Stroke properties are set up correctly (as mentioned in the javadoc) before you do the call.

    ReplyDelete
  2. Here's what I'd do:

    Ellipse2D case:
    Each time you want to see if your mouse has touched the edge of an Ellipse2D, create an Ellipse2D that is slightly bigger than the original, and an Ellipse2D that is slightly smaller. If your mouse click point is inside the larger Ellipse2D but outside the smaller one, then you've clicked "close" to the edge of the original shape.

    Rectangle2D case:
    Solve this the same way you do the Ellipse2D - make one bigger, one smaller, and determine if your mouse is inside the bigger one but outside the smaller one.

    Line2D case:
    Create a Rectangle2D that encloses your Line2D by some predetermined width. Then see if your mouse is inside that Rectangle2D.

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?