Создать массив линий разных размеров - C#
Формулировка задачи:
можно ли создать массив линий, тоесть массив в котором будут линии нарисованные(drawline) но разных размеров?
Решение задачи: «Создать массив линий разных размеров»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DrawLines
{
//класс линии
public class _Line
{
PointF start;//первая точка
PointF end;//вторая точка
Pen pen;//перо, кот рисуется линия
/// <summary>
/// конструктор
/// </summary>
/// <param name="start"> точка1 </param>
/// <param name="end"> точка 2 </param>
/// <param name="pen"> перо </param>
public _Line(PointF start, PointF end,Pen pen)
{
this.start = start;
this.end = end;
this.pen = pen;
}
/// <summary>
/// свойство. возвращает координату Х первой точки
/// </summary>
public float StartX
{
get { return start.X; }
set { start.X = value; }
}
/// <summary>
/// свойство. возвращает координату У первой точки
/// </summary>
public float StartY
{
get { return start.Y; }
set { start.Y = value; }
}
/// <summary>
/// свойство. возвращает координату Х второй точки
/// </summary>
public float EndX
{
get { return end.X; }
set { end.X = value; }
}
/// <summary>
/// свойство. возвращает координату У второй точки
/// </summary>
public float EndY
{
get { return end.Y; }
set { end.Y = value; }
}
/// <summary>
/// возвращает длину линии
/// </summary>
public double Lenght
{
get
{
return Math.Sqrt(Math.Pow((end.X - start.X), 2) + Math.Pow((end.Y - start.Y), 2));
}
}
/// <summary>
/// рисует линию
/// </summary>
/// <param name="graphics"> графический объект </param>
public void Draw(Graphics graphics)
{
graphics.DrawLine(pen, start, end);
}
}
public partial class Form1 : Form
{
Panel panel;//панель
Timer timer;//таймер
Graphics graphics;//граф объект
BufferedGraphics bufferedGraphics;//граф буффер
BufferedGraphicsContext bufferedGraphicsContext;//контекст)
List<_Line> Lines; //наш список с линиями
public Form1()
{
InitializeComponent();
//устанавливаем размеры формы
ClientSize = new System.Drawing.Size(450, 450);
//создаем панель
panel = new Panel();
panel.Location = new Point(5, 5);
panel.Size = new Size(ClientSize.Width - 10, ClientSize.Height - 10);
Controls.Add(panel);
//созд таймер
timer = new Timer();
timer.Interval = 1;
timer.Tick += new EventHandler(timer_Tick);
//инициализируем графику(см метод ниже)
InitializeGraphics();
Random rnd=new Random();
//создаем список линий
Lines = new List<_Line>();
int x = 10;
//забиваем список линиями
for (int i = 0; i < 200; i++)
{
PointF start = new PointF(x, 400);
PointF end = new PointF(x, rnd.Next(400));
_Line line = new _Line(start, end, new Pen(Color.Red));
Lines.Add(line);
x += 2;
}
timer.Start();
}
private void InitializeGraphics()
{
//открываем графику на панели
graphics = panel.CreateGraphics();
bufferedGraphicsContext = new BufferedGraphicsContext();
bufferedGraphics = bufferedGraphicsContext.Allocate(graphics, new Rectangle(0, 0, panel.Width, panel.Height));
}
int currentLine;//счетчик линий
void timer_Tick(object sender, EventArgs e)
{
//рисуем все из буффера(метод ниже)
DrawToBuffer();
//сортируем по 1 каждую милисекунду
if (currentLine < Lines.Count - 1)
{
if (Lines[currentLine].Lenght > Lines[currentLine + 1].Lenght)
{
_Line tLine = Lines[currentLine];
Lines[currentLine] = Lines[currentLine + 1];
Lines[currentLine + 1] = tLine;
}
currentLine++;
}
else
currentLine = 0;
}
private void DrawToBuffer()
{
//чистим буффер
bufferedGraphics.Graphics.Clear(Color.White);
int x = 10;
for (int i = 0; i < Lines.Count; i++)
{
//меняем координаты Х всех точек(при сортировке координаты не менялись,менялись только линии(местами переставляли)))
Lines[i].StartX = Lines[i].EndX = x;
//рисуем линию
Lines[i].Draw(bufferedGraphics.Graphics);
x += 2;
}
bufferedGraphics.Render();//мышь наведи почитай
}
}
}//усё