2012-03-30 28 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; 

私の理論が、私は修正するための最良の方法です何がわからないこの分離は1行が終了する点は同じポイントは、次の始まる場所であるという事実によるものであるということですこの。私はこれでかなり新しいので、誰かがこれらのかすかな分裂を消滅させるために何か試して真の解決策を持っているかどうか尋ねる前に、ハッキングしたくない。

EDIT:

ここでは、私は、セグメントを生成するために使用しているコードです。 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

奇数もう少しコードを教えてもらえますか? –

+0

間違いなく。しかし、たくさんあります。あなたはもっと具体的になりますか? –

+0

すべてのライン設定などで実際にベジェを描画するものを切り取ります。コンパイルするのが望ましいでしょう。 –

答えて

1

明らかに描画アルゴリズムの障害。私はWPFで最善​​ではないが、あなたはthisブログ記事を見たいかもしれません。

2

野生の推測では、おそらく丸め誤差です。 WPFで使用される単位はピクセルではなく、分解能に依存しない単位です。 WPFが実際に何かを描画するときは、描画対象の画面上でそれらの単位を実際のピクセルに変換する必要があります。変換が実際のピクセルの半分になると、実際のピクセルの半分になるようにそれらのピクセルをシェーディングします。したがって、ときどき黒い線の回りに灰色のピクセルが表示されることがあります(アンチエイリアシング)。

プロパティSnapsToDevicePixelsがお手伝いします。