Непрерывный график-осциллограмма
Листинг 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;
}