
- •Лекція 10. Графіка в Сі
- •Ініціювання графічної системи. Обробка помилок
- •Поточне значення кольору лінії малюнка встановлюється функцією
- •Допустимі значення для параметра шрифт
- •Робота з вікнами і координатами.
- •Графічні примітиви
- •Зафарбований еліпс з контуром можна отримати, виконавши функцію
- •13. Зафарбування прямокутника виконує функція
Робота з вікнами і координатами.
Очистка екрана виконується функцією
сleardevice( );
Максимальні координати по вертикалі і горизонталі, відповідно:
getmaxy( ), getmaxx( ).
Відкриття вікна в графічному режимі
setviewport(x1, y1, x2, y2, clip);
де x1, y1 – координати лівого верхнього кута;
x2, y2 – координати правого верхнього кута;
clip – відсік.
Якщо параметр clip дорівнює 1, то ті елементи зображення, які не поміщаються в вікні, будуть відсіченні, якщо він дорівнює 0, то межі вікна ігнорується. При успішному виконанні цієї функції покажчик поточної графічної позиції переміститься на початок координат.
Очистка графічного вікна виконує функція;
clearviewport ( )
Поточні координати отримуємо за допомогою функцій
getx( ), gety( ).
Перевстановлення покажчика позиції виконують функції
moveto (x,y); moverel ( dx, dy);
де x,y – нові координати в системі координат вікна;
dx, dy – прирiст відносно старих координат в вікні.
Записування пікселя в відеопам’ять виконує функція:
putpixel (x, y, колір)
Наприклад, в результаті виконання фрагменту
For ( i = 0; i < 160; i++ )
{
putpixel(i, 10, GREEN);
putpixel(160+i, 10, RED);
}
буде виведена зелено-червона пряма.
Виведення графічного тексту в вікно
outtext(Sp); або outtext (x,y,Sp);
Перша – з поточної позиції, друга з позиції (х, у).
Приклади: 1). Суцільна діагональ червоного кольору товщиною в 3 пікселя на зеленому екрані:
{ setbkcolor(GREEN);
sercolor(RED);
setlinestyle(SOLID_LINE, 0, 3);
line(0, 0, getmaxx( ), getmaxy( ));
// Після натискання на клавішу очищуєм екран
getch();
cleardevice();
// Визначимо вікно виведення і очищуємо його.
setviewport (100, 100,getmaxx ( ) – 50, getmaxy ( ) – 50, 1);
clearviewport ( );
rectangle ( 100,100, getmaxx()-50, getmaxy()-50);
settextstyle (TRIPLEX_FONT, HORIZ_DIR, 3);
setbkcolor (BLUE);
setcolor (WHITE);
//виводимо текст в лівому верхньому куту вікна
outtextxy(1,1 “А ось і нове вікно ”);
getch();
closegraph();
return( 0 ); }
Графічні примітиви
Основне призначення графічних примітивів – забезпечити програміста зручним набором програмних засобів для рисування різних геометричних об’єктів. Розглянемо спочатку функції, призначенні для рисування об’єктів контурного типу.
Засіб взаємодії виведених прямих ліній встановлює функція
Setwritemode ( режим ).
Можливі коди параметра режим
0 COPY_PUT
1 XOR_PUT
Будь-яке інше значення автоматично береться по модулю 2. За допомогою цієї функції вказується засіб, яким код малюючого кольору, встановлений за допомогою функції setcolor (), буде взаємодіяти з атрибутами пікселів, які знаходяться на місці об’єкта, який рисується.
Якщо встановлено режим 0, то накреслена лінія “затирає” те, що було на екрані. Якщо ж встановлено режим 1, то для комбінування лінії з існуючим на екрані зображенням використовується операція виключення (або XOR в асемблері). Гарна властивість цієї операції в тому, що виведення двічі на одне і те ж місце лінії приводить до її стирання і відновлення початкового зображення на екрані (це використовується при програмуванні рухомих об’єктів).
Функція setwritemode ( ) працює без” побічних ефектів” тільки з курсиво-лінійними зображеннями (в випадку кривих 2-го порядку бувають непрогнозовані наслідки роботи даної функції).
Лінія рисується будь-яким способом;
1) line(x1, y1, x2, y2);
2) linerel(dx, dy); -лінія малюється з поточної крапки до нових координат;
3) lineto(x, y);
Приклад: 2 способи креслення ромба.
1 спосіб
setwritemode (XOR_PUT); setcolor (GREEN);
moveto (100, 10); lineto(50,90); lineto(100,170);
setcolor (RED); lineto(150, 90); lineto(100, 10);
2 спосіб
setbkcolor (WHITE); setcolor (GREEN);
line (100, 10, 50, 90); line ( 50, 90, 100, 170);
setbkcolor (RED);
line (100, 170, 150, 90); line(150, 90, 100, 10);
Контур прямокутника можна накреслити за допомогою
rectangle(x1, y1, x2, y2);
де x1, y1 – координати лівого верхнього кута;
x2, y2 –координати правого нижнього кута;
Якщо спробувати нарисувати квадрат, то на багатьох моніторах це не виходить тому, що піксель має форму прямокутника, витягненого по вертикалі. Необхідно виконати корегування кількості пікселів по горизонтальній і вертикальній сторонам квадрата. Істинні пропорції пікселів, необхідних для такого корегування, можна взнати за допомогою функції
getaspectratio(&xasp, &yasp);
Відношення xasp/yasp і є відношенням горизонтального і вертикального розмірів пікселя. Тому, якщо горизонтальний рядок квадрату має розмір G пікселів, то довжина вертикального рядка повинна бути:
(int)(G * (float)xasp/yasp);
4. Накреслити ламану лінію дозволяє функція drawpoly( кількість вершин, покажчик на масив цілих);
Кожна пара чисел масиву інтерпретується як пара координат чергової вершини ламаної.
5. Для зображення кривих використовують функції
-circle(x, y, радіус) – для рисування кола;
-для рисування дуги кола: arc(x, y, поч_ кут, кін_ кут, радіус ).
Кути задаються в градусах і відраховуються проти часової стрілки. Кульовий кут відповідає горизонтальному направленню вектора зліва направо. Значення кутів перетворюється до еквівалентних значень з інтервалу [0..360]. Таким чином,
arc(x, y, -45, 45, r) і arc(x, y, 675, -315, r)
задають одну і ту ж дугу в четвертину кола.
6. Паралелепіпед з зафарбованою передньою гранню можна нарисувати, використовуючи функцію
bar3d(x1, y1, x2, y2, глибина, ‘dax’);
Паралелепіпед обрамляється зовнішнім контуром. Якщо параметр глибина буде дорівнювати 0, то отримаємо обрамлений прямокутник. Якщо параметр dax дорівнює 1 (TOP_ON), то рисується верхня грань; якщо він дорівнює 0 (TOP_OFF), то верхня грань не промальовується (це корисно, якщо треба поставити один на інший декілька паралелепіпедів).
Приклад: Паралелепіпеди, які стоять один на іншому:
Setbkcolor (WHITE);
Setcolor (GREEN);
Bar3d (250, 50, 250, 150, 15, 1);
Bar3d (220, 150, 260, 180, 15, 1 );
Bar3d (300, 150, 340, 180, 15, 0);
Bar3d (300, 50, 340, 150, 15, 1);
8. Побудувати і зафарбувати багатокутник дозволяє функція
fillpoly(n, покажчик на масив цілих);
де n –кількість вершин.
Координати кожної вершини задаються двома величинами цілого типу. Ця функція завжди з’єднує першу точку списку вершин з останньою, замикає контур і зафарбовує його. Шаблон і колір
зафарбування може бути заданий функціями setfillstyle( ) і setfillpattern( ).
9. Звичайний еліпс рисує функція
ellipse (x, y, поч_кут, кін_кут, rx, ry ); rx,ry – довжини полуосей еліпса в пікселях. Осі еліпса завжди паралельні осям координат.