2010-12-29 4 views
0

Ich versuche, eine Reihe von verbundenen Segmenten zu zeichnen, aber die gekrümmten Segmente scheinen ein Artefakt zu erzeugen, wobei die äußere Seite der Kurve überhaupt nicht glatt ist, sondern sehr gezackt. Dies ist Teil eines GIS-Programms, das ich mache.C# GDI + Kurve Zeichnung Problem

Für diese Zeilen muss die Zeile selbst ziemlich breit sein, da dies den Bereich der Daten darstellt, die in dieser Zeile für die GIS-Daten gesammelt werden können. Es muss auch einen Bereich direkt unter der Linie geben, in dem keine Daten gesammelt werden. Dies kann auch breit sein, aber nicht so breit wie die Hauptlinie.

Ich habe dies mit einem Grafikpfad gemacht, den ich dann erweitern und als eine Clipping-Region verwenden, um den Bereich direkt unter der Linie zu blockieren. Ich zeichne dann die tatsächliche Linie. Der folgende Beispielcode führt dies aus, mit zusammengesetzten Werten für die einfache Regenerierung.

Dies funktioniert gut mit geraden Linien, aber mit gekrümmten Linien gibt es sehr unregelmäßige Formen auf der Außenseite der Kurven. Ich habe keine Ahnung, warum das passiert.

Irgendwelche Ideen wäre sehr willkommen, beifall,

Greg

ich diesen Beispielcode machte eine Grundform mit einem picturebox und einen Knopf auf sie verwenden, wodurch dann, wenn ich auf die Schaltfläche geklickt würde es diese ausführen Methode:

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

     Graphics g = Graphics.FromImage(image); 

     //the width of the pen represents the width of a sonar swathe: 
     Pen widePen = new Pen(new SolidBrush(Color.FromArgb(80, Color.Blue)), 50); 

     PointF[] points = new PointF[4]; 

     //first straight: 
     points[0] = new PointF(287.284149F,21.236269F); 
     points[1] = new PointF(183.638443F,406.936249F); 

     //second straight: 
     points[2] = new PointF(130.842773F, 515.574036F); 
     points[3] = new PointF(-1950.91321F, 3491.868F); 

     //graphics path for the line: 
     GraphicsPath gPath = new GraphicsPath(); 

     gPath.AddLine(points[0], points[1]); 
     gPath.AddArc(new RectangleF(-445.464447F,3.84924316F,640.067444F,640.067444F), -(90 - 105.0412369999982F), 10.8775282F); 
     gPath.AddArc(new RectangleF(-445.464417F, 3.84915161F, 640.067444F, 640.067444F), -(90 - 115.91811484539707F), 10.8775091F); 
     gPath.AddLine(points[2], points[3]); 

     //widen the line to the width equal to what the fish will not be able to see: 
     gPath.Widen(new Pen(Color.White, 10)); 

     //now exclude that widened line from the main graphics: 
     g.ExcludeClip(new Region(gPath)); 

     //draw the swathe line: 
     g.DrawPath(widePen, gPath); 

     //reset the clipping for the next line: 
     g.ResetClip(); 
    } 
+0

möglich Duplikat [C# GDI + Kurve Zeichnung Problem] (http://stackoverflow.com/questions/4546297/c-gdi-curve-drawing-issue) –

+0

Gute Idee, um etwas Code hinzuzufügen, aber Sie können _Bearbeiten Sie Ihre vorhandene Frage, anstatt eine neue Kopie zu veröffentlichen . –

+0

Nebenbei bemerkt, Sie lecken Ressourcen. Die Stift-, Grafik- und Pfadobjekte sollten vor dem Verlassen dieser Methode disponiert werden. –

Antwort

2

Versuchen eine separate GraphicsPath für ausgeschlossene Region zu verwenden:

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

    using(Graphics g = Graphics.FromImage(image)) 
    { 
     PointF[] points = new PointF[4]; 

     //first straight: 
     points[0] = new PointF(287.284149F, 21.236269F); 
     points[1] = new PointF(183.638443F, 406.936249F); 

     //second straight: 
     points[2] = new PointF(130.842773F, 515.574036F); 
     points[3] = new PointF(-1950.91321F, 3491.868F); 

     //graphics path for the line: 
     using(GraphicsPath gPath = new GraphicsPath()) 
     { 
      gPath.AddLine(points[0], points[1]); 
      gPath.AddArc(new RectangleF(-445.464447F, 3.84924316F, 640.067444F, 640.067444F), -(90 - 105.0412369999982F), 10.8775282F); 
      gPath.AddArc(new RectangleF(-445.464417F, 3.84915161F, 640.067444F, 640.067444F), -(90 - 115.91811484539707F), 10.8775091F); 
      gPath.AddLine(points[2], points[3]); 

      //widen the line to the width equal to what the fish will not be able to see: 
      using(GraphicsPath innerPath = (GraphicsPath)gPath.Clone()) 
      { 
       using(Pen pen = new Pen(Color.White, 10)) 
       { 
        innerPath.Widen(pen); 
       } 

       //now exclude that widened line from the main graphics: 
       using(Region reg = new Region(innerPath)) 
       { 
        g.ExcludeClip(reg); 

        //draw the swathe line: 
        //the width of the pen represents the width of a sonar swathe: 
        using(Pen widePen = new Pen(new SolidBrush(Color.FromArgb(80, Color.Blue)), 50)) 
        { 
         g.DrawPath(widePen, gPath); 
        } 

        //reset the clipping for the next line: 
        g.ResetClip(); 
       } 
      } 
     } 

    } 
} 
+0

Danke, das funktioniert wirklich gut! – Greg

0

der Glättungsmodus richtig auf Ihrer Graphics Instanz ein. Schauen Sie sich here an.

+0

Normalerweise stelle ich einen Glättungsmodus ein, hatte aber für dieses Beispiel keinen Code. Ich habe alle Möglichkeiten ausprobiert und es tritt immer noch das gleiche Problem auf. – Greg

0

Versuchen Sie, die CompositingQuality, die InterpolationMode und die Smoothing Eigenschaften festlegen, die Qualität Ihrer Grafik zu erhöhen Objekt:

using(Graphics g = Graphics.FromImage(image)) 
{ 
    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    //... 
} 
+0

Danke, aber das erzeugt immer noch den gleichen Effekt. Ich konnte es lösen, indem ich das benutzte, was Max oben vorgeschlagen hatte. – Greg