用逐步大小计算图表的轴刻度

时间:2019-03-29 09:39:30

标签: c# .net algorithm math

我已经计算出图表上某个轴的步进大小。

我也有最小值和最大值。现在,我需要计算所有刻度,以便可以显示我的最小值和最大值之间的所有值。

例如:

步长:1000

最小值:213

最大:4405

预期的价格变动:0,1000,2000,3000,4000,5000


步长:500

最小值:-1213

最大:1405

预期的价格变动:-1500,-1000,-500,0,500,1000,1500

直到现在,我一直在尝试使用“ try and error”来计算第一个值:

bool firstStepSet = false;
double firstStep = stepSize;
do
{
    if (xValue >= (firstStep - (stepSize / 2)) && xValue <= 
    (firstStep + (stepSize / 2)))
    {
        firstStepSet = true;
        this.myBarXValues.Add(firstStep, 0);
    }
    else if (xValue > stepSize)
    {
        firstStep += stepSize;
    }
    else
    {
        firstStep -= stepSize;
    }
}
while (!firstStepSet);

然后在此列表中添加步骤,直到所有值都适合为止。

这对我来说似乎很脏,我想知道是否还有其他解决方案。

所以我需要的是一种解决方案,可以计算出我需要的第一个刻度。

2 个答案:

答案 0 :(得分:1)

此函数计算第一步和最后一步的值:

static void CalcSteps(int min, int max, int stepSize, out int firstStep, out int lastStep)
{
    if (min >= 0)
    {
        firstStep = (min / stepSize) * stepSize;
    }
    else
    {
        firstStep = ((min - stepSize + 1) / stepSize) * stepSize;
    }

    if (max >= 0)
    {
        lastStep = ((max + stepSize - 1) / stepSize) * stepSize;
    }
    else
    {
        lastStep = (max / stepSize) * stepSize;
    }
}

答案 1 :(得分:0)

您可以使用整数舍入到较低和较高的值来计算轴限制

low = stepsize * (min / stepsize)  //integer division needed
high = stepsize * ((max + stepsize - 1) / stepsize)

示例Python代码返回限制和刻度数(比间隔计数多一个)

def getminmax(minn, maxx, step):
    low = (minn // step)
    high = (maxx + step - 1) // step
    ticks = high - low + 1
    return low * step, high * step, ticks


print(getminmax(213, 4405, 1000))
print(getminmax(-1213,1405, 500))

(0, 5000, 6)
(-1500, 1500, 7)