Я рассчитал размер шага оси диаграммы.
Также у меня есть минимальные и максимальные значения.
До сих пор я получаю первый шаг вроде:
if (xValue >= 0)
{
this.myXValues.Add((((int)(xValue / stepSize)) * stepSize));
}
else
{
this.myXValues.Add((((int)((xValue - stepSize + 1) / stepSize)) * stepSize));
}
Теперь мой вопрос в том, как выяснить, что такое последний шаг. Мне нужен алгоритм, подобный алгоритму для первого шага.
Обновлено: Пример:
Указанные значения:
Макс: 320
Размер шага: 100
Ожидаемый результат: 400
Указанные значения:
Макс: -470
Размер шага: 50
Ожидаемый результат: -450
Вот как можно получить числа между min и max, соблюдая размер шага:
static void Main(string[] args)
{
Console.WriteLine(string.Join(",", GetTicksBetweenNumbersBySteps(1000, 213, 4405)));
Console.WriteLine(string.Join(",", GetTicksBetweenNumbersBySteps(500, -1213, 1405)));
}
private static List<int> GetTicksBetweenNumbersBySteps(int stepsize, int min, int max)
{
List<int> foundTicks = new List<int>() { 0 };
int actualTick = 0;
while (actualTick > min)
{
actualTick -= stepsize;
if (actualTick >= min)
{
foundTicks.Add(actualTick);
}
}
actualTick = 0;
while (actualTick < max)
{
actualTick += stepsize;
if (actualTick <= max)
{
foundTicks.Add(actualTick);
}
}
return foundTicks.OrderBy(x => x).ToList();
}
Выход:
0,1000,2000,3000,4000
-1000,-500,0,500,1000
Для последнего тика вам просто нужно немного изменить код:
if (xValue >= 0)
{
this.myXValues.Add((((int)((xValue + stepSize - 1) / stepSize)) * stepSize));
}
else
{
this.myXValues.Add((((int)(xValue / stepSize)) * stepSize));
}
Какое значение нужно округлить?
Целочисленное деление (с необязательным добавлением) эквивалентно округлению отношения value/stepsize
до минус бесконечности или до плюс бесконечности. (здесь 10/3 => 4
)
но напр. (((640 + 100 - 1) / 100)) * 100 = 800, но я ожидал 700
о, я думаю, где вы написали + должно быть -
Нет, это выражение дает 700. Как вы получили 800?
1. Math.Ceiling((640 + 100 - 1)/100)=8 2. 8*100 = 800
Целочисленное деление с + 100 - 1
уже достигает потолка до 7, вам не нужно делать это явно. Я изменил ответ на готовый код
Да, но как я могу определить максимальное значение раньше?