Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “查找最近的”;“尼斯”;直尺瓷砖宽度_C#_Algorithm - Fatal编程技术网

C# “查找最近的”;“尼斯”;直尺瓷砖宽度

C# “查找最近的”;“尼斯”;直尺瓷砖宽度,c#,algorithm,C#,Algorithm,我想找到最近的“好”瓷砖的“尺子”给定粗略的瓷砖数量和范围显示。更具体地说,关于“尼斯”,瓷砖的宽度应该像钱一样:1,2,5,10,20。。。等等,或者更精确地说,1*10eN、2*10eN或5.0*10eN,其中N为整数(=类似于0.1的值也有效) 首选语言是C# 例如,如果我想显示从-1到12的范围,并希望标尺上大约有3个平铺,那么算法的输出将是3个平铺,10个单位宽,从值-10(到20) 由于算法将决定采用瓷砖宽度2和-2到12之间的值,瓷砖数量将为6,这比3个瓷砖的近似值更差(对于第一个

我想找到最近的“好”瓷砖的“尺子”给定粗略的瓷砖数量和范围显示。更具体地说,关于“尼斯”,瓷砖的宽度应该像钱一样:1,2,5,10,20。。。等等,或者更精确地说,1*10eN、2*10eN或5.0*10eN,其中N为整数(=类似于0.1的值也有效)

首选语言是C#

例如,如果我想显示从-1到12的范围,并希望标尺上大约有3个平铺,那么算法的输出将是3个平铺,10个单位宽,从值-10(到20)

由于算法将决定采用瓷砖宽度2和-2到12之间的值,瓷砖数量将为6,这比3个瓷砖的近似值更差(对于第一个选项)。或者,如果宽度为5,标尺从-5到15,则瓷砖的数量为4,这比3块瓷砖“更远”(对于第一个选项)


作为现实世界的例子,打开您最喜欢的图像编辑器,在缩放时查看轴的图例-标尺上的数字发生变化,但屏幕上标尺的平铺总数保持大致相同。这个问题与此类似,只是范围(如果图像编辑器的像素从0到宽度/高度)不是从零开始,分辨率可以低于1个单位(像素)。

类似的操作应该做到:将范围除以首选的分片数。取这个数的Log10,然后取模1,这告诉你是使用1、2还是5的倍数:

0 -> 1 0.30103 -> 2 0.69897 -> 5 1 -> 10 0 -> 1 0.30103 -> 2 0.69897 -> 5 1 -> 10 此方法建议您使用4块大小为5的瓷砖作为示例,而不是3块大小为10的瓷砖;如果您喜欢较少的平铺,可以通过更改交叉值来进一步调整它

javascript代码示例(我不会说C#):

函数findTiling(范围从、范围到、近似分幅){
var scale=Math.log((范围到-范围从)/aprox\u tiles)/Math.LN10;
var scale10=数学地板(比例);
变量标度125=(标度+100)%1;
如果(标度125<0.150515)标度=1//0
如果(标度125<0.5)标度=2//0.30103,则为else
如果(标度125<0.849485)标度=5//0.69897
else比例=10;//1
比例*=数学功率(10,比例10);
var from=数学楼层(范围/比例)*比例;
变量至=数学单元(范围至/比例)*比例;
返回{width:scale,from:from,count:Math.round((to-from)/scale)};
}
var Tilling=FindTilling(-1,12,3);
写入(tiling.width+“;“+tiling.from+”;“+tiling.count+”
”); var Tilling=FindTilling(8,88,10); 写入(tiling.width+“;“+tiling.from+”;“+tiling.count+”
”); var Tilling=FindTilling(-100500,3); 写入(tiling.width+“;“+tiling.from+”;“+tiling.count+”
”); var Tilling=FindTilling(-1,-0.9,7); 写入(tiling.width+“;“+tiling.from+”;“+tiling.count+”
”); var Tilling=FindTilling(-1,-0.9,8);
写入(tiling.width+“;“+tiling.from+”;“+tiling.count+”
”)我不理解问题陈述。你能澄清一下吗?@miparnisari想象你有一块木板要测量,并且要找到n个部分的折叠尺。问题是要找到一个折叠尺,它的零件数与n最接近,可以测量木板。当然,折尺上有“漂亮”的数字。简单来说,范围有“两端”,测量时你会将木板“平移”为0,有效地将其减少到“一端”-你不能用范围这样做。是我还是这完全不可理解?@m69我必须承认,如果你不花时间想象图片上的问题,它可能看起来很混乱-我只是添加了图片以节省每个人的时间,这对你有帮助吗?比我目前的迭代解决方案更好,最大限度地减少了错误-它在大约50行上是一团混乱。 0 -> 1 0.30103 -> 2 0.69897 -> 5 1 -> 10