Как определить значения оси Y на графике - PullRequest
0 голосов
/ 05 июля 2010

Я работаю над алгоритмом построения диаграммы, который даст мне набор из 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;
}

Есть предложения?

1 Ответ

0 голосов
/ 05 июля 2010

Вот фрагмент кода, который делает что-то похожее, но имеет немного другой подход. «Единицы» относятся к тому, что вы изображаете на графике. Таким образом, если ваш масштаб таков, что одна единица на вашем графике должна быть 20 пикселей на экране, эта функция будет возвращать, сколько единиц должно быть на каждый шаг. С помощью этой информации вы можете легко рассчитать значения осей и их отрисовку.

- (float)unitsPerMajorGridLine:(float)pixelsPerUnit {
    float amountAtMinimum, orderOfMagnitude, fraction;

    amountAtMinimum = [[self minimumPixelsPerMajorGridLine] floatValue]/pixelsPerUnit;  
    orderOfMagnitude = floor(log10(amountAtMinimum));
    fraction = amountAtMinimum / pow(10.0, orderOfMagnitude);

    if (fraction <= 2) {
        return 2 * pow(10.0, orderOfMagnitude);
    } else if (fraction <= 5) {
        return 5 * pow(10.0, orderOfMagnitude);
    } else {
        return 10 * pow(10.0, orderOfMagnitude);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...