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?
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:
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!
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
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
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