2012-07-16 61 views
3

我想在任意數量的細分段上繪製刻度線。圓弧是一個GeneralPath對象。行細分算法

我想繪製n沿圓弧的刻度線(其中n是算法的輸入)。我還需要在弧的開始和結束處畫一個勾號。

有沒有人有任何指針,我可以找到這樣的算法?

+1

線條只是一條水平線,還是可以成一定角度?你使用的是什麼協調系統?蜱是否需要垂直於生產線?或相交等等等等。 ... – 2012-07-16 08:08:57

回答

1

那麼,一條線是一個2D矢量。取其方向,得到長度,將其除以n,然後使用起點,方向矢量以及起點和刻度之間的距離計算刻度的位置。

編輯:

一些僞代碼,以及:

double unnormalizedDir.x = end.x - start.x; 
double unnormalizedDir.y = end.y - start.y; 

double length = sqrt(unnormalizedDir.x * unnormalizedDir.x + unnormalizedDir.y * unnormalizedDir.y); 

double dir.x = unnormalizedDir.x/length; 
double dir.y = unnormalizedDir.y/length; 

double tickLength = length/n; 

for(int i = 1; i <= n; i++) { 
    double tick.x = start.x + dir.x * i * ticklength; 
    double tick.y = start.y + dir.y * i * ticklength;  
} 

這應該給你就行了蜱的位置。請注意,您可能應該將計算放入代表二維矢量的類中,或者更好地使用現有的幾何圖形庫。

UPDATE

由於您使用的是GeneralPath這種方法只適用於部分。 我目前無法想出一個聰明的算法,但你總是可以將路徑段視爲直線或弧線並遍歷它們。蜱之間的距離將是路徑長度除以n,路徑長度將是各個區段長度的總和。

然後遍歷這些區域,如果兩個滴答之間有一個頂點(一個段的起點/終點),那麼計算該頂點到最後一個滴答的距離,並使用該頂點的距離開始上述算法到下一個勾號。

類似的東西:

double distToNextTick = pathLength/n; 
double distLastTickToNextVertex = ... ; //calculate 
while(distToNextTick > distLastTickToNextVertex) { 
    Point2D nextVertex = ... // get the vertex 
    distToNextTick -= distLastTickToNextVertex; 

    distLastTickToNextVertex = ...;// calculate again 
} 

if(distToNextTick == 0.0) { 
    //the tick is exactly on a vertex 
} 
else { 
    //the tick is on the segment starting at the last vertex 
    //for straight lines calculate as above 
    //for curves use an appropriate algorithm (depending on the type of curve) 
} 
+0

認爲你的'長度'calc有'y'而不是'x':)... – 2012-07-16 08:25:26

+0

@ElRonnoco你說得對,我會解決這個問題的。 – Thomas 2012-07-16 08:26:23

1

你真的想用一個PathIterator(通過的GeneralPath getPath)爲,沿撰寫弧(略扁平)段走。你可以做兩遍 - 一個計算這些段的總長度,另一個實際繪製蜱。在兩次通過之間,您可以計算最接近所需剔號長度的剔號,同時仍然保證開頭和結尾的嘀嗒聲(或者您可以允許開始或結束嘀號與其他嘀嗒聲太接近,並且那麼你只需要一次傳球)。

實際的繪圖代碼與Thomas'類似,但是隨着迭代器在扁平路徑中前進,會出現段跳躍。