Как выполнить тестирование Hit в GDI + для повернутых фигур с измерениями реальных фигур (в дюймах)? - PullRequest
4 голосов
/ 13 января 2009

Учитывая, что у меня есть холст, который содержит много фигур, давайте скажем прямоугольники на данный момент.

Каждая фигура имеет местоположение (дюймы), размер (дюймы) и угол поворота (градусы).

Когда событие щелчка мыши происходит внутри холста для местоположения (x, y) в пикселях.

Я хочу проверить, находится ли позиция нажатой мыши внутри / в пределах определенной формы, учитывая угол поворота и преобразование единиц измерения.

Вы можете помочь?

Ответы [ 2 ]

4 голосов
/ 13 января 2009

В вашем вопросе очень мало деталей, я могу дать только общий ответ. Сделать это математически - это самый быстрый способ. Вращение может сделать это трудным.

Вы можете решить эту проблему медленно, но легко, используя растровое изображение для проверки попадания. Визуализируйте фигуры в растровое изображение, используя тот же код, который вы сейчас используете, чтобы отобразить его на экране. Но теперь, используя цвет, который кодирует номер формы. Тестирование попаданий теперь просто и быстро с GetPixel (). Будьте внимательны, чтобы отключить настройки улучшения изображения, например сглаживание. Сначала отрендерите его на экран и посмотрите на пиксели с помощью ZoomIt.

3 голосов
/ 18 января 2009

Я нашел ответ (я должен преобразовать все измерения в пиксели, чтобы убедиться, что он будет правильно рассчитан):

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);
                }
            }
        }
...