C# ve chart'da veri kaydırma

Başlatan Mucit23, 18 Eylül 2024, 18:00:25

Mucit23

Selamlar

C#'ın kendi chart kontrolünü kullanarak veri kaydırma nasıl yapılır? Örnek veriyorum 100 noktalı bir pencere için osiloskop efekti yapmak istiyorum.



İstediğim gibi yapamadım bir türlü.

tunayk

Chart kontrolü biraz yavaş çalışıyor bu işlerde. Normalde point arraydan 0. Elemanı alıp yeni değeri eklersin. Refresh edersin. Çalışır ama pek şık bir çözüm değil.

Mucit23

Evet onu denedim gerçekten çok yavaş çalışıyor farklı bir alternatif arıyorum

kudretuzuner

Merhaba,
Ben de 00-FF arası PC'ye gelen 250 civarında hex kodlarını okuyacağım ama başaramadım. Dikey bargraf olarak okudum ama sinyal olarak okumak için her bir datayı bir bit ihtiva eden PictureBox ları yan yana diziyorum. Gelen her bir data sinyalinin resmini dosyadan ekrana çağıracağım. Bakalım olacak mı? frekans 200 hz civarı baudrate 9600 dür.
VB.Net 2010 express edition kullanmaktayım.
Amatör

tunayk

Daha hızlı grafik kontrollerden faydalanabilirsiniz, ya da grafiği kendiniz çizdirirsiniz. Drawing Namespace altındaki komutlar ile.

Bir örnek olarak ;

Formda görüntüleme için picturebox kullanabilirsiniz. Grafiği Picturebox ebatlarında bir bitmap objesi üzerine çizin ve gösterin. Arkaplanda bir sonraki karede görülecek olan kaydırılmış formdaki grafiği başka bir bitmap üzerine çizdirin. Gösterme zamanı gelince 2. resmi picturebox'a image olarak atayın. O ekranda görülürken siz bir sonraki kareyi hazırlayın. Örneğin 40ms timer ile sürekli resim güncellerseniz, göz sürekli akan bir görüntü görür.

Mevcut resmi kaydırıp, sadece yeni gelen kısmı ekleyerek de çizim yapılabilir.  Performans gereksinimine göre çeşitli yollar var.

DirectX / OpenGL kütüphanesi ile de çeşitli işler yapılabilir ancak sizin için çok gerekli olacağını düşünmüyorum   

tunayk

Alıntı yapılan: kudretuzuner - 18 Eylül 2024, 22:03:51Merhaba,
Ben de 00-FF arası PC'ye gelen 250 civarında hex kodlarını okuyacağım ama başaramadım. Dikey bargraf olarak okudum ama sinyal olarak okumak için her bir datayı bir bit ihtiva eden PictureBox ları yan yana diziyorum. Gelen her bir data sinyalinin resmini dosyadan ekrana çağıracağım. Bakalım olacak mı? frekans 200 hz civarı baudrate 9600 dür.
VB.Net 2010 express edition kullanmaktayım.

Hocam sizinki de bir yöntem elbetteki ancak o kadar uğraşmanıza gerek yok.
Örneğin boş bir form üzerinde istediğiniz bir noktadan itibaren her bir sayısal değere karşılık bir nokta koyarsınız

Form.CreateCraphics() fonksiyonu size çizim için kullancağınız yüzeyi ve gerekli tüm araçları sağlar.  Graphics.DrawLine() komutu ile itediğiniz iki nota arasına, kalınlığını, rengini sizin belirlediğiniz çizgi atabilirsiniz.  İsterseniz nokta nokta gidin, isterseniz noktadan noktaya çizgi atın. size kalmış.
Graphics kütüphanesi zevklidir. Biraz geometri gerektirir.
 :) 

tunayk

Bir formun üzerinde yerleştirilmiş PictureBox üzerinde grafik çizen örnek kodu aşağıda veriyorum. Temel prensibi anladıktan sonra, eksen çizgileri, yazılar vs. süs püs eklenebilir.
        Point P1, P2;
        Random r = new Random();
        Pen pLine = new Pen(Color.Red, 2);
        Bitmap b1, b2;
        int step=5;
        bool t = false;
        List<int> deger = new List<int>();
        private void Form1_Load(object sender, EventArgs e)
        {
            
           
            b1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics G = Graphics.FromImage(b1);
            G.Clear(Color.White);
            P1 = new Point(0, pictureBox1.Height);
            for (int i = 0; i < 300; i++)
            {
                deger.Add( r.Next(0, pictureBox1.Height-40));                
                if (i > 0) 
                {
                    P2 = new Point(i*step, pictureBox1.Height-deger[i]);
                    G.DrawLine(pLine, P1, P2);
                    P1.X = P2.X;
                    P1.Y = P2.Y;
                }
            }
            pictureBox1.Image  = b1;
        }

        void Draw() 
        {
            try
            {
                b1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                Graphics G = Graphics.FromImage(b1);
                G.Clear(Color.White);
                deger.RemoveAt(0);
                deger.Add(r.Next(0, pictureBox1.Height - 40));
                P1 = new Point(0, pictureBox1.Height);
                for (int i = 0; i < 100; i++)
                {                    
                        P2 = new Point(i * step, pictureBox1.Height - deger[i]);
                        G.DrawLine(pLine, P1, P2);
                        P1.X = P2.X;
                        P1.Y = P2.Y;                   
                }
                pictureBox1.Image = b1;
            }
            catch (Exception ex)
            {

            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
             
            Draw();
        }