Question

Given I have a canvas that contains many shapes, lets say rectangles for now.

Each shape has a location (inches), size(inches) and rotation angle(degrees).

When a mouse click event happen inside the canvas for a location (x,y) in pixels.

I want to check if the clicked mouse position is inside/within a specific shape, considering the rotation angle and measurement unit conversion.

Can you help?

Was it helpful?

Solution 2

I found the answer (I have to convert al measurements to pixels to make sure it will calculate correctly):

public static bool HitTest(Rectangle bounds, float angle, Point location)
        {
            if (angle == 0) return bounds.Contains(location);

            using (Matrix matrix = new Matrix())
            {
                matrix.RotateAt(angle, Center(bounds));
                using (GraphicsPath path = new GraphicsPath())
                {
                    path.AddRectangle(bounds);
                    path.Transform(matrix);
                    return path.IsVisible(location.X, location.Y);
                }
            }
        }

OTHER TIPS

Your question is awfully short on details, I can only provide a generic answer. Do it mathematically is the fastest way. Rotation can make that difficult.

You can solve it slowly but easily by using a hit-test bitmap. Render the shapes to a Bitmap, using the same code you now use to render it to the screen. But now using a color that encodes the shape number. Hit testing is now simple and quick with GetPixel(). Be careful to turn off image enhancement settings, like anti-aliasing. Render it to the screen first and take a good look at the pixels with ZoomIt.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top