Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОУК / 09 семестр / Книги и методические указания / Руководство программиста в Photon.doc
Источник:
Скачиваний:
364
Добавлен:
04.03.2014
Размер:
7.99 Mб
Скачать

Перекрытие многоугольников

Многоугольники, которые чем-то перекрываются, заполняются с использованием так называемого правила чёт-нечет: если область пересекается чётное количество раз, она не заполнена. Чтобы понять это, давайте нарисуем горизонтальную линию, пересекающую многоугольник. Когда Вы идёте вдоль этой линии и пересекаете первую линию, Вы оказываетесь внутри многоугольника; пересекая вторую линию – выходите наружу. В качестве примера рассмотрим простой многоугольник:

Заполнение простого многоугольника

Это правило можно расширить на более сложные многоугольники:

  • Когда Вы пересекаете нечётное число линий, Вы находитесь внутри многоугольника, так что область заполнена.

  • Когда Вы пересекаете чётное число линий, Вы находитесь вне многоугольника, так что область не заполнена.

Заполнение перекрывающися многоугольников

 Правило чёт-нечет применимо и к функции PgDrawPoligon() и к PgDrawPoligonmx().

Дуги, круги, хорды и сектора

Функция PgDrawArd() может использоваться для рисования:

  • дуг

  • кругов

  • эллипсов

  • эллиптических дуг

  • сегментов

  • секторов

Чтобы нарисовать эллипс, можно также вызвать функцию PgDrawEllipse(). Начальный и конечный углы сегмента дуги задаются в бинарных градусах (bi-grads) – полный круг соответствует 65536 бинарным градусам (0х10000).

Чтобы нарисовать полный круг или эллипс, задайте одно и то же значение в бинарных градусах для начальнго и конечного углов. Например:

void DrawFullCurves( void ) {

PhPoint_t circle_center = { 150, 150 }, ellipse_center = { 150, 300 };

PhPoint_t circle_radii = { 100, 100 }, ellipse_radii = { 100, 50 };

/* Рисование белого, незаполненного круга. */

PgSetStrokeColor( Pg_WHITE );

PgDrawArc( &circle_center, &circle_radii, 0, 0, Pg_DRAW_STROKE | Pg_ARC );

/* Рисование чёрного эллипса с белым контуром. */

PgSetFillColor( Pg_BLACK );

PgDrawArc( &ellipse_center, &ellipse_radii, 0, 0, Pg_DRAW_FILL_STROKE | Pg_ARC );

}

Чтобы нарисовать сегмент (кривую, у которой крайние точки соединены прямой линией), добавьте к параметру flags значение Pg_ARC_CHORD. Например:

void DrawChord( void ) {

PhPoint_t center = { 150, 150 };

PhPoint_t radii = { 100, 50 };

/* Рисование чёрного эллиптического сегмента с белым контуром.

Дуга рисуется от 0 градусов до 45градусов (0x2000 биградусов). */

PgSetStrokeColor( Pg_WHITE );

PgSetFillColor( Pg_BLACK );

PgDrawArc( &center, &radii, 0, 0x2000, Pg_DRAW_FILL_STROKE | Pg_ARC_CHORD );

}

Сходным образом, чтобы нарисовать сектор или дугу, добавьте к flags значения Pg_ARC_PIE или Pg_ARC. Например:

void DrawPieCurve( void ) {

PhPoint_t pie_center = { 150, 150 },

arc_center = { 150, 300 };

PhPoint_t pie_radii = { 100, 50 },

arc_radii = { 50, 100 };

/* Рисование чёрного эллиптического сектора с белым контуром. */

PgSetStrokeColor( Pg_WHITE );

PgSetFillColor( Pg_BLACK );

PgDrawArc( &pie_center, &pie_radii, 0, 0x2000, Pg_DRAW_FILL_STROKE | Pg_ARC_PIE );

/* Рисование чёрной дуги. */

PgSetStrokeColor( Pg_BLACK );

PgDrawArc( &arc_center, &arc_radii, 0, 0x2000, Pg_DRAW_STROKE | Pg_ARC );

}

Заполненные и очерченные дуги