Автор — Кузьма, школьник
Известно, что ГАЭС работает в двух режимах — насосном и турбинном.
В первом режиме ГАЭС, потребляя избыточную энергию от тепловых электростанций в часы наименьших нагрузок в системе (обычно 7—-12 часов в сутки), перекачивает воду из нижнего питающего водохранилища в верхний аккумулирующий бассейн (зарядка станции).
Во втором режиме ГАЭС работает в часы максимального потребления энергии в системе (2—6 час. в сутки). Расходуя воду из верхнего бассейна, она вырабатывает электроэнергию в систему (разрядка станции).
Подробности о ГАЭС, см. например: Гидроаккумулирующая электростанция
Решение
Расположим на форме элементы: pictureBox1 (для рисования); четыре кнопки: Начать, Выработка электроэнергии, Аккумуляция воды, Стоп; label1 и textBox1 для информации о заполнении бассейнов; label2 и label3 (на pictureBox1) для индикации выработанной/запасенной энергии. Не визуальный компонент timer1 используем для отображения динамики заполнения/сработки бассейнов (Interval=500 мс).
Текст программы:
using System; using System.Drawing; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace ГАЭС { public partial class Form1 : Form { Graphics gr; // графический объект SolidBrush brw; // кисть - Вода SolidBrush brs; // кисть - Небо HatchBrush brg; // кисть - ГАЭС Color DashBug = Color.LimeGreen; // цвет штриховки Color C_water = Color.Blue; // цвет воды Color C_sky = Color.MintCream; // цвет неба Color C_kontur = Color.Maroon; // цвет контуров Pen peng; // перо - границы Pen penw; // перо - труба Pen pent; // труба без воды int x; // % заполнения верхнего водохранилища bool generator; // генерация электроэнергии (true) или гидроаккумуляция (false) int Ev; // Выработка электроэнергии, кВт-ч int Ez; // запас гидроэнергии, кВт-ч // начальная загрузка public Form1() { InitializeComponent(); brw = new SolidBrush(C_water); brs = new SolidBrush(C_sky); brg= new HatchBrush(HatchStyle.DashedUpwardDiagonal, DashBug, Color.Gray); penw = new Pen(C_water, 6); peng = new Pen(C_kontur, 3); pent = new Pen(Color.Gray,6); gr = pictureBox1.CreateGraphics(); //инициализируем объект типа графики, привязав его к PictureBox } // Показать схему ГАЭС private void button1_Click(object sender, EventArgs e) { x = Convert.ToInt32(textBox1.Text); foto(); } // Схема ГАЭС с некоторым уровнем воды, x в % private void foto() { gr.Clear(C_sky); gr.FillRectangle(brw, 0, 100-x, 100, 100); gr.DrawRectangle(peng, 0, 0, 101, 101); gr.FillRectangle(brw, 0, 301+x, 200, 100-x); gr.DrawRectangle(peng, 0, 301, 200,100); gr.FillRectangle(brg, 0, 101, 101, 201); gr.DrawBezier(penw, 99, 99, 200,200,100,200,120,400); timer1.Enabled = true; } // Выработка электроэнергии private void button2_Click(object sender, EventArgs e) { generator = true; timer1.Start(); Ev = 0; } // Гидроаккумуляция private void button3_Click(object sender, EventArgs e) { generator = false; timer1.Start(); Ez = 0; } // динамика процесса private void timer1_Tick(object sender, EventArgs e) { if (generator) { if (x > 10) // генерация { gr.DrawBezier(penw, 99, 99, 200, 200, 100, 200, 120, 400); gr.FillRectangle(brs, 2, 100 - x, 98, 1); gr.FillRectangle(brw, 2, 301 + x, 197, 1); x = x - 1; Ev = Ev + 1000; textBox1.Text = x.ToString(); label2.Text = "Выработано " + Ev.ToString() + " кВт-ч электроэнергии"; label3.Text = ""; } else // x=10% - минимальный запас gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400); } else { if (x < 90) // аккумулирование { gr.FillRectangle(brw, 2, 100 - x, 98, 1); gr.FillRectangle(brs, 2, 301 + x, 197, 1); gr.DrawBezier(penw, 99, 99, 200, 200, 100, 200, 120, 400); x = x + 1; Ez = Ez + 1000; textBox1.Text = x.ToString(); label3.Text = "Запасено " + Ez.ToString() + " кВт-ч гидроэнергии"; label2.Text = ""; } else // заполнение не более 90% gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400); } } // стоп private void button4_Click(object sender, EventArgs e) { gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400); Ev = 0; Ez = 0; timer1.Stop(); } } }
Окно программы в режиме аккумуляции воды:
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
КОММЕНТАРИИ:
1. Для школьных занятий предложена полезная демонстрация принципа работы ГАЭС в динамике.
2. Класс Form1 содержит 15 полей и 7 методов, динамика процесса определяется методом timer1_Tick(). Программа имеет понятную структуру.
3. Для задания режима работы ГАЭС используется булева переменная generator=true/false.
4. Текст программы снабжен достаточными комментариями.
5. Для раскраски фундамента верхнего бассейна автор неожиданно использовал кисть со стилем штриховки класса HatchBrush из библиотеки System.Drawing.Drawing2D.
6. Для рисования используются методы векторной графики класса Graphics, что обеспечивает быструю анимацию процесса.
7. Данный пример может быть полезен для приобретения навыков визуального программирования и освоения графики.
Спасибо Кузьме!