/// <summary> /// Метод, для вычисления длины параллельной цепи в схеме. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <returns></returns> private int CalculateParallelCircuitLength(ParallelCircuit circuit) { List <SerialCircuit> serials = new List <SerialCircuit>(); for (int i = 0; i < circuit.Circuit.Count; i++) { if (circuit.Circuit[i] is SerialCircuit) { serials.Add(circuit.Circuit[i] as SerialCircuit); } } if (serials.Count > 0) { int length = CalculateSerialCircuitLength(serials[0]); for (int i = 1; i < serials.Count; i++) { if (CalculateSerialCircuitLength(serials[i]) > length) { length = CalculateSerialCircuitLength(serials[i]); } } return(length + 30); } return(110); }
/// <summary> /// Метод, для вычисления высоты между уровнями в параллельной цепи. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <returns></returns> private int CalculateParallelCircuitHeight(ParallelCircuit circuit) { int count = 1; for (int i = 0; i < circuit.Circuit.Count; i++) { if (circuit.Circuit[i] is SerialCircuit) { SerialCircuit serial = circuit.Circuit[i] as SerialCircuit; for (int j = 0; j < serial.Circuit.Count; j++) { if (serial.Circuit[j] is ParallelCircuit) { count += CalculateParallelCircuitHeight(serial.Circuit[j] as ParallelCircuit); } } if (count > 4) { return(count * 2); } if (count <= 4 && count > 2) { return(count); } } } return(30); }
/// <summary> /// Вычисляет размер рисунка эл. цепи с параллельным соединением. /// </summary> /// <param name="circuitBase">Эл. цепь с параллельным соединением.</param> /// <returns>Размер рисунка эл.цепи.</returns> private static Size GetSize(ParallelCircuit circuitBase) { var size = circuitBase.Count > 0 ? new Size(0, 0) : new Size(_emptyImageSize.Width, _emptyImageSize.Height); foreach (var component in circuitBase) { if (component is IElement element) { size.Height = size.Height + GetSize(element).Height; size.Width = size.Width < GetSize(element).Width ? GetSize(element).Width : size.Width; } else if (component is SerialCircuit sc) { var scSize = GetSize(sc); size.Width = size.Width < scSize.Width ? scSize.Width : size.Width; size.Height = size.Height + scSize.Height; } else if (component is ParallelCircuit pc) { var pcSize = GetSize(pc); size.Width = size.Width < pcSize.Width ? pcSize.Width : size.Width; size.Height = size.Height + pcSize.Height; } } size.Width += InputLineLength + OutputLineLength; return(size); }
/// <summary> /// Тестовая схема №5. /// </summary> /// <returns></returns private IComponent _circuit5() { var R1 = new Resistor("R1", 100); var R2 = new Resistor("R2", 100); var C1 = new Capacitor("C1", 0.005); var C2 = new Capacitor("C2", 0.005); var C3 = new Capacitor("C3", 0.005); var L1 = new Inductor("L1", 0.5); var L2 = new Inductor("L2", 0.5); var circuit1 = new SerialCircuit("circuit1"); var circuit2 = new ParallelCircuit("circuit2"); var circuit3 = new SerialCircuit("circuit3"); var circuit4 = new SerialCircuit("circuit4"); var circuit5 = new ParallelCircuit("circuit5"); circuit5.Circuit.Add(C3); circuit5.Circuit.Add(R1); circuit4.Circuit.Add(R2); circuit4.Circuit.Add(L2); circuit3.Circuit.Add(L1); circuit3.Circuit.Add(circuit5); circuit2.Circuit.Add(C2); circuit2.Circuit.Add(circuit3); circuit2.Circuit.Add(circuit4); circuit1.Circuit.Add(C1); circuit1.Circuit.Add(circuit2); return(circuit1); }
/// <summary> /// Тестовая схема №2. /// </summary> /// <returns></returns private IComponent _circuit2() { var R1 = new Resistor("R1", 100); var C1 = new Capacitor("C1", 0.005); var L1 = new Inductor("L1", 0.5); var circuit1 = new SerialCircuit("circuit1"); var circuit2 = new ParallelCircuit("circuit2"); circuit2.Circuit.Add(R1); circuit2.Circuit.Add(C1); circuit1.Circuit.Add(circuit2); circuit1.Circuit.Add(L1); return(circuit1); }
/// <summary> /// Тестовая схема №6. /// </summary> /// <returns></returns> private IComponent _circuit6() { var R1 = new Resistor("R1", 100); var circuit1 = new ParallelCircuit("circuit1"); var circuit2 = new SerialCircuit("circuit2"); var circuit3 = new SerialCircuit("circuit3"); var circuit4 = new ParallelCircuit("circuit4"); var circuit5 = new ParallelCircuit("circuit5"); var circuit6 = new SerialCircuit("circuit6"); var circuit7 = new ParallelCircuit("circuit7"); var circuit8 = new ParallelCircuit("circuit8"); var circuit9 = new SerialCircuit("circuit9"); circuit7.Circuit.Add(R1); circuit7.Circuit.Add(R1); circuit6.Circuit.Add(R1); circuit6.Circuit.Add(circuit7); circuit5.Circuit.Add(R1); circuit5.Circuit.Add(circuit6); circuit8.Circuit.Add(circuit6); circuit8.Circuit.Add(R1); circuit4.Circuit.Add(R1); circuit4.Circuit.Add(R1); circuit3.Circuit.Add(R1); circuit3.Circuit.Add(circuit4); circuit3.Circuit.Add(R1); circuit2.Circuit.Add(R1); circuit2.Circuit.Add(circuit5); circuit9.Circuit.Add(R1); circuit9.Circuit.Add(circuit8); circuit1.Circuit.Add(circuit2); circuit1.Circuit.Add(circuit9); return(circuit1); }
/// <summary> /// Метод, для отрисовки параллельной цепи. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <param name="bmp">Рисунок</param> /// <param name="x">Входное значение координаты по оси Ох</param> /// <param name="y">Входное значение координаты по оси Оу</param> /// <returns></returns> private Bitmap DrawParallelCircuit(ParallelCircuit circuit, Bitmap bmp, int x, int y) { Graphics graph = Graphics.FromImage(bmp); graph.DrawLine(_pen, x, y, x + 15, y); int startY = y; int height = CalculateParallelCircuitHeight(circuit); y -= height * (circuit.Circuit.Count - 1) / 2; var h = y; foreach (IComponent component in circuit.Circuit) { if (component is Resistor) { bmp = DrawResistor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit)); y += height; } else if (component is Inductor) { bmp = DrawInductor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit)); y += height; } else if (component is Capacitor) { bmp = DrawCapacitor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit)); y += height; } else { bmp = DrawSerialCircuit(component as SerialCircuit, bmp, x + 15, y, CalculateParallelCircuitLength(circuit)); y += height; } } graph.DrawLine(_pen, x + 15, h, x + 15, y - height); graph.DrawLine(_pen, x + CalculateParallelCircuitLength(circuit) - 15, h, x + CalculateParallelCircuitLength(circuit) - 15, y - height); graph.DrawLine(_pen, x + CalculateParallelCircuitLength(circuit) - 15, startY, x + CalculateParallelCircuitLength(circuit), startY); return(bmp); }
/// <summary> /// Создает экземпляр элемента управления. /// </summary> public ParallelCircuitControl() { InitializeComponent(); _circuit = new ParallelCircuit(); }
/// <summary> /// Метод отрисовывающий эл. цепь с параллельным соединением. /// </summary> /// <param name="circuitBase">Эл. цепь с параллельным соединением.</param> /// <returns>Рисунок эл. цепи.</returns> private static Bitmap GetCircuitImage(ParallelCircuit circuitBase) { var size = GetSize(circuitBase); var bitmap = new Bitmap(size.Width, size.Height); int x = InputLineLength; int y = 0; var firstComponent = circuitBase.FirstOrDefault(); var lastElement = circuitBase.LastOrDefault(); if (firstComponent == null || lastElement == null) { return(bitmap); } int firstHeight = GetSize(firstComponent).Height; int lastHeight = GetSize(lastElement).Height; using (Graphics g = Graphics.FromImage(bitmap)) { g.DrawLine(_standartPen, 0, size.Height / ImageDellimitterConst, InputLineLength, size.Height / ImageDellimitterConst); g.DrawLine(_standartPen, 0, size.Height / ImageDellimitterConst - 1, InputLineLength, size.Height / ImageDellimitterConst - 1); g.DrawLine(_standartPen, x, y + firstHeight / ImageDellimitterConst, x, size.Height - lastHeight / ImageDellimitterConst); g.DrawLine(_standartPen, x + 1, y + firstHeight / ImageDellimitterConst, x + 1, size.Height - lastHeight / ImageDellimitterConst); foreach (var component in circuitBase) { if (component is IElement element) { var elementImage = GetElementImage(element); g.DrawImage(elementImage, new Point(x, y)); g.DrawLine(_standartPen, x + elementImage.Width, y + elementImage.Height / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, y + elementImage.Height / ImageDellimitterConst); g.DrawLine(_standartPen, x + elementImage.Width, y + elementImage.Height / ImageDellimitterConst - 1, bitmap.Width - ParallelConnectorMargin, y + elementImage.Height / ImageDellimitterConst - 1); y += elementImage.Height; } else if (component is CircuitBase circuitComponent) { Bitmap circuitImage = new Bitmap(1, 1); if (circuitComponent is SerialCircuit sc) { circuitImage = GetCircuitImage(sc); } else if (circuitComponent is ParallelCircuit pc) { circuitImage = GetCircuitImage(pc); } g.DrawImage(circuitImage, new Point(x, y)); g.DrawLine(_standartPen, x + circuitImage.Width, y + circuitImage.Height / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, y + circuitImage.Height / ImageDellimitterConst); g.DrawLine(_standartPen, x + circuitImage.Width, y + circuitImage.Height / ImageDellimitterConst - 1, bitmap.Width - ParallelConnectorMargin, y + circuitImage.Height / ImageDellimitterConst - 1); y += circuitImage.Height; } } g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, firstHeight / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, size.Height - lastHeight / ImageDellimitterConst); g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin - 1, firstHeight / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin - 1, size.Height - lastHeight / ImageDellimitterConst); g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, bitmap.Height / ImageDellimitterConst, bitmap.Width, bitmap.Height / ImageDellimitterConst); g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, bitmap.Height / ImageDellimitterConst - 1, bitmap.Width, bitmap.Height / ImageDellimitterConst - 1); } return(bitmap); }