В литературе различают четырехсвязные и восьмисвязные затравочные алгоритмы [7]. В четырехсвязном алгоритме проверяются четыре соседние точки, а в восьмисвязном проверяются и точки, располагающиеся по диагонали. Судя по тому, что на рис. 13.3 заливка не просочилась сквозь границы, в GDI реализован четырехсвязный алгоритм. Проект с демонстрацией вывода графических примитивов находится в папке Primitivs.

Точки Функция рисования точки выглядит довольно просто: C0L0RREF SetPixel(HDC hdc.int X.int Y. C0L0RREF Cvet)

В качестве параметров этой функции передаются ее координаты и цвет. В цветовых режимах с использованием палитр или при цветовой глубине в 16 бит Точки

не всегда можно точно отобразить цвет, заданный трехбайтовым параметром Cvet. Поэтому функция возвращает в действительности записанный цвет точки. Код цвета занимает только три младших байта в возвращаемом 32-разрядном числе и поэтому никогда не может быть отрицательным. Если функция возвращает значение -1, это свидетельствует о возникновении ошибки. Ошибка может возникнуть при отрисовке графического содержимого за пределами рабочей области окна (точнее, вне области отсечения).

Более быстрая функция отличается тем, что не возвращает фактически установленный цвет:

BOOL SetPixelV(HDC hdc.int X.int Y, COLORREF Cvet)

Если необходимо прочитать цвет точки с заданными координатами, можно воспользоваться следующей функцией: COLORREF GetPixeKHDC hdc.int X.int Y)

В следующем примере показывается, как при помощи функции SetPi xel () можно реализовать рассмотренный выше примитив PolyBeziег(). Применяя приведенное в [8] общее выражение, описывающее кривые, построенные из п опорных точек, можно получить параметрическое уравнение кривой для четырех точек. Коэффициенты при координатах опорных точек получаются из бинома Ньютона, примененного к выражению ((1-1) + t)n~ \ как показано ниже:

x(t) = (1 - ЬУХЛ 3*(1 - 02*,-+1 + 3*2(1 - t)Xt + 2 + З^Х+3;

y(t) = (1 - tf Y. + 3t(\ - ty Y+, + 3*2(1 - t)Y+2 + 3? У.+3.

При t = 0 в данных выражениях только первое слагаемое отличается от нуля, поэтому лг(0) = Х„ а у(0) = Y{. При t = 1 кривая проходит через последнюю опорную точку (х( 1) = Xi+3, у( 1) = Yi+3). Для использования целочисленного аргумента t нужно разделить правую часть на куб постоянного коэффициента MaxXY. Тогда при рисовании кривой параметр t будет пробегать целочисленные значения от 0 до MaxXY. Чтобы получилась непрерывная линия, этот коэффициент можно выбрать равным большему из размеров прямоугольника, описанного вокруг опорных точек.


⇐ Предыдущая| |Следующая ⇒