Компьютерная графика, мультимедиа и игры на Visual C#

       

Непрерывный график-осцилло­грамма


Листинг 30.1. Переменные и метод для построения графика.

//Объявляем и инициализируем переменные:

float x = 0;

float y0 = 49;

float y1 = 0;

float k = 10;

float b = -5;

//Перемещение графика dx за каждый интервал времени::

private const float dx = 2;

//Определяем значение функции y=f(x):

private float f()

{

      //Генератор в виде метода NextDouble возвращает

      //случайное число типа double, которое присваиваем x:

      Random myRandom = new Random();

      x = Convert.ToSingle(myRandom.NextDouble());

      //Вычисляем новое значение функции y=f(x):

      y1 = y0 + k * x + b;

      //Задаем интервал для значений функции y=f(x):

      if (y1 > 98.9) y1 = 98.9f;

      if (y1 < 0.999) y1 = 0.999f;

      return y1;

}

Листинг 30.2. Метод Form1_Load.

private void Form1_Load(object sender, EventArgs e)

{

      //Для рисования графика создаем объект myGraphics,

      //связываем его с PictureBox1 и масштабируем:

      Bitmap myBitmap = new Bitmap(pictureBox1.Width,

                                    pictureBox1.Height);

      Graphics myGraphics = Graphics.FromImage(myBitmap);

      myGraphics.ScaleTransform(1, -100.0f /

                                     pictureBox1.Height);

      myGraphics.TranslateTransform(0, -100);

      //Проектируем координатные горизонтальные линии:

      Pen myPen = new Pen(Color.Blue, 1);

      int i;

      for (i = 10; i <= 100; i+=10)

                  myGraphics.DrawLine(myPen,

                  0, i, pictureBox1.Width, i);

      //Показываем координатные горизонтальные линии

      //на панели PictureBox1:

      pictureBox1.Image = myBitmap;

      //Освобождаем ресурсы, занятые объектом myGraphics:

      myGraphics.Dispose();

}

Для программной реализации алгоритма из первого параграфа дважды щелкаем значок Timer (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 30.3. Метод Timer1_Tick.

private void timer1_Tick(object sender, EventArgs e)


{
      //Перемещаем прежний график влево:
      Bitmap myBitmap = new Bitmap(pictureBox1.Width,
                                    pictureBox1.Height);
      Graphics g = Graphics.FromImage(myBitmap);
      g.DrawImage(pictureBox1.Image, -dx, 0);
      //Проектируем координатные горизонтальные линии:
      g.ScaleTransform(1, -100.0F / pictureBox1.Height);
      g.TranslateTransform(0, -100);
      Pen myPen = new Pen(Color.Blue, 1);
      int i;
      for (i = 10; i <= 100; i+=10)
            g.DrawLine(myPen, pictureBox1.Width - dx, i,
                                     pictureBox1.Width, i);
      // На каждом интервале времени
      //получаем новое значение функции f():
      y1 = f();
      //Справа рисуем новую часть графика:
      Pen myPen2 = new Pen(Color.Black, 1);
      g.DrawLine(myPen2,
                  pictureBox1.Width - 1 - dx, y0,
                  pictureBox1.Width - 1, y1);
      y0 = y1;
      //Показываем новую часть графика
      //на панели PictureBox1:
      pictureBox1.Image = myBitmap;
}

Содержание раздела