我已经阅读了Peter Van Der Linden在Expert C Programming中对字形的实现。他陈述了这种绘制字形图案的方法。这个问题严格限于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位宽的字形。

然后将上面的数组转换为秒表的字形模式。

我们如何在不使用图形的情况下在屏幕上绘制这些字形?是否有任何方法可以绘制其他对象的字形图案,例如 map 轮廓,人脸,而无需绘制每个像素,也无需使用常规C图形?

是否遵循任何算法?

最佳答案

仅缺少几行代码:

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

最后一个blurb是可导致您在该“秒表”列表中使用的某个值(在这种情况下为960或0x03c0)的表达式。

关于c - 在C中实现字形模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3365577/

10-11 15:56