Руководство программиста в Photon (953920), страница 47
Текст из файла (страница 47)
Функция PgDrawRect() использует структуру PhRect_t (см. "Справочник библиотечных функций Photon'а" для координат прямоугольника, тогда как PgDrawIRect() позволяет Вам задавать координаты отдельно. Используйте тот метод, который хотите.
В следующем примере рисуется прямоугольник, который заполнен, но не очерчен (т.е. он не имеет контура):
void DrawFillRect( void ) {
PgSetFillColor( Pg_CYAN );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_FILL );
}
Если хотите, можете вместо этого использовать функцию PgDrawRect():
void DrawFillRect( void ) {
PhRect_t rect = { {8, 8}, {152, 112} };
PgSetFillColor( Pg_CYAN );
PgDrawRect( &rect, Pg_DRAW_FILL );
}
В следующем примере рисуется оконтуренный незаполненный прямоугольник:
void DrawStrokeRect( void ) {
PgSetStrokeColor( Pg_BLACK );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_STROKE );
}
А здесь рисуется оконтуренный заполненный прямоугольник:
void DrawFillStrokeRect( void ) {
PgSetFillColor( Pg_CYAN );
PgSetStrokeColor( Pg_BLACK );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_FILL_STROKE );
}
Заполненные и оконтуренные прямоугольники
Прямоугольники со скруглёнными углами
Прямоугольники со скруглёнными углами программируются почти таким же образом, что и прямоугольники – простым вызовом PgDrawRoundRect() с параметром PhPoint_t, указывающим в пикселях скругления углов прямоугольника.
В следующем примере рисуется чёрный скругленный прямоугольник с скруглениями углов в пять пикселей:
void DrawStrokeRoundRect( void ) {
PhRect_t rect = { {20, 20}, {100, 100} };
PhPoint_t radii = { 5, 5 };
PgSetStrokeColor( Pg_BLACK );
PgDrawRoundRect( &rect, &radii, Pg_DRAW_STROKE );
}
Прямоугольники с фасками, прямоугольники и стрелки
Функция PgDrawBevelBox() рисует прямоугольник с фасками, который представляет из себя особый тип прямоугольника:
-
Если Вы устанавливаете Pg_DRAW_FILL или Pg_DRAW_FILL_STROKE в аргументе flags, область прямоугольника с фасками будет заполнена в соответствии с текущими атрибутами заполнения.
-
Если Вы устанавливаете Pg_DRAW_STROKE или Pg_DRAW_FILL_STROKE в flags, верхний и левый края рисуются в соответствии с текущими атрибутами черты, а нижний и правый [в оригинале – left, а не right, что IMHO опечатка – Прим. пер.] края рисуются дополнительным цветом, передаваемым в качестве одного из параметров.
-
Имеется также параметр, позволяющий Вам установить "глубину" фаски.
Этот код рисует тёмно-серый прямоугольник с зелёными и красными фасками шириной в четыре пикселя:
void DrawBevelBox( void ) {
PhRect_t r = { 8, 8, 152, 112 };
PgSetFillColor( Pg_DGREY );
PgSetStrokeColor( Pg_RED );
PgDrawBevelBox( &r, Pg_GREEN, 4, Pg_DRAW_FILL_STROKE );
}
Прямоугольник с фасками
Вы можете вызвать функцию PgDrawBeveled(), чтобы нарисовать прямоугольник с фасками (как возможность – со срезанными или скруглёнными углами) или стрелку с фасками. Если Вы рисуете прямоугольник с прямыми углами, результат будет тем же, что и в случае PgDrawBevelBox(). Вот код, рисующий прямоугольники со срезанными и скруглёнными углами и набор стрелок:
void DrawBeveled() {
PhRect_t clipped_rect = { {10, 10}, {150, 62} };
PhRect_t rounded_rect = { {10, 67}, {150, 119} };
PhPoint_t clipping = { 8, 8 };
PhPoint_t rounding = { 12, 12 };
PhRect_t rup = { {190, 20}, {230, 40} };
PhRect_t rdown = { {190, 90}, {230, 110} };
PhRect_t rleft = { {165, 45}, {185, 85} };
PhRect_t rright = { {235, 45}, {255, 85} };
/* Рисуются прямоугольники с фасками: один со срезанными,
другой со скруглёнными углами. */
PgSetFillColor( Pg_GREEN );
PgSetStrokeColor( Pg_GREY );
PgDrawBeveled( &clipped_rect, &clipping, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_CLIP );
PgDrawBeveled( &rounded_rect, &rounding, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ROUND );
/* Рисуются стрелки с фасками. */
PgSetFillColor( Pg_CYAN );
PgSetStrokeColor( Pg_GREY );
PgDrawBeveled( &rup, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_AUP );
PgDrawBeveled( &rdown, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ADOWN );
PgDrawBeveled( &rleft, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ALEFT );
PgDrawBeveled( &rright, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ARIGHT );
}
Прямоугольники и стрелки с фасками
Если Вы хотите рисовать стрелку, встроенную в заданный прямоугольник (например, стрелку линейки протяжки), используйте функцию PgDrawArrow().
Многоугольники
Вы можете создать многоугольники, задаваемого массива точек PhPoint_t. Если Вы используете Pg_CLOSED как часть аргумента flags, последняя точка автоматически соединяется с первой, замыкая многоугольник. Вы можете также задавать точки относительно начальной – первой точки (используя Pg_POLY_RELATIVE).
Следующий пример рисует синий шестиугольник с белым контуром:
void DrawFillStrokePoly( void ) {
PhPoint_t start_point = { 0, 0 };
int num_points = 6;
PhPoint_t points[6] = {
{ 32,21 }, { 50,30 }, { 50,50 },
{ 32,59 }, { 15,50 }, { 15,30 }
};
PgSetFillColor( Pg_BLUE );
PgSetStrokeColor( Pg_WHITE );
PgDrawPolygon( points, num_points, start_point, Pg_DRAW_FILL_STROKE | Pg_CLOSED );
}
Перекрытие многоугольников
Многоугольники, которые чем-то перекрываются, заполняются с использованием так называемого правила чёт-нечет: если область пересекается чётное количество раз, она не заполнена. Чтобы понять это, давайте нарисуем горизонтальную линию, пересекающую многоугольник. Когда Вы идёте вдоль этой линии и пересекаете первую линию, Вы оказываетесь внутри многоугольника; пересекая вторую линию – выходите наружу. В качестве примера рассмотрим простой многоугольник:
Заполнение простого многоугольника
Это правило можно расширить на более сложные многоугольники:
-
Когда Вы пересекаете нечётное число линий, Вы находитесь внутри многоугольника, так что область заполнена.
-
Когда Вы пересекаете чётное число линий, Вы находитесь вне многоугольника, так что область не заполнена.
Заполнение перекрывающися многоугольников
Правило чёт-нечет применимо и к функции 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( ¢er, &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 );
}
Заполненные и очерченные дуги
Спэны – сложные кривые
Если кривая, которую Вы хотите нарисовать, не может быть выражена как какая-либо другая кривая, поддерживаемая Photon'овским микроGUI, Вы можете нарисовать её как набор спэнов, вызвав функцию PgDrawSpan(). Эта функция в качестве одного из своих аргументов получает массив записей типа PgSpan_t.
Членами такой записи являются:
short x1 | Начальная позиция по x1 |
short x2 | Конечная позиция по x2 |
short y | Позиция по y |
Линии, пиксели и массивы пикселей
Линии и пиксели рисуются с использованием текущего состояния черты (цвет, толщина и пр.). Примитивами рисования являются:
PgDrawBezier(), PgDrawBeziermx() | Рисование очерченных и/или заполненных кривых Безье |
PgDrawGrid() | Рисование сетки |
PgDrawLine(), PgDrawILine() | Рисование одинарной линии |
PgDrawPixel(), PgDrawIPixel() | Рисование одной точки |
PgDrawPixelArray(), PgDrawPixelArraymx() | Рисование множества точек |
PgDrawTrend(), PgDrawTrendmx() | Рисование направленного графика (trend graph) |
В следующем примере рисуются красная, зелёная и синяя линии:
void DrawLines( void ) {
PgSetStrokeColor( Pg_RED );
PgDrawILine( 8, 8, 152, 8 );
PgSetStrokeColor( Pg_GREEN );