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;
}
标签:c,algorithm,approximation 来源: https://codeday.me/bug/20190902/1791262.html