c – 如何将一组数字转换为大部分数字?
作者:互联网
少量的背景:我正在开发一个转换器,它在以XML输出的地图制作者(Tiled)和输入lua表的引擎(Angel2D)之间架起桥梁.大部分都是直截了当的
但是,Tiled输出像素偏移(绝对值的整数),而Angel2D输入OpenGL单位(相对值的浮点数);需要这两者之间的转换因子(例如,32px = 1gu).由于OpenGL单元是抽象的,并且如果对象太小或太大,相机可以放大或缩小,实际的转换因子并不重要;我可以使用随机数,用户只需要放大或缩小.
但最好是选择转换因子使得输出的大多数数字都是小的和整数(或小整数的一小部分),因为这样可以更容易使用(并且OpenGL单元的整个点是它们是易于使用).
如何可靠地找到这样的转换因子?
我的第一次尝试是使用给出的最小数字;这导致没有低于1的分数,但往往导致许多小数位,其中因素没有排列.
然后我尝试了序列的模式,这导致最大数量的1可能,但往往导致非常长的浮动背景图像.
我目前的方法得到了整个序列的GCD,当它工作时,效果很好,但很容易被一个坏苹果抛弃.
请注意,虽然我可以很容易地传递我给出的数字,或者选择一些固定因子,或者使用我在上面指定的转换之一,但我正在寻找一种方法可靠地将整数列表缩放为小数,整数或简单的分数,因为这对最终用户来说很可能不足为奇;这不是一次性转换.
最终用户倾向于使用1.0作为操作的“基础”(因为它简单明了),因此实体的大小更有意义聚集在一起.
解决方法:
如何“最大数量是某些价值观的一个因素”.
因此,GCD是价值的“最大数字,是100%的因子”.
你可以选择最大的数字,这个数字是60%的值.我不知道这是否是一个技术术语,但如果不是一个精确的GCD,它就是一种“粗糙的GCD”.
您可能需要执行跟踪和错误才能找到它(可能是二进制搜索).但你也可以考虑采样.即如果您有一百万个数据点,只需随机选择100或1000即可找到一个数字,该数字均匀分配到您的样本集的目标百分比,这可能已经足够了.
一些蹩脚的伪C.
/** return percent of values in sampleset for which x is a factor */
double percentIsFactorOf(x, sampleset) {
int factorCount = 0;
for (sample : sampleset)
if (sample%x == 0) factorCount++;
return (double)factorCount/sampleset.size;
}
/** find largest value which is a factor of goalPercentage of sampleset */
double findGoodEnoughCommonFactor(sampleset, goalPercentage) {
// slow n^2 alogrithm here - add binary search, sampling, or something smarter to improve if you like
int start = max(sampleset);
while (percentIsFactorOf(start, sampleset)< goalPercent)
start--;
}
标签:discrete-mathematics,c,floating-point,opengl,double 来源: https://codeday.me/bug/20190722/1506769.html