Я работаю над алгоритмом построения диаграммы, который даст мне набор из n значений оси Y, которые я бы использовал на своем графике.
Основная проблема заключается в том, что я также хочу рассчитать количество используемых шагов, а также использовать для них красивые числа. Он должен быть способен принимать целые и двойные числа и уметь обрабатывать небольшие диапазоны (менее 1) и большие диапазоны (более 10000 и т. Д.).
Например, если бы мне дали диапазон от 0,1 до 0,9, в идеале я бы имел значения 0, 0,2, 0,4, 0,6, 0,8, 1, но если бы мне дали от 0,3 до 0,7, я мог бы использовать 0,3, 0,4, 0,5 0,6, 0,7
Это то, что я имею до сих пор, оно хорошо работает с маленькими диапазонами, но ужасно с большими диапазонами, и не дает мне хороших чисел
-(double*)yAxisValues:(double)min (double):max {
double diff = max - min;
double divisor = 1.0;
if (diff > 1) {
while (diff > 1) {
diff /= 10;
divisor *= 10;
}
} else {
while (diff < 1) {
diff *= 10;
divisor *= 10;
}
}
double newMin = round(min * divisor) / divisor;
double newMax = round(max * divisor) / divisor;
if (newMin > min) {
newMin -= 1.0/divisor;
}
if (newMax < max) {
newMax += 1.0/divisor;
}
int test2 = round((newMax - newMin) * divisor);
if (test2 >= 7) {
while (test2 % 6 != 0 && test2 % 5 != 0 && test2 % 4 != 0 && test2 % 3 != 0) {
test2++;
newMax += 1.0/divisor;
}
}
if (test2 % 6 == 0) {
test2 = 6;
} else if (test2 % 5 == 0) {
test2 = 5;
} else if (test2 % 4 == 0 || test2 == 2) {
test2 = 4;
} else if (test2 % 3 == 0) {
test2 = 3;
}
double *values = malloc(sizeof(double) * (test2 + 1));
for (int i = 0; i < test2 + 1; i++) {
values[i] = newMin + (newMax - newMin) * i / test2;
}
return values;
}
Есть предложения?