none
Drawing sin(x)/x graphic into PictureBox in animation mode by timer component. RRS feed

  • Вопрос

  •  

     

    I need to draw sin(x)/x graphic into PictureBox in animation mode by timer component. I have axes already on my picBox and graphic draws from 0;0. Also I have some code from this forum, but there my graphic draws FROM RIGHT TO THE LEFT, and I need to draw it FROM LEFT TO THE RIGHT. And I need to draw it in animation mode by timer. Could anybody help me?
    Here's my drawing function:

     

    private void drawStream()
      {
        const int scaleX = 35;
        const int scaleY = 35;
    
        Point picBoxTopLeft = new Point(0, 0);
        Point picBoxTopLeftm1 = new Point(-1, 0);     
    
        int halfX = picBox.Width / 2; 
        int halfY = picBox.Height / 2; 
        Size size = new Size(halfX + 20, picBox.Height);
    
        Graphics gr = picBox.CreateGraphics();
        gr.TranslateTransform(halfX, halfY);
    
        gr.ScaleTransform(scaleX, scaleY);
    
        gr.ResetClip();
    
        float lastY = (float)Math.Sin(0);
        float y = lastY;
        Pen p = new Pen(Color.Red, 0.015F);
        float stepX = 1F / scaleX; 
    
        for (float x = 0; x < 15; x += stepX)
        {
          gr.CopyFromScreen(picBox.PointToScreen(picBoxTopLeft), picBoxTopLeftm1, size, CopyPixelOperation.SourceCopy);       
          y = (float)Math.Sin(x);
          gr.DrawLine(p, -stepX, lastY, 0, y);
          lastY = y;        
        } 
      }
    
    Thanx a lot.
    P.S. Sorry for my English, I'm Ukrainian.

     

    1 февраля 2011 г. 22:37

Ответы

  • Попробуйте так: (но рано или позно X переполнится, так что его нужно время от времени обнулять)

        Graphics gr;
        Size size;
        Point picBoxTopLeft, picBoxTopLeftm1;
    
        private void drawStream()
        {
          const int scaleX = 35;
          const int scaleY = 35;
    
          picBoxTopLeft = new Point(0, 0);
          picBoxTopLeftm1 = new Point(1, 0);
    
          int halfX = picBox.Width / 2;
          int halfY = picBox.Height / 2;
          size = new Size(picBox.Width, picBox.Height);
    
          gr = picBox.CreateGraphics();
          gr.TranslateTransform(halfX, halfY);
    
          gr.ScaleTransform(scaleX, scaleY);
    
          gr.ResetClip();
    
          lastY = (float)Math.Sin(0);
          y = lastY;
          p = new Pen(Color.Red, 0.015F);
          stepX = 1F / scaleX;
    
          System.Timers.Timer t = new System.Timers.Timer();
          t.SynchronizingObject = picBox;
          t.Interval = 10;
          t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
          t.Start();
        }
    
        float x = 0;
        float stepX;
        float lastY;
        float y;
        Pen p;
    
        void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          gr.CopyFromScreen(picBox.PointToScreen(picBoxTopLeft), picBoxTopLeftm1, size, CopyPixelOperation.SourceCopy);
          y = (float)Math.Sin(x);
          gr.DrawLine(p, stepX, lastY, 0, y);
          lastY = y;
          x += stepX;
        }
    

    Для связи [mail]
    • Предложено в качестве ответа PashaPashModerator 2 февраля 2011 г. 20:31
    • Помечено в качестве ответа I.Vorontsov 21 февраля 2011 г. 10:51
    2 февраля 2011 г. 13:08

Все ответы

  • Задавай вопросы на русском. Это русскоязычные форумы. :)
    My blog
    2 февраля 2011 г. 9:20
    Модератор
  • Попробуйте так: (но рано или позно X переполнится, так что его нужно время от времени обнулять)

        Graphics gr;
        Size size;
        Point picBoxTopLeft, picBoxTopLeftm1;
    
        private void drawStream()
        {
          const int scaleX = 35;
          const int scaleY = 35;
    
          picBoxTopLeft = new Point(0, 0);
          picBoxTopLeftm1 = new Point(1, 0);
    
          int halfX = picBox.Width / 2;
          int halfY = picBox.Height / 2;
          size = new Size(picBox.Width, picBox.Height);
    
          gr = picBox.CreateGraphics();
          gr.TranslateTransform(halfX, halfY);
    
          gr.ScaleTransform(scaleX, scaleY);
    
          gr.ResetClip();
    
          lastY = (float)Math.Sin(0);
          y = lastY;
          p = new Pen(Color.Red, 0.015F);
          stepX = 1F / scaleX;
    
          System.Timers.Timer t = new System.Timers.Timer();
          t.SynchronizingObject = picBox;
          t.Interval = 10;
          t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
          t.Start();
        }
    
        float x = 0;
        float stepX;
        float lastY;
        float y;
        Pen p;
    
        void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          gr.CopyFromScreen(picBox.PointToScreen(picBoxTopLeft), picBoxTopLeftm1, size, CopyPixelOperation.SourceCopy);
          y = (float)Math.Sin(x);
          gr.DrawLine(p, stepX, lastY, 0, y);
          lastY = y;
          x += stepX;
        }
    

    Для связи [mail]
    • Предложено в качестве ответа PashaPashModerator 2 февраля 2011 г. 20:31
    • Помечено в качестве ответа I.Vorontsov 21 февраля 2011 г. 10:51
    2 февраля 2011 г. 13:08
  • Ух-ты) Дело в том, что я хотела задать вопрос на "международном" форуме, а меня забросило сюда. Спасибо.
    2 февраля 2011 г. 19:32
  • Спасибо большое, Дмитрий. Теперь надо из этого всего сделать sin(x)/x и стартовать его по кнопке. Будем разбираться.
    8 февраля 2011 г. 20:13