我想在任意數量的細分段上繪製刻度線。圓弧是一個GeneralPath
對象。行細分算法
我想繪製n沿圓弧的刻度線(其中n是算法的輸入)。我還需要在弧的開始和結束處畫一個勾號。
有沒有人有任何指針,我可以找到這樣的算法?
我想在任意數量的細分段上繪製刻度線。圓弧是一個GeneralPath
對象。行細分算法
我想繪製n沿圓弧的刻度線(其中n是算法的輸入)。我還需要在弧的開始和結束處畫一個勾號。
有沒有人有任何指針,我可以找到這樣的算法?
那麼,一條線是一個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)
}
認爲你的'長度'calc有'y'而不是'x':)... – 2012-07-16 08:25:26
@ElRonnoco你說得對,我會解決這個問題的。 – Thomas 2012-07-16 08:26:23
你真的想用一個PathIterator(通過的GeneralPath getPath)爲,沿撰寫弧(略扁平)段走。你可以做兩遍 - 一個計算這些段的總長度,另一個實際繪製蜱。在兩次通過之間,您可以計算最接近所需剔號長度的剔號,同時仍然保證開頭和結尾的嘀嗒聲(或者您可以允許開始或結束嘀號與其他嘀嗒聲太接近,並且那麼你只需要一次傳球)。
實際的繪圖代碼與Thomas'類似,但是隨着迭代器在扁平路徑中前進,會出現段跳躍。
線條只是一條水平線,還是可以成一定角度?你使用的是什麼協調系統?蜱是否需要垂直於生產線?或相交等等等等。 ... – 2012-07-16 08:08:57