Попытка создания эффекта traffi c light в visual studio C# - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь создать анимацию, которая поможет мне визуализировать, как разные области мозга сигнализируют друг другу. В качестве примера, область мозга 1 (на данный момент визуализируется как текстовое поле) мигает, и это запускает полосу света в область мозга 2, которая мигает и запускает второй сигнал et c et c ..

С этой целью я попытался написать небольшой световой код c в MS Visual Studio C#, аналогичный тому, что многие другие делали до меня:

private void timer1_Tick(object sender, EventArgs e)
{

    if (ovalshape1.visible == true)
    {
        ovalshape1.visible = false;
        ovalshape2.visible = true;
     }
     else if (ovalshape2.visible == true)
     {
         ovalshape1.visible = true;
         ovalshape2.visible = false;
     }
}

Этот код также хорошо работает если я увеличу, например, до 5 «огней», если одновременно включен только один «свет». Чтобы создать эффект трейлинга, я бы хотел включить несколько лампочек одновременно, и здесь я столкнулся с проблемами, так как это, кажется, запутало мою настройку ПЧ ...

Тропа Посмотрите что-то такое:

Задние фонари

Я попытался обойти это путем создания логического массива для управления включением и выключением освещения, как я и думал, что значительно сократить объем кода, который мне нужно было бы написать, но мои возможности кодирования не до этого.

Я также пытался реализовать al oop, думая, что таким образом я мог бы просто определить, какие источники света включаются / выключаются, когда i = 0, i = 1 и т. Д., Но разве это даже сделано в таймере?

Я пытался прочитать о том, как подойти к этой проблеме, но не смог найти ничего, что могло бы иметь прямое отношение к моей ситуации. Я надеюсь, что вы можете помочь мне.

В конечном итоге я хотел бы показать передачу сигналов между 7 областями мозга.

Что-то вроде

Region1 -> R2 -> R3 -> R4 -> R5 <- R6 </p>

Region7 получает ввод от R5.

Я предполагаю передачу сигналов между отдельными регионами в виде набора точек, которые включаются / выключаются в виде последовательного шаблона, аналогичного тому, что достигается с помощью светового кода traffi c.

Чтобы усложнить ситуацию, я хотел бы запустите две анимации параллельно, изображая «нормальную» передачу сигналов в мозге, и я предполагаю (является частью) патологическую передачу сигналов при шизофрении.

До сих пор мне удалось создать два параллельных ряда по 5 задних фонарей , Каждый ряд контролируется таймером, который позволяет мне регулировать скорость для каждого ряда.

Я могу масштабировать это так, чтобы каждый таймер управлял несколькими концевыми огнями, используя код ниже:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    int counter = 0;
    string shapeColorON = "White";
    string shapeColorOFF = "Black";

    private void buttonStart_Click(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        counter++;

        if (counter == 1)
        {

            ovalShape1.FillColor = Color.FromName(shapeColorON);
            ovalShape2.FillColor = Color.FromName(shapeColorOFF);
            ovalShape3.FillColor = Color.FromName(shapeColorOFF);
            ovalShape4.FillColor = Color.FromName(shapeColorOFF);
            ovalShape5.FillColor = Color.FromName(shapeColorOFF);
            ovalShape6.FillColor = Color.FromName(shapeColorON);
            ovalShape7.FillColor = Color.FromName(shapeColorOFF);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorOFF);
            ovalShape11.FillColor = Color.FromName(shapeColorON);
            ovalShape12.FillColor = Color.FromName(shapeColorOFF);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorOFF);
            ovalShape16.FillColor = Color.FromName(shapeColorON);
            ovalShape17.FillColor = Color.FromName(shapeColorOFF);
            ovalShape18.FillColor = Color.FromName(shapeColorOFF);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorOFF);
            ovalShape21.FillColor = Color.FromName(shapeColorON);
            ovalShape22.FillColor = Color.FromName(shapeColorOFF);
            ovalShape23.FillColor = Color.FromName(shapeColorOFF);
            ovalShape24.FillColor = Color.FromName(shapeColorOFF);
            ovalShape25.FillColor = Color.FromName(shapeColorOFF);

    }
    else if (counter == 2)
        {


            ovalShape1.FillColor = Color.FromName(shapeColorON);
            ovalShape2.FillColor = Color.FromName(shapeColorON);
            ovalShape3.FillColor = Color.FromName(shapeColorOFF);
            ovalShape4.FillColor = Color.FromName(shapeColorOFF);
            ovalShape5.FillColor = Color.FromName(shapeColorOFF);
            ovalShape6.FillColor = Color.FromName(shapeColorON);
            ovalShape7.FillColor = Color.FromName(shapeColorON);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorOFF);
            ovalShape11.FillColor = Color.FromName(shapeColorON);
            ovalShape12.FillColor = Color.FromName(shapeColorON);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorOFF);
            ovalShape16.FillColor = Color.FromName(shapeColorON);
            ovalShape17.FillColor = Color.FromName(shapeColorON);
            ovalShape18.FillColor = Color.FromName(shapeColorOFF);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorOFF);
            ovalShape21.FillColor = Color.FromName(shapeColorON);
            ovalShape22.FillColor = Color.FromName(shapeColorON);
            ovalShape23.FillColor = Color.FromName(shapeColorOFF);
            ovalShape24.FillColor = Color.FromName(shapeColorOFF);
            ovalShape25.FillColor = Color.FromName(shapeColorOFF);
    }
        else if (counter == 3)
        {

            ovalShape1.FillColor = Color.FromName(shapeColorOFF);
            ovalShape2.FillColor = Color.FromName(shapeColorON);
            ovalShape3.FillColor = Color.FromName(shapeColorON);
            ovalShape4.FillColor = Color.FromName(shapeColorOFF);
            ovalShape5.FillColor = Color.FromName(shapeColorOFF);
            ovalShape6.FillColor = Color.FromName(shapeColorOFF);
            ovalShape7.FillColor = Color.FromName(shapeColorON);
            ovalShape8.FillColor = Color.FromName(shapeColorON);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorOFF);
            ovalShape11.FillColor = Color.FromName(shapeColorOFF);
            ovalShape12.FillColor = Color.FromName(shapeColorON);
            ovalShape13.FillColor = Color.FromName(shapeColorON);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorOFF);
            ovalShape16.FillColor = Color.FromName(shapeColorOFF);
            ovalShape17.FillColor = Color.FromName(shapeColorON);
            ovalShape18.FillColor = Color.FromName(shapeColorON);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorOFF);
            ovalShape21.FillColor = Color.FromName(shapeColorOFF);
            ovalShape22.FillColor = Color.FromName(shapeColorON);
            ovalShape23.FillColor = Color.FromName(shapeColorON);
            ovalShape24.FillColor = Color.FromName(shapeColorOFF);
            ovalShape25.FillColor = Color.FromName(shapeColorOFF);
    }
        else if (counter == 4)
        {

            ovalShape1.FillColor = Color.FromName(shapeColorOFF);
            ovalShape2.FillColor = Color.FromName(shapeColorOFF);
            ovalShape3.FillColor = Color.FromName(shapeColorON);
            ovalShape4.FillColor = Color.FromName(shapeColorON);
            ovalShape5.FillColor = Color.FromName(shapeColorOFF);
            ovalShape6.FillColor = Color.FromName(shapeColorOFF);
            ovalShape7.FillColor = Color.FromName(shapeColorOFF);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorON);
            ovalShape11.FillColor = Color.FromName(shapeColorON);
            ovalShape12.FillColor = Color.FromName(shapeColorOFF);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorOFF);
            ovalShape16.FillColor = Color.FromName(shapeColorOFF);
            ovalShape17.FillColor = Color.FromName(shapeColorON);
            ovalShape18.FillColor = Color.FromName(shapeColorON);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorOFF);
            ovalShape21.FillColor = Color.FromName(shapeColorOFF);
            ovalShape22.FillColor = Color.FromName(shapeColorOFF);
            ovalShape23.FillColor = Color.FromName(shapeColorON);
            ovalShape24.FillColor = Color.FromName(shapeColorON);
            ovalShape25.FillColor = Color.FromName(shapeColorOFF);
    }
        else if (counter == 5)
        {

            ovalShape1.FillColor = Color.FromName(shapeColorOFF);
            ovalShape2.FillColor = Color.FromName(shapeColorOFF);
            ovalShape3.FillColor = Color.FromName(shapeColorOFF);
            ovalShape4.FillColor = Color.FromName(shapeColorON);
            ovalShape5.FillColor = Color.FromName(shapeColorON);
            ovalShape6.FillColor = Color.FromName(shapeColorOFF);
            ovalShape7.FillColor = Color.FromName(shapeColorOFF);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorON);
            ovalShape10.FillColor = Color.FromName(shapeColorON);
            ovalShape11.FillColor = Color.FromName(shapeColorOFF);
            ovalShape12.FillColor = Color.FromName(shapeColorOFF);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorON);
            ovalShape15.FillColor = Color.FromName(shapeColorON);
            ovalShape16.FillColor = Color.FromName(shapeColorOFF);
            ovalShape17.FillColor = Color.FromName(shapeColorOFF);
            ovalShape18.FillColor = Color.FromName(shapeColorOFF);
            ovalShape19.FillColor = Color.FromName(shapeColorON);
            ovalShape20.FillColor = Color.FromName(shapeColorON);
            ovalShape21.FillColor = Color.FromName(shapeColorOFF);
            ovalShape22.FillColor = Color.FromName(shapeColorOFF);
            ovalShape23.FillColor = Color.FromName(shapeColorOFF);
            ovalShape24.FillColor = Color.FromName(shapeColorON);
            ovalShape25.FillColor = Color.FromName(shapeColorON);
    }
        else if (counter == 6)
        {

            ovalShape1.FillColor = Color.FromName(shapeColorOFF);
            ovalShape2.FillColor = Color.FromName(shapeColorOFF);
            ovalShape3.FillColor = Color.FromName(shapeColorOFF);
            ovalShape4.FillColor = Color.FromName(shapeColorOFF);
            ovalShape5.FillColor = Color.FromName(shapeColorON);
            ovalShape6.FillColor = Color.FromName(shapeColorOFF);
            ovalShape7.FillColor = Color.FromName(shapeColorOFF);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorON);
            ovalShape11.FillColor = Color.FromName(shapeColorOFF);
            ovalShape12.FillColor = Color.FromName(shapeColorOFF);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorON);
            ovalShape16.FillColor = Color.FromName(shapeColorOFF);
            ovalShape17.FillColor = Color.FromName(shapeColorOFF);
            ovalShape18.FillColor = Color.FromName(shapeColorOFF);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorON);
            ovalShape21.FillColor = Color.FromName(shapeColorOFF);
            ovalShape22.FillColor = Color.FromName(shapeColorOFF);
            ovalShape23.FillColor = Color.FromName(shapeColorOFF);
            ovalShape24.FillColor = Color.FromName(shapeColorOFF);
            ovalShape25.FillColor = Color.FromName(shapeColorON);
    }
        else if (counter == 7)
        {


            ovalShape1.FillColor = Color.FromName(shapeColorOFF);
            ovalShape2.FillColor = Color.FromName(shapeColorOFF);
            ovalShape3.FillColor = Color.FromName(shapeColorOFF);
            ovalShape4.FillColor = Color.FromName(shapeColorOFF);
            ovalShape5.FillColor = Color.FromName(shapeColorOFF);
            ovalShape6.FillColor = Color.FromName(shapeColorOFF);
            ovalShape7.FillColor = Color.FromName(shapeColorOFF);
            ovalShape8.FillColor = Color.FromName(shapeColorOFF);
            ovalShape9.FillColor = Color.FromName(shapeColorOFF);
            ovalShape10.FillColor = Color.FromName(shapeColorOFF);
            ovalShape11.FillColor = Color.FromName(shapeColorOFF);
            ovalShape12.FillColor = Color.FromName(shapeColorOFF);
            ovalShape13.FillColor = Color.FromName(shapeColorOFF);
            ovalShape14.FillColor = Color.FromName(shapeColorOFF);
            ovalShape15.FillColor = Color.FromName(shapeColorOFF);
            ovalShape16.FillColor = Color.FromName(shapeColorOFF);
            ovalShape17.FillColor = Color.FromName(shapeColorOFF);
            ovalShape18.FillColor = Color.FromName(shapeColorOFF);
            ovalShape19.FillColor = Color.FromName(shapeColorOFF);
            ovalShape20.FillColor = Color.FromName(shapeColorOFF);
            ovalShape21.FillColor = Color.FromName(shapeColorOFF);
            ovalShape22.FillColor = Color.FromName(shapeColorOFF);
            ovalShape23.FillColor = Color.FromName(shapeColorOFF);
            ovalShape24.FillColor = Color.FromName(shapeColorOFF);
            ovalShape25.FillColor = Color.FromName(shapeColorOFF);
    }

        if (counter == 7)
        {
            counter = 0;

Однако я не думаю, что такой подход позволит мне регулировать скорость каждого ряда из 5 источников света по отдельности ... и использование таймеров 2х7 тоже кажется очень плохой идеей.

1 Ответ

0 голосов
/ 30 января 2020

Вам необходимо создать модель ваших светильников. Вот 3 примера.

Модель, которая принимает следующее состояние на основе массива

class ArrayModel : IEnumerable<bool>
{
    private readonly bool[] status;

    public ArrayModel(int lightCount)
    {
        status = new bool[lightCount];
    }

    public void Update(bool headLightStatus)
    {
        // update each cell of the array with the value of previous cell
        // we iterate in reverse order, otherwise it fills the buffer with the first value
        for (var i = status.Length - 1; i >= 1; i--)
            status[i] = status[i - 1];

        // set head light status
        status[0] = headLightStatus
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    public IEnumerator<bool> GetEnumerator() => ((IEnumerable<bool>) status).GetEnumerator();
}

Это создает большое количество копий данных. И может быть улучшена с помощью Queue.

Модель, которая принимает следующее состояние на основе очереди

class QueueModel : IEnumerable<bool>
{
    private readonly Queue<bool> status;

    public QueueModel(int lightCount)
    {
        // here queue is empty, the parameter is for the capacity
        status = new Queue<bool>(lightCount);

        // Set all light to off
        for (var i = 0; i < lightCount; i++)
            status.Enqueue(false);
    }

    public void Update(bool headLightStatus)
    {
        status.Dequeue(); // forget about the last status
        status.Enqueue(headLightStatus);
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    public IEnumerator<bool> GetEnumerator() => status.GetEnumerator();
}

Stati c модель базы на массиве

Этот вариант полезен, если шаблон всегда одинаков.

class StaticArrayModel : IEnumerable<bool>
{
    private readonly bool[] _states;
    private int _startIndex;

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="states">Initial states</param>
    public StaticArrayModel(IEnumerable<bool> states)
    {
        _states = states.ToArray();
    }

    /// <summary>
    /// Made light move forward 
    /// </summary>
    public void Increment()
    {
        _startIndex++;
        if (_startIndex == _states.Length)
            _startIndex = 0;
    }

    /// <summary>
    /// Made light move backward 
    /// </summary>
    public void Decrement()
    {
        _startIndex--;
        if (_startIndex < 0)
            _startIndex = _states.Length - 1;
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    public IEnumerator<bool> GetEnumerator()
    {
        for (var i = 0; i < _states.Length; i++)
        {
            var j = i + _startIndex;
            j %= _states.Length;
            yield return _states[j];
        }
    }
}

Два последних известны как Circular / Скользящие буферы .

Обновление представления

Я не буду строить здесь полный MVC, просто покажу, как можно обновить представление:

private readonly QueueModel model = new QueueModel(2);
private readonly Control[] ovalShapes = new [] {ovalshape1, ovalshape1};

private void timer1_Tick(object sender, EventArgs e)
{
    model.Update(GetHeadLightStatus()); // true, false, random, you choose
    var i = 0;
    foreach (var status in model)
    {
      ovalShapes[i].IsVisible = status;
      i++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...