Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Roman legionnaire vs Knight Artorias
Ghost-Skeleton in DSR
Expedition SCP-432-4
Expedition SCP-432-3 DATA EXPUNGED

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Богатырев А. Весь текст 120.46 Kb

Руководство полного идиота по программированию на C

Предыдущая страница
1 ... 4 5 6 7 8 9 10  11
        +-------------+-------------+-------------+------> ось x
        | array[0][0] | array[0][1] | array[0][2] | ...
        +-------------+-------------+-------------+
        | array[1][0] | array[1][1] | array[1][2] | ...
        +-------------+-------------+-------------+
        | array[2][0] | array[2][1] | array[2][2] | ...
        +-------------+-------------+-------------+
        | ...           ...           ...
        V
       ось y

Пока, на данной стадии знания Си,
я рекомендую вам объявлять двумерные массивы как глобальные
и не пытаться передавать их имена в функции как аргументы.
*/

/* Приведем пример, который заводит двумерный массив букв,
   рисует в нем некую геометрическую фигуру,
   и печатает этот массив.

   Здесь мы приводим алгоритм Брезенхема для рисования прямых,
   объяснения КАК он это делает мы опустим. Пардон.
*/

#define LINES   31      /* число строк    */
#define COLUMNS 79      /* число столбцов */

char field[LINES][COLUMNS];

/* В данной программе массив НЕ является параметром,
   мы работаем с ним как с глобальной переменной.
   Функция рисования прямой линии, алгоритм Брезенхема.
 */
void line(int x1, int y1, int x2, int y2, char sym){
        int dx, dy, i1, i2, i, kx, ky;
        int d;      /* "отклонение" */
        int x, y;
        int flag;

        dy = y2 - y1;
        dx = x2 - x1;
        if (dx == 0 && dy == 0){
                field[y1][x1] = sym;    /* единственная точка */
                return;
        }
        kx = 1; /* шаг по x */
        ky = 1; /* шаг по y */

        /* Выбор тактовой оси */
        if( dx < 0 ){ dx = -dx; kx = -1; } /* Y */
        else if(dx == 0)        kx = 0;    /* X */

        if(dy < 0) { dy = -dy; ky = -1; }

        if(dx < dy){ flag = 0; d = dx; dx = dy; dy = d; }
        else         flag = 1;

        i1 = dy + dy; d = i1 - dx; i2 = d - dx;
        x = x1; y = y1;

        for(i=0; i < dx; i++){
                field[y][x] = sym;      /* нарисовать точку */

                if(flag) x += kx; /* шаг по такт. оси   */
                else     y += ky;

                if( d < 0 ) /* горизонтальный шаг      */
                         d += i1;
                else{       /* диагональный шаг        */
                         d += i2;
                         if(flag) y += ky; /* прирост высоты */
                         else     x += kx;
                }
        }
        field[y][x] = sym; /* последняя точка  */
}

int main(){
        int x, y;

        /* Заполнить поле пробелами */
        for(y=0; y < LINES; y++)
                for(x=0; x < COLUMNS; x++)
                        field[y][x] = ' ';

        /* Нарисовать картинку */
        line(0,0,               0,         LINES-1, '*');
        line(0,0,               COLUMNS-1, 0,       '*');
        line(COLUMNS-1, 0,      COLUMNS-1, LINES-1, '*');
        line(0, LINES-1,        COLUMNS-1, LINES-1, '*');

        line(0,0,               COLUMNS-1, LINES-1, '\\');
        line(COLUMNS-1,0,       0,LINES-1,          '/');

        /* Распечатать массив */
        for(y=0; y < LINES; y++){
                for(x=0; x < COLUMNS; x++)
                        putchar(field[y][x]);
                putchar('\n');
        }
        return 0;
}
Предыдущая страница
1 ... 4 5 6 7 8 9 10  11
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (6)

Реклама