2012-03-30 190 views
0

我在WPF中繪製了一些貝塞爾曲線,大部分它都在工作,但我在每個片段之間都會發現一些微弱的分離。正如你所看到的,他們甚至出現在連續的部分,所以我不認爲這個問題是由於部分數量不足。 (此圖片是在4倍的放大倍率。)WPF中的貝塞爾曲線

Faint separations

我使用System.Windows.Shapes.Line對象的集合來畫他們。他們被實例化的代碼如下所示:

Shapes.Line Line = new Shapes.Line(); 
Line.Stroke = Brush; 
Line.HorizontalAlignment = Windows.HorizontalAlignment.Left; 
Line.VerticalAlignment = Windows.VerticalAlignment.Center; 
Line.StrokeThickness = 10; 

我的理論是,這種分離是由於這樣的事實,其中一個行結束點是同一個點的下一開始的地方,但我不能確定什麼是解決的最好辦法這個。我很新,所以我不想在黑客入侵之前詢問是否有人嘗試過真正的解決方案,讓這些模糊分離消失。

編輯:

這裏是我使用的生成段的代碼。 ILine接口是我創建的東西,但它的點值只是在程序中稍後轉換爲System.Windows.Shapes.Line各自的值。

public static void FormBezier(List<ILine> Lines, Point[] pt) 
{ 
    if (Lines.Count == 0) return; 

    double t, dt, x0, y0, x1, y1; 

    t = 0.0; 
    dt = 1.0/Lines.Count; 
    x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X }); 
    y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y }); 
    t += dt; 

    for(int index = 1; index < Lines.Count - 1; index++) 
    { 
     x0 = x1; 
     y0 = y1; 
     x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X }); 
     y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y }); 

     Lines[index].Start.X = x0; 
     Lines[index].End.X = x1; 
     Lines[index].Start.Y = y0; 
     Lines[index].End.Y = y1; 
     t += dt; 
    } 

    t = 1.0; 
    x0 = x1; 
    y0 = y1; 
    x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X }); 
    y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y }); 
    Lines[Lines.Count - 1].Start.X = x0; 
    Lines[Lines.Count - 1].End.X = x1; 
    Lines[Lines.Count - 1].Start.Y = y0; 
    Lines[Lines.Count - 1].End.Y = y1; 
} 
public static double X(double t, double[] x) 
{ 
    return 
     x[0] * Math.Pow((1 - t), 3) + 
     x[1] * 3 * t * Math.Pow((1 - t), 2) + 
     x[2] * 3 * Math.Pow(t, 2) * (1 - t) + 
     x[3] * Math.Pow(t, 3); 

} 
+0

奇數。你能提供更多的代碼嗎? – 2012-03-30 18:44:18

+0

當然。雖然有很多。你可以說得更詳細點嗎? – 2012-03-30 19:09:38

+0

剪出一些實際上用所有線條設置繪製貝塞爾的東西等等,最好是編譯。 – 2012-03-30 19:17:27

回答

1

顯然是繪圖算法的錯誤。我不是最好的WPF,但你可能想看看this博客文章。

2

瘋狂猜測,這可能是一個舍入誤差。 WPF中使用的單位不是像素,它們是獨立於分辨率的單位。當WPF實際繪製一些東西時,它必須將這些單位轉換爲任何正在繪製的屏幕上的實像素。如果轉換結束於真實像素之間的一半,則會遮蔽這些像素以嘗試在每個真實像素中接近半個像素。因此,您有時會在假想的黑線周圍獲得灰色像素(抗鋸齒)。

財產SnapsToDevicePixels可能會幫助你。