Примеры решения экзаменационных задач

Задача № 1. Разработать программу, которая выводит на экран замкнутый многоугольник и заполняет его буквами «О» размером 8×8 пикселов.

Решение. Для того, чтобы закрасить многоугольник произвольным шаблоном размером 8х8 пикселов, необходимо воспользоваться функцией

void setfillpattern(char far *pattern, int color).

Шаблон устанавливается с помощью массива pattern. В случае буквы «О» массив pattern задаётся следующим образом:

char pattern[]=

      {

      0x1C,       // 00011100

      0x22,       // 00

      0x41,       // 01

      0x41,       // 01

      0x41,       // 01

      0x22,       // 00

      0x1C,       // 00011100

      0x0         // 00000000

      };

Программа

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

// Шаблон буквы О

char pattern[]=

      {

      0x1C,       // 00011100

      0x22,       // 00

      0x41,       // 01

      0x41,       // 01

      0x41,       // 01

      0x22,       // 00

      0x1C,       // 00011100

      0x0         // 00000000

      };

// Координаты вершин многоугольника

int poly[]=

      {

      30, 10,

      50, 0,

      200, 100,

      100, 150,

      50, 30,

      };

void main()

{

      // Инициализация графики

      int gdriver=DETECT, gmode;

      initgraph(&gdriver, &gmode, "");

      // Установка палитры закраски

      setfillpattern(pattern, WHITE);

      // Вывод закрашенного многоугольника

      fillpoly(sizeof(poly)/(sizeof(int)*2), poly);

      getch(); // Ожидание нажатия клавиши

      closegraph(); // Выход из графического режима

}

Результат работы программы

Задача № 2. Пусть задан отрезок с экранными координатами ((1, 1), (6, 3)). Рассмотреть на примере вывода этого отрезка алгоритм Брезенхема и записать последовательность точек, которые будут сгенерированы этим алгоритмом.

Решение. Для решения этой задачи можно применить как целочисленную версию алгоритма Брезенхема, так и версию, использующую вычисления с вещественными числами. Рассмотрим версию алгоритма Брезенхема, использующую вычисления с вещественными числами.

x0 = 1, x1 = 6, y0 = 1, y1 = 3, ∆x = x1x0 = 5, ∆y = y1y0 = 2, ∆y/∆x = 0.4.

Т.к. x > 0, ∆y > 0 и ∆y < ∆x, то x увеличивается на 1.

  1. x = 1, y = 1, d = 0, генерируется точка (1, 1).
  2. x = x + 1 = 2, d = d + ∆y / ∆x = 0.4. Т.к. -0.5 ≤ d < 0.5, то y не изменяется. Генерируется точка (2, 1).
  3. x = x + 1 = 3, d = d + 0.4 = 0.8. Т.к. d > 0.5, то y = y + 1 = 2 и d = d – 1 = -0.2. Генерируется точка (3, 2).
  4. x = x + 1 = 4, d = d + 0.4 = 0.2. Т.к. -0.5 ≤ d < 0.5, то y не изменяется. Генерируется точка (4, 2).
  5. x = x + 1 = 5, d = d + 0.4 = 0.6. Т.к. d > 0.5, то y = y + 1 = 3 и d = d – 1 = -0.4. Генерируется точка (5, 3).
  6. x = x + 1 = 6, d = d + 0.4 = 0. Т.к. -0.5 ≤ d < 0.5, то y не изменяется. Генерируется точка (6, 3).

В результате будет сгенерирована следующая последовательность точек:   (1, 1)(2, 1), (3, 2), (4, 2), (5, 3), (6, 3).

Задача № 3. Пусть известны координаты точки S(2, 4, 5) и плоскость P, которая задаётся векторами u1 = (0, 1, 0), u2 = (0, 0, 1) и r0 = (1, 1, 1). Найти координаты (x, y) параллельной проекции точки S на плоскость P в направлении вектора u = (1, 0.4, 0.5).

Решение

Воспользуемся следующими формулами:

x‘ = (r-r0,u2,u) / (u1,u2,u),

y‘ = -(r -r0,u1, u) / (u1,u2,u).

В нашем случае смешанное произведение (u1, u2, u) равно 1, т.к. , и rr0 = (1, 3, 4).

Поэтому

  ,  .

Ответ: x = 2.6, y = 3.5.

Задача № 4. Пусть известны координаты точки S(2, 5, 3) и плоскость P, которая задаётся векторами u1 = (0, 1, 0), u2 = (0, 0, 1) и r0 = (0.3, 0.7, 0.2). Найти координаты (x′, y) центральной проекции точки S на плоскость P из точки наблюдения rv = (1, 1, 1).

Решение. Координаты x’, y’ вычисляются по формулам

x’ = (rV-r0,u2,r-rV) / (u1,u2,r-rV),

y’ = — (rV -r0,u1,r-rV) / (u1,u2,r-rV).

rv-r0 = (0.7, 0.3, 0.8);  r = (2, 5, 3); r-rv = (1, 4, 2);

;   .

x′ = -2.5;

.

y′ = — 0.6;

Ответ: x′ = -2.5, y′ = — 0.6.

Задача № 5. Пусть заданы координаты точки S(2, 1, 3), вектор единичной длины  и угол φ=600. Найти координаты точки S, полученной поворотом точки S вокруг вектора u на угол φ.

Решение. Воспользуемся формулой    r‘ = Ar, где

, .

, ,

,

.

.

.

Ответ: .