2011-08-12 22 views
1

太い線をGraphics.Lines()メソッドを使用して描画したかったのです。しかし、APIにはいくつかのバグがあるようです。次のコードでユーザーコントロールをレンダリングしようとすると、奇妙な画像が表示されます。私は、いくつかのスムージングモードか、この線を描くグリッチを処理できるようなものがあるかどうか疑問に思っていました。ここでC#.NETの太い線の描画の問題

private void UserControl1_Paint(object sender, PaintEventArgs e) 
    { 
     int n = 100; 
     Point[] points = new Point[n]; 

     double x = 2; 
     int y = 50; 

     for (int i = 0; i < n; i++) 
     { 
      Point p = new Point(); 
      p.X = 200 + (int)(i * x); 
      p.Y = 200 + (int)(Math.Sin(i * 0.2) * y); 
      points[i] = p; 
     } 

     Pen pen = new Pen(new SolidBrush(Color.Blue)); 
     //Pen pen = new Pen(new LinearGradientBrush(new Point(0, 0), new Point(0, 100), Color.Black, Color.Red)); 
     pen.Width = 200; 
     e.Graphics.DrawLines(pen, points); 
    } 
+3

「奇妙な」スクリーンショットを明確にすることはできますか? –

+1

なぜあなたは200の幅を使用していますか? –

+0

@ Michaelが何かをしている: 'pen.Width = 1'を作って、あなたが探しているものを手に入れようと思う。 –

答えて

3

あなたのコードは幅200(ピクセル)のペンを使って描画した結果である:

200 pen width

そして、ここでは2の幅である:

2 pen width

pen width propertyは通常ピクセルですが、GraphicsオブジェクトのPageUnit prに基づいていますoperty(それ自体はGraphicsUnitプロパティ)。これらの値を必要な値に設定していることを確認してください。

+0

これは私が得ている正確な結果です。 GraphicsUnitはPixelsに設定されます。私は最初の写真を悪魔のように見せたくありません。私はそれを細かく描きたい。 – dattebayo

+1

滑らかにエッジが不揃いであることを意味する場合、アンチエイリアスを見てください。例えば、 'g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;'(ここでgはグラフィックスオブジェクトです)。線が重なっている反転色空間(白い隙間)を参照している場合、残念ながらそれは別の問題です。これらの隙間を避ける最も太い線は、コードを使って約105ピクセルです。 – JYelton

+0

ちょっとJ、はい、太い線の領域に色の塗りつぶしを意味します。 – dattebayo

6

GDI +が行末にエンドキャップを描画しようとするのを確認します。そのような厚いペンで良い結果に終わらないだろう。 daVinciがモナリザを箒で絵を描いて想像していたことについて。修正:

 Pen pen = new Pen(new SolidBrush(Color.Blue)); 
     pen.EndCap = System.Drawing.Drawing2D.LineCap.Square; 
     pen.StartCap = System.Drawing.Drawing2D.LineCap.Square; 

またはGDI +は、フロントで何か良いアイデアを持っているとバックの代わりになるようにポリゴンを描画:

 e.Graphics.DrawPolygon(pen, points); 

まあ、それはもはや悪魔のようには見えません。線幅を線の細部に比例したままにしておきます。