我使用画布编写仪表小部件,需要计算秤的标签值。没问题,除非我正在尝试重建VU表的刻度。我理解它是对数的,但是这种类型的仪表上的值不是10的幂。
请参阅: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级别?
同样,我不是要求代码示例,只是为了帮助理解最佳使用方法。
谢谢!
答案 0 :(得分:3)
我想你有一个像素到像素的功能。你需要写的是逆函数。
当你有反函数时,你只需将屏幕区域划分为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));
}