c – 矩形近似算法

我有一个不到32个绝对矩形大小的枚举,我需要给出尺寸并找到我的枚举中的最佳近似值.

有没有更好的(即更易读和可维护)的方式比我正在制定的大量嵌套if和其他的意大利面条代码?

目前我刚刚:

enum imgOptsScale {
    //Some relative scales
    w005h005 = 0x8,
    w010h010 = 0x9,
    w020h020 = 0xA,
    w040h040 = 0xB,
    w070h070 = 0xC,
    w100h100 = 0xD,
    w150h150 = 0xE,
    w200h200 = 0xF,
    w320h320 = 0x10,
    w450h450 = 0x11,
    w200h010 = 0x12,
    w200h020 = 0x13,
    w200h070 = 0x14,
    w010h200 = 0x15,
    w020h200 = 0x16,
    w070h200 = 0x17
};
imgOptsScale getClosestSizeTo(int width, int height);

在我进一步编写代码之前,我想我会请求帮助.我应该强调偏离过于复杂的库,尽管我对算法比对应该在资源受限系统上运行的容器更感兴趣.

解决方法:

我想我会用几个结构阵列来处理这个结构,一个用于水平测量,一个用于垂直测量.

通读数组以查找下一个更大的大小,并返回相应的键.从两个键构建最终的框测量. (由于32只允许5位,这可能不是很理想 – 你可能想要水平2.5位和垂直2.5位,但我这里的简单方法需要6位 – 水平3位,垂直3位你可以从其中一个列表中删除一半的元素(如果你对其中一个维度具有较少*度的情况很好的话,也可以调整<<<<<<<<<<<<<<<<< ,这可能需要足够的重新工作,这种方法可能不合适.) 未经测试的伪代码:

struct dimen {
    int x;
    int key;
}

struct dimen horizontal[] = { { .x = 10, .key = 0 },
                              { .x = 20, .key = 1 },
                              { .x = 50, .key = 2 },
                              { .x = 90, .key = 3 },
                              { .x = 120, .key = 4 },
                              { .x = 200, .key = 5 },
                              { .x = 300, .key = 6 },
                              { .x = 10000, .key = 7 }};

struct dimen vertical[] = { { .x = 10, .key = 0 },
                           { .x = 20, .key = 1 },
                           { .x = 50, .key = 2 },
                           { .x = 90, .key = 3 },
                           { .x = 120, .key = 4 },
                           { .x = 200, .key = 5 },
                           { .x = 300, .key = 6 },
                           { .x = 10000, .key = 7 }};

/* returns 0-63 as written */
int getClosestSizeTo(int width, int height) {
    int horizontal_key = find_just_larger(horizontal, width);
    int vertical_key = find_just_larger(vertical, height);
    return (horizontal_kee << 3) & vertical_key;
}

int find_just_larger(struct dimen* d, size) {
    int ret = d.key;
    while(d.x < size) {
        d++;
        ret = d.key;
    }
    return ret;
}
上一篇:近似算法 - 3 - 随机采样和线性舍入


下一篇:javascript – SVG:将弧转换为Cubic Bezier