Графические популяции комаров в C#
Пример
Когда он вычисляет совокупности для нового поколения, он сохраняет их в следующих списках.
// Данные для графика. private ListFemalePoints, RegularMalePoints, ModifiedMalePoints;
Следующий код показывает, как программа сохраняет новые значения.
// Сохранение точек, представляющих новые значения. FemalePoints.Add( new Point(GenerationNumber, NumFemales)); RegularMalePoints.Add( new Point(GenerationNumber, NumRegularMales)); ModifiedMalePoints.Add( new Point(GenerationNumber, NumModifiedMales));
После вычисления каждого поколения программа обновляет свой PictureBox, чтобы сделать следующий обработчик событий Paint графическими данными населения. (Это забавная часть.)
// График данных. private void picGraph_Paint(object sender, PaintEventArgs e) { e.Graphics.Clear(picGraph.BackColor); if (FemalePoints == null) return; if (FemalePoints.Count < 2) return; // Используйте следующий кратный 10 поколений int num_generations = 10 * (1 + (int)((GenerationNumber - 1) / 10.0)); // Преобразование графика. Rectangle source_rect = new Rectangle( 0, 0, num_generations, (int)PopulationLimit); Point[] dest_points = { new Point(0, picGraph.ClientSize.Height), new Point(picGraph.ClientSize.Width, picGraph.ClientSize.Height), new Point(0, 0), }; e.Graphics.Transform = new Matrix( source_rect, dest_points); using (Pen thin_pen = new Pen(Color.Gray, 0)) { // Рисуем линии, чтобы показать поколения. for (int i = 1; i < num_generations; i++) { e.Graphics.DrawLine(thin_pen, i, 0, i, (int)PopulationLimit); } // Нарисуем данные популяции. thin_pen.Color = Color.Red; e.Graphics.DrawLines(thin_pen, FemalePoints.ToArray()); thin_pen.Color = Color.Green; e.Graphics.DrawLines(thin_pen, RegularMalePoints.ToArray()); thin_pen.Color = Color.Blue; e.Graphics.DrawLines(thin_pen, ModifiedMalePoints.ToArray()); } }
Этот код начинается с очистки PictureBox. Если данные не содержат по меньшей мере двух поколений значений, обработчик событий завершает работу.
Граф рисует кратные 10 поколений за раз. Другими словами, если между 0 и 10 поколениями, программа занимает место на графике для 10 поколений. (За исключением того, что он не рисует что-либо, если их насчитывается менее 2-х поколений.) Если от 11 до 20 поколений данных, он вмещает 20 поколений. Если существует от 21 до 30 поколений данных, это создает пространство для 30 поколений и так далее. Этот подход означает, что программе не нужно изменять размер графика с каждым поколением, что было бы довольно отвлекающим.
Чтобы определить, сколько места ему нужно, программа вычисляет 10 * (1 + (int) ((GenerationNumber - 1) / 10.0)), чтобы определить наименьшее кратное 10 больше или равно к числу поколений данных. Этот расчет вычитает 1 и делит на 10, обрезает до целого числа, добавляет 1 и умножает на 10.
Например, пусть GenerationNumber равно 21. Тогда 21 - 1 = 20. Разделение на 10 и усечение дает 2. Добавление 1 дает 3. Наконец, умножение на 10 дает 30. Это правильно, потому что 30 является наименьшим кратным 10, которое равно по меньшей мере 21.
Для другого примера предположим, что GenerationNumber равно 30. Тогда 30 - 1 = 29. Разделение на 10 и усечение дает 2. Добавление 1 дает 3. Наконец, умножение на 10 дает 30. Это также правильно, потому что 30 является наименьшим кратным 10, которое составляет не менее 30.
После того, как он рассчитал количество поколений, которые он должен отобразить, программа создает преобразование для сопоставления удобной системы координат на PictureBox. Сначала он создает Rectangle, чтобы представить графическую систему координат. Rectangle охватывает область 0 & le; X & lt; num_generations (где num_generations является кратным 10 только что рассчитанных) и 0 & le; Y & lt; PopulationLimit (самая большая разрешенная популяция).
Затем программа создает массив Point для отображения углов Rectangle на PictureBox. Три Точки указывают, где на PictureBox верхний левый верхний правый верхний и нижний левый углы Rectangle должны идти.
Далее код использует Rectangle и Points, чтобы сделать матричную операцию для сопоставления координат и устанавливает Graphics объект Преобразовать в эту Матрицу.
Наконец, код может начать рисовать. Сначала он создает Pen с толщиной 0. Объект Graphics рисует Pen, который имеет толщину толщиной 0, которая может быть нарисована (ширина 1 пиксель), даже если преобразование в противном случае изменило бы ее ширину.
В коде используется цикл для рисования вертикальных линий, показывающих видимые поколения. Затем он просто рисует точки, хранящиеся в списках FemalePoints, RegularMalePoints и ModifiedMalePoints.