我使用画布编写一个仪表小部件,需要计算刻度的标签值。没问题,除非我尝试重新创建 VU 表的刻度。我知道它是对数的,但在这种类型的仪表上,这些值不是 10 的幂。
see: https://en.wikipedia.org/wiki/VU_meter https://en.wikipedia.org/wiki/VU_meter
我的函数给出了比例的最小值和最大值。对于正常尺度,还给出了值之间的步长。例如,给定 -20 和 30,步长为 10,它将生成标签:
-20 -10 0 10 20 30
对于给定 -20 和 6 的 VU 表,我需要生成标签:
-20 -10 -5 -3 0 3 6
而且,这些值之间的比例间距并不相同。
我并不是要求提供实际的代码示例,而是要求有关如何最好地实现这一点的想法。
我应该编写函数,使参数之一是标签列表,然后将它们绘制在对数刻度上吗?这似乎无法正常工作,因为数字最终没有出现在正确的位置,如上图正确的 VU 表所示。
是否有一些专门针对 dB 级别的公式,而不是简单的对数函数?
再次强调,我并不是要求提供代码示例,只是为了帮助您理解最佳使用方法。
Thanks!
我想你有一个值到像素的函数。你需要写的是inverse的功能。
当你有反函数时,你只需将屏幕区域分成 N 个相等的部分(在图中你有 6 个区域)。一个区域的宽度为 X 像素。现在您可以使用反函数来获取该像素位置的值。
这不会是一个整数,它会类似于 3.434 或 11.34 - 你需要一个更漂亮的函数来生成最接近的“漂亮”数字(假设只是去掉小数点后的部分)。
现在,您获取漂亮的值并使用原始函数计算它的像素位置。
一些代码:
function value2px(value, valueMin, valueMax, pxMin, pxMax) {
var valueWidth = sigLog(valueMax) - sigLog(valueMin);
var pixelWidth = pxMax - pxMin;
var ratio = pixelWidth / valueWidth;
return ratio * (sigLog(value) - sigLog(valueMin)) + pxMin;
}
function px2value(px, valueMin, valueMax, pxMin, pxMax) {
var valueWidth = sigLog(valueMax) - sigLog(valueMin);
var pixelWidth = pxMax - pxMin;
var ratio = pixelWidth / valueWidth;
return sigExp((px - pxMin) / ratio + sigLog(valueMin));
}
和演示:http://jsfiddle.net/ambcwoLg/1/ http://jsfiddle.net/ambcwoLg/1/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)