2013-01-22 36 views
0

我不知道如何用較少的詞表達我需要的算法;這個問題很可能已經在這裏得到解答,但我不知道如何去搜索它。根據比例尺在座標線上重新標記標記的算法

我需要的是以下內容。
我正在寫一種2D圖形繪圖程序。顯然,僅繪製主座標線並不是很好,因爲圖形可能位於遠離原點的位置,並且如果僅繪製主線,則用戶將不會有其大小的任何參考。
我決定繪製參考線,即以恆定的間隔週期出現的水平線和垂直線,對應於例如。整數。但是,由於縮放的可能性,使用恆定間隔並不會很好,也就是說,如果用戶放大以查看單位正方形的內部,他將再次看到幾乎空的框,而沒有提及大小。

所以,我需要重新調整我用來繪製參考線的間隔。換句話說,我需要一個類似double -> double這樣的函數,它接受當前的比例係數(我使用的係數指定了一個單位長度中有多少個像素)或者某個函數的值(例如最大單位長度的數量可以沿着某個座標軸放入屏幕中)並返回步長值(以邏輯單位表示像素,無關緊要),即參考線之間的間隔長度。

我相信這樣的函數的值的集合可以是無限的,也就是說,這個函數會將比例係數值的區間映射到該步的固定值。我可以粗略地描述算法,或者更準確地說,我需要的映射。它看起來類似於本(輸入值的畫面內單元的最大數目):

  • ...
  • [5..9] - > 0.25
  • [9..15] - > 0.5
  • [15..30] - > 1
  • ...

這裏的數值是純經驗和僅用於說明使用。

但是,我不知道如何將這組映射外推到更大範圍的比例係數值,更不用說如何分析表達這種依賴關係。但我確信這是可能的,因爲我在許多圖形程序中看到了這樣的事情。

我發現this問題看起來非常接近我所需要的,但我無法設法將它的答案適應於我的任務,因爲它提到了標籤寬度並且我沒有任何標籤。

回答

1

您可以將其精確地定義爲一個數量級(10次冪),然後以相似的方式處理其他數量級並轉換回來,例如,

double tickStep(double pixelDistance) 
{ 
    if(pixelDistance <= 3.0) 
     return(tickStep(pixelDistance * 10.0)/10.0); 
    else if(pixelDistance > 3.0 && pixelDistance <= 5.0) 
     return(0.125); 
    else if(pixelDistance > 5.0 && pixelDistance <= 9.0) 
     return(0.25); 
    else if(pixelDistance > 9.0 && pixelDistance <= 15.0) 
     return(0.5); 
    else if(pixelDistance > 15.0 && pixelDistance <= 30.0) 
     return(1.0); 
    else if(pixelDistance > 30.0) 
     return(tickStep(pixelDistance/10.0) * 10.0); 
} 

我用遞歸釐清思路,但它可能是更有效地使用logpow

+0

哇,這個作品很棒!我想我需要調整係數,但沒關係,我抓住了主要想法。非常感謝你! –