C # - Как получить область System.Drawing.Region? - PullRequest
1 голос
/ 11 декабря 2010

Я вычисляю площадь прямоугольника после исключения площади некоторых кругов.это мое текущее решение:

    var region = new Region( new Rectangle(0, 0, 10, 10) );
    var circle = new System.Drawing.Drawing2D.GraphicsPath();
    circle.AddEllipse(50, 50, 25, 25);
    // Exclude the circle from the region.
    region.Exclude(circle);

Однако мне нужно что-то вроде region.getArea (), чтобы получить площадь после исключения круга.

Вы знаете, как вычислитьОбласть System.Drawing.Region?

-Or-

Вы знаете другой способ вычисления области прямоугольника после исключения некоторых кругов?

Ответы [ 2 ]

4 голосов
/ 11 декабря 2010
        float diam = 25;
        var region = new Region(new RectangleF(0, 0, diam, diam));
        var circle = new System.Drawing.Drawing2D.GraphicsPath();
        circle.AddEllipse(0, 0, diam, diam);
        region.Exclude(circle);

        var rects = region.GetRegionScans(new System.Drawing.Drawing2D.Matrix());
        float area = 0;
        foreach (var rc in rects) area += rc.Width * rc.Height;
        double realArea = diam * diam - Math.PI * diam * diam / 4;
        Console.WriteLine("Approx area = {0}, real area = {1}", area, realArea);

Вывод: Приблизительная площадь = 141, реальная площадь = 134.126147876595

Помните об этом результате, класс Region был разработан для использования в графическом коде. Точность накопления ошибок округляется только для пикселя с ловкостью. Чем больше вы сделаете диаметр , тем меньше относительная погрешность.

3 голосов
/ 11 декабря 2010

Нет никакого способа сделать это, но я думаю, что функция GetRegionData вернет вам RegionData, чей Data является байтом [], который соответствует структуре RGNDATA из C ++. Там у вас есть заголовок со списком прямоугольников, которые не перекрываются. Расчет площади будет простым циклом for в этой точке.

Если область полностью вас интересует, и вы не планируете использовать область для рисования, то это, вероятно, излишество. Код может быть простым, но вы будете использовать больше памяти и компьютерных ресурсов для вычисления значения.

Решение этого «математического» способа может включать множество особых случаев, но как только вы решите код пересечения линии-круга, это не должно быть слишком плохо и, вероятно, будет быстрее, чем все выделение памяти для контекста RegionData и DC .

...