2010-07-05 44 views
0

我正在制定一個圖表算法,該算法會給我一組我將在圖形上使用的y軸值的數組。如何確定圖表上的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; 
} 

有什麼建議?

回答

0

下面是一些類似的代碼片段,雖然有一個稍微不同的方法。 「單位」指的是您在圖表上繪製的內容。所以如果你的比例尺是這樣的,你的圖上的一個單位應該是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); 
    } 
} 
+0

問題是,我不知道每個單元有多少像素,因爲我希望根據給定的軸線改變軸線。對於某些數據集,每個單元可能有20個像素,但對於其他集合,我需要50或0.002等。 – James 2010-07-05 19:28:41

+0

這與我使用此代碼沒有任何區別。你知道你正在繪製的數據的範圍,以及你的圖形的大小。爲了使數據適合您的圖形,請將大小除以範圍以獲取可傳遞給此方法的'pixelsPerUnit'值。 – 2010-07-05 19:47:16

+0

好吧,仔細閱讀之後,仔細閱讀你的指示並修改它,我已經有效了,謝謝! – James 2010-07-06 15:00:22