2016-04-04 34 views
0

Bir nokta listesi kullanarak bir işlev grafiği çizmek istiyorum. Fakat bu kadar çok nokta var olduğunda yavaşlıyor. Sanırım mevcut çizimi silmeden çizebiliyorsam noktaları saklamak zorunda değilim. Invalidate'un geçerli çizimi temizlediğini biliyorum. Bu numarayı nasıl yapabilirim? Geçerli Grafik nesnesini nasıl netleştiremiyorum?

Ben şu anda bu yöntemi kullanarak:

CoordinateSystem cos = new CoordinateSystem(); 
    List<PointF> points = new List<PointF>(); 
    float a = -20; 
    void Form1_Tick(object sender, EventArgs e) 
    { 
     panel1.Invalidate(); 
    } 
    void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     double x = a; 
     double y = Root(x, 3); 
     cos.DrawSystem(e.Graphics); 
     points.Add(cos.RelativePoint(new PointF((float)x, (float)y))); 
     for (int i = 1; i < points.Count - 1; i++) 
     { 
     e.Graphics.DrawLine(Pens.Red,points[i],points[i+1]); 
     } 
     a += 0.05f; 

    } 

GÜNCELLEME

Sana yeniden çizmek için bir Bitmap kullandık önermek gibi. Ama sonucun kalitesi benim için iyi değil. Ayrıca, yalnızca veri değiştiğinde Invalidate'u nasıl arayacağımı bilmiyorum. Çünkü burada Invalidate yöntemi çağrıldığında veriler değişir.

Kodu:

CoordinateSystem cos = new CoordinateSystem(); 
    Bitmap bmp; 
    float a = -20; 
    void Form1_Tick(object sender, EventArgs e) 
    { 
     panel1.Invalidate(); 
    } 

    void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     double x = a; 
     double y = Root(x, 3); 
     PointF rel = cos.RelativePoint(new PointF((float)x, (float)y)); 
     using (Graphics grp = Graphics.FromImage(bmp)) 
     { 
      grp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      cos.DrawSystem(grp); 
      grp.DrawEllipse(Pens.Red, rel.X - 0.5f, rel.Y - 0.5f, 1, 1); 
     } 
     e.Graphics.DrawImage(bmp, 0, 0); 
     a += 0.01f; 
    } 

Sonucun gördüğünüz gibi, sayı metinleri iyi bir kaliteye sahip: enter image description here

GÜNCELLEME 2: Tamam, kodumu biraz değişti. Sadece koordinat sistemi Load olayında bir kez çizerek şimdi iyi bir kaliteye sahip. Herkese yardım için teşekkürler!

+0

Bir Timer onayından Invalidate() 'yi çağırıyorsunuz? Neden bunu yapasın. Veri değiştiğinde kendini yeniden çizmek için formu tetiklemek için Invalidate'i çağırmanız yeterlidir. – NineBerry

+3

Bir bitmapi çizin, sonra boya etkinliğinizde bir DrawImage yapın. Zamanlayıcı etkinliğiniz gereksiz görünüyor. Kullandığınız grafik değişkenlerini nasıl güncellersiniz? – LarsTech

+0

Evet, bir tampon görüntüsüne çizin, sonra kontrolünüze çizin. Ve bir onay etkinliği işleyicisi içine geçersiz kılma. – ManoDestra

cevap

2

Grafikler "temizle" için bir yol yoktur. Bir Control çekilmesi gerektiğinde (geçersiz kılındı), her şeyi tekrar çizmeniz gerekir.

Kodunuzu geliştirmenin bir yolu, noktalar arasında yineleme yapmak yerine Graphics.DrawLines()'u kullanmak ve her bir ayrı satır için Graphics.DrawLine()'u aramaktır.

void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
    double x = a; 
    double y = Root(x, 3); 
    cos.DrawSystem(e.Graphics); 
    points.Add(cos.RelativePoint(new PointF((float)x, (float)y))); 
    e.Graphics.DrawLines(Pens.Red, points.ToArray()); 
} 
1

Boya olay bir e.ClipRectangle özelliğine sahiptir.

Bu, herşeyi yeniden çizmek için her zaman gerekli olmadığından (örneğin, bir formun bir kısmı formunuzun üzerine taşınır ve yeniden taşınır), boyanması gereken gerçek bir dikdörtgendir.

Böylece yapabileceğiniz tek şey, yalnızca bu dikdörtgenin içine giren çizgileri çizmektir.

Ancak Invalidate'i çağırıyorsanız, bunun tüm şeylerin yeniden çizilmesi gerektiğini işaret ettiğini söylemişti.

Belki de çizdiğin bir parçayı tutmak daha iyi olur ve yeni olanları çizebilir misin?

+1

“Invalidate” in bir argümanı olduğuna dikkat ederek, argüman olarak yeniden çizilmesi gereken bölgeyi alır. –