Unicode Box绘图表的系统

时间:2014-01-05 15:42:05

标签: c# unicode

我正在C#中实现一个函数,它提供从哪一侧走什么样的行,它将从Unicode绘图表(0x2500-0x257F)中返回一个字符。但是我还没有(在)表中找到这些字符位置的系统,这会产生一个非常简单的功能,然后在一个巨大的if-then-else块中将所有可能的输入分配给输出。

我注意到该表中有9种不同的线型(细线,双线,粗线,双线,三点划线,四点三线,厚双点划线......),并且四个方向,“无线”信息使10个不同的状态,这将构成9999个不同的组合,不包括“没有一方有一条线”的情况,在我的情况下将是一个空格字符。

我发现实现这个的最简单的方法是制作一个包含所有10000种可能结果的巨大数组(其中第一个数字表示北,第二个数字表示东部,然后是南部和West)但我相信这实际上是我发现的第二个最糟糕的情况,并且有一个更优雅的解决方案。 (顺便说一句,如果你没有计划以这种方式实施它,那将会很有趣。不管怎样,这就是我对此的看法。)

这个问题在这里可能不合适,但考虑到这项任务的规模,我甚至承担了这个风险:

是否有一个系统框绘图表如何排列字符,和/或是否有一个更简单的算法,我想做的完全相同?

1 个答案:

答案 0 :(得分:1)

我看到的最简单/最短的解决方案需要128个元素的数组/列表。

你声明一个这样的结构/类:

// I use consts instead of enum to shorten the code below
const int thin = 1;
const int double = 2;
const int thick = 3;
... // other line styles

struct BoxDrawingChar{
    int UpLine, DownLine, LeftLine, RightLine;  

    BoxDrawingChar(int UpLine, int DownLine, int LeftLine, int RightLine)
    { ... }
};

然后描述每个角色的外观:

BoxDrawingChar[] BoxDrawingCharList = 
{
    new BoxDrawingChar(0, 0, thin, thin), // 0x2500
    new BoxDrawingChar(0, 0, thick, thick), // 0x2501 
    ...
    new BoxDrawingChar(...), // 0x257F 
}

然后你的功能将非常简单:

int GetCharCode(int UpLine, int DownLine, int LeftLine, int RightLine)
{
    for(int i = 0; i < BoxDrawingCharList.Length; ++i){
        BoxDrawingChar ch = BoxDrawingCharList[i];
        if (ch.UpLine == UpLine && ch.DownLine == DownLine && ...)
            return i + 0x2500;
    }
    return 0;
}

当然,您可以添加对角线,圆角等,并以多种方式重构代码。我只给出了一个大致的想法。