Реализация шаблонов глифа в C - PullRequest
3 голосов
/ 29 июля 2010

Я читал эту реализацию глифов в Программирование на Expert C Питера Ван Дер Линдена. Он утверждает этот метод, чтобы нарисовать шаблон глифа. Этот вопрос строго ограничен контекстом программирования на Си.

static unsigned short stopwatch[] = {
    0x07C6,
    0x1FF7,
    0x383B,
    0x600C,
    0x600C,
    0xC006,
    0xC006,
    0xDF06,
    0xC106,
    0xC106,
    0x610C,
    0x610C,
    0x3838,
    0x1FF0,
    0x07C0,
    0x0000
};

и затем определите

#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0

для рисования глифов шириной 16 бит.

Затем вышеуказанный массив преобразуется в шаблон глифа StopWatch.

Как мы рисуем эти глифы на экране без использования графики? Есть ли способ рисовать шаблоны глифов других объектов, такие как контур карты, лицо человека примерно без необходимости рисования каждого пикселя и без использования обычной графики на языке C?

Существуют ли какие-либо алгоритмы, которым следовали?

1 Ответ

1 голос
/ 29 июля 2010

Отсутствует всего несколько строк кода:

int main()
{
    int i,j;
    for ( i=0;stopwatch[i];i++ )
    {
        for ( j=1<<16;j;j>>=1 ) printf("%c",stopwatch[i]&j?'o':' ');
        printf("\n");
    }
}

вуаля, секундомер:

      ooooo   oo 
    ooooooooo ooo
   ooo     ooo oo
  oo         oo  
  oo         oo  
 oo           oo 
 oo           oo 
 oo ooooo     oo 
 oo     o     oo 
 oo     o     oo 
  oo    o    oo  
  oo    o    oo  
   ooo     ooo   
    ooooooooo    
      ooooo      

Операторы define являются сокращением для получения магических значений в этом списке:

$ gcc -E -x c -
#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 

s _ _ _ _ _ _ X X X X _ _ _ _ _ _

// will be preprocessed to:
^D

((((((((((((((((0 )*2 )*2 )*2 )*2 )*2 )*2 )*2+1 )*2+1 )*2+1 )*2+1 )*2 )*2 )*2 )*2 )*2 )*2

Эта последняя реклама представляет собой выражение, которое приводит к некоторому значению (в данном случае 960 или 0x03c0), которое вы можете использовать в этом списке «секундомера».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...