GDI + FillPolygon включает левый и верхний контур? - PullRequest
0 голосов
/ 07 мая 2020

У меня была трапеция, созданная с использованием функции GDI + FillPolygon(), но оказалось, что она была на 1 пиксель справа и снизу. Я предположил, что вы пропустили точки области, которую нужно заполнить, но при более внимательном чтении говорится, что он заполняет внутреннюю часть многоугольника, который бы получился, поскольку, если бы он это сделал. На самом деле я обнаружил, что функция заполнения включает левый и верхний (x, y), но не правый и нижний (x, y). Чтобы упростить задачу, говоря в терминах прямоугольника, при заливке (0,0) - (10,10) область заливки будет (0,0) - (9,9). Я бы ожидал, что это будет либо (0,0) - (10,10), либо (1,1) - (9,9). В конце концов, все заданные точки - это x, y. Итак, мой вопрос, это дизайн? почему не задокументировано? или я что-то упускаю?

TIA !!

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Я не могу воспроизвести вашу проблему, см. Снимок экрана ниже:

enter image description here

Код:

Graphics graphics(hdc);
SolidBrush solidBrush(Color(255, 255, 0, 0));           
Point point1 = Point(0, 0);
Point point2 = Point(0, 10);
Point point3 = Point(10, 10);
Point point4 = Point(10, 0);
Point points[4] = {point1,point2,point3,point4};
graphics.FillPolygon(&solidBrush, points, 4);

Если есть Если в вашем коде есть какие-либо отличия, добавьте свой код и снимок экрана в вопрос.

Обновлено:

Я добавляю новый снимок экрана, чтобы исследовать этот вопрос:

2

Ширина / высота должны быть 9, если область внутри 0/10 (1-9), или 11, если включены точки x, y, заданные 0 / 10 (0-10).

Нет, ширина и высота должны быть 10 пикселей. Если вы имеете в виду DrawRectangle, область должна быть 9x9 пикселей, исключая 1 пиксельное перо.

Если вы используете Rectangle, область должна быть 8x8 пикселей, исключая 1 пиксельное перо.

Тестовый код :

      Pen blackPen(Color(255, 0, 0, 0), 1);  //1 pixel
      g->DrawRectangle(&blackPen, 0, 24, 10, 10); //10x10

      Rectangle(hdc, 0, 36, 10, 46);  // 10x10

      RECT rect;
      rect.left = 0;            
      rect.top = 12;
      rect.right = 10;
      rect.bottom = 22;
      FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 3)); //10x10
1 голос
/ 07 мая 2020

По крайней мере, для прямоугольников такое поведение задокументировано в (Рисование прямоугольников) [https://docs.microsoft.com/en-us/windows/win32/gdi/drawing-rectangles] . Это поведение похоже на то, как работают линии (нарисованные с помощью LineTo), где исходная точка включена, но исключена цель. Я не знаю, изменяет ли изменение, задокументированное с помощью SetWorldTransform, способ рисования отдельных линий.

...