2011-01-18 17 views
3

私のプログラムでGraphicsPathを描画しようとしていますが、ランダムなスパイクをパスに追加する問題があるようです。これはパスが広いほど悪化するようです。私はこの問題を再現できるテストコードをいくつか作りました。C#GraphicsPath描画の問題

このコードでは、ピクチャボックス(少なくとも630 x 1050のサイズ)と1つのボタンが必要なフォームが必要でした。私は、問題が大きく幅に悪化する方法を示しており、異なる幅で、ここ3回のパスを描いた

private void button1_Click(object sender, EventArgs e) 
    { 
     drawSomeLines(); 

     pictureBox1.Refresh(); 
    } 

    private void drawSomeLines() 
    { 
     //initialise the plot area: 
     Bitmap image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
     pictureBox1.BackgroundImage = image; 

     Graphics g = Graphics.FromImage(image); 

     //create a graphics path: 
     GraphicsPath gPath = new GraphicsPath(); 

     //add sections to the path: 
     gPath.AddLine(587.310059F, 29.2261658F, 229.974731F, 668.2402F); 
     gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F); 
     gPath.AddArc(new RectangleF(203.177368F,560.3876F,421.357F,421.357F), -(90 - 297.72672132554612F), -1.53240252F); 
     gPath.AddLine(224.740067F,678.2186F, 76.6899643F,979.773865F); 

     //draw the path 3 times, at different widths: 
     g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(100, Color.Blue)), 80), gPath); 
     g.DrawPath(new Pen(new SolidBrush(Color.Blue), 40), gPath); 
     g.DrawPath(new Pen(new SolidBrush(Color.Red), 2), gPath);   
    } 

次のようにコードがあります。

なぜこのようなことが起こるのか、どのように防止するのか誰にも分かりますか?どんなアイデアも高く評価されます。

乾杯、

グレッグ

+1

ドットは接続されません。不連続性は線の太さ3ではっきりと見えます。 –

+0

これは表示されません。確かに彼らはすべてGraphicsPathに追加されているとにかく接続する必要があります。たとえば、2つの異なる線を追加して数マイル離れていても、パスを描いたとしても、それらの線は引き続き接続されます。 – Greg

答えて

3

はおそらく、今ではこれを考え出したが、あなたはあなたの行で「スパイク」を取得している理由です:

あなたは、第二の円弧を追加するときあなたのgraphicspathオブジェクトは、そのスタートポイントは追加した最初の弧の終点の前に現れます。これが起こると、グラフィックパスはバックトラックして2番目の円弧を描画しなければならず、特に大きな線幅では、非常にシャープで奇妙な形状のコーナーになります。

あなたの行にギャップがある場合、graphicspathはそれらを埋め込むのに良い仕事をしますが、重複していると結果はあまり良くありません。これに

gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F); 

gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.0F); 

が、それはあなたの2つの円弧セグメントで重複を削除し、graphicspathが、その後のギャップを埋めると描くことができますが、このコード行を変更した場合

「スパイク」を生成する望ましくないコーナー効果なしに滑らかなセグメントを生成する。

ディスプレイの観点からは、オーバーラップするのではなく、ラインにギャップがある方がはるかに優れています。