2012-09-26 35 views
7

以下是Android代碼。如何平滑WPF線段的路徑圖

path.moveTo(xx, yy); 
for (...) { 
    path.lineTo(xx, yy); 
} 
canvas.drawPath(this.path, paint); 

enter image description here

爲了去除尖角,我使用

final CornerPathEffect cornerPathEffect = new CornerPathEffect(50); 
paint.setPathEffect(cornerPathEffect); 

enter image description here

當談到WPF,我使用下面的代碼。

PathFigure pathFigure = new PathFigure(); 
pathFigure.StartPoint = new Point(xx, yy); 
for (...) { 
    LineSegment lineSegment = new LineSegment(new Point(xx, yy), true); 
    lineSegment.IsSmoothJoin = true; 
    pathFigure.Segments.Add(lineSegment); 
} 
PathGeometry pathGeometry = new PathGeometry(new PathFigure[] { pathFigure }); 
drawingContext.DrawGeometry(null, new Pen(Brushes.White, 3), pathGeometry); 

我收到以下效果。

enter image description here

需要注意的是,我使用PolyQuadraticBezierSegmentPolyBezierSegment避免。它傾向於變成不穩定。這意味着,無論何時將新的入點添加到折線圖中,新添加的點都會改變已經在屏幕上繪製的舊路徑。作爲最終效果,你可能觀察到整個線條圖是搖晃

我可以知道在WPF中,我可以如何平滑線段?雖然我用過lineSegment.IsSmoothJoin = true;,但我仍然可以看到尖銳的角落。我可以擁有相當於Android的CornerPathEffect的東西嗎?

回答

0

我知道,殭屍線程職位。您可能已經解決了這個問題,但這裏的事實後有我的想法年......


由於平滑依賴於我認爲這將是很難找到一個平滑算法,看起來線多點合理而不會在前沿產生一些不穩定性。你或許可以減少不穩定的範圍,但只有產生非常奇怪的痕跡的風險。

第一種選擇是使用樣條算法來限制投影假象。例如,Catmull-Rom算法使用插值曲線段兩側的兩個已知點。您可以在曲線的每一端合成兩個附加點,或者簡單地將第一條曲線段繪製成直線。這將給出一條直線作爲最後一個分段,再加上一條曲線作爲倒數第二個分段,如果完全添加了另一個點,它應該變化很小。

或者,您可以通過初始樣條計算運行實際數據點以將點相乘,然後再次通過樣條算法運行這些點。您仍然需要更新最近的2m點(其中m是第一輪的倍數),否則輸出將顯示失真。

關於我能想到的唯一的其他選擇是根據您以前的數據嘗試預測幾個點,即使是相當常規的輸入也很難。我用它來合成我曲線末端的貝塞爾控制點 - 我計算所有點的CP值,並且需要一些東西用於終點 - 還有一些有趣的時刻試圖阻止最終曲線段看起來非常可怕。

哦,還有一個...不要繪製最終曲線段。如果您在P n-1處終止曲線,則曲線應保持穩定。如果您必須展示它,則以不同風格繪製最終細分。由於C-R樣條曲線只需要插值的+/- 2個已知點,因此段P n-2 -P n-1應該足夠穩定。

如果您沒有C-R算法的代碼,則可以使用合成Bezier控制點進行基本相同的操作。而不是試圖描述這個過程,檢查出this blog post這給了過程的一個相當好的細分。 This article附有可能有用的代碼。