2017-01-24 4 views
-1
var mapper = Mappers.Xy<MeasureModel>() 
      .X(model => model.DateTime.Ticks) //use DateTime.Ticks as X 
      .Y(model => model.Value);   //use the value property as Y 

//The next code simulates data changes every 500 ms 
Timer = new Timer 
{ 
    Interval = 1000 
}; 
Timer.Tick += TimerOnTick; 
R = new Random(); 
Timer.Start(); 

ChartValues.Add(new MeasureModel 
{ 
    DateTime = now, 
    Value = R.Next(0, 5) 
}); 

Из вышеизложенного, как мне сделать это, чтобы вместо того, чтобы иметь случайное значение R, могу ли я установить его на декременты. Как он падает в два раза, как 5.0 4.4 3.2 и т.д., а не случайным образом от 0 до 5Могу ли я использовать другие методы, а не Random

+1

и когда она падает ниже нуля? –

+1

вместо 'R.Next (0, 5)' используйте некоторый var, например 'R.Next (0, x)', где 'x' уменьшается с некоторым другим таймером – Nino

+0

Я хочу, чтобы он не упал до 0. поэтому, если я хочу, чтобы он упал, я хотел бы удалить abit как 5.0 4.9 4.8 и т. д. –

ответ

0

в методе, который задает первый таймер, добавить еще один, например:

//The next code simulates data changes every 500 ms 
Timer = new Timer 
{ 
    Interval = 1000 
}; 
Timer.Tick += TimerOnTick; 
R = new Random(); 
Timer.Start(); 

//another timer 
SecondTimer = new Timer() { Interval = 2000 }; 
SecondTimer.Enabled = true; 
SecondTimer.Tick += SecondTimer_Tick; 

Определить некоторые min переменную

double min = 4.9; 

Метод SecondTimer_Tick, отрегулируйте эти вары и создайте новое значение. Random.NextDouble будет генерировать число от 0 до 1 (то есть 0,877), добавить его в ваш min var. Также уменьшите минимальное значение на некоторое значение (0,2 в этом примере)

private void SecondTimer_Tick(object sender, EventArgs e) 
{ 
    min -= 0.2; 

    if (min == 0) 
     //stop timer or something 
     SecondTimer.Stop(); 

    Random R = new Random(); 
    var value = R.NextDouble(); 
    value += min; 
} 

Надеюсь, это поможет.

EDIT: Добавить некоторую проверку, если значение, генерируемое рандомизатором, слишком велико. В примере, если ваш min равен 4.8, а сгенерированное значение равно 0,5 - добавление этих данных даст вам 5.3, что, я полагаю, слишком большое значение для вашего дела.

0

var r = R.NextDouble()*5 даст вам десятичное число от 0 до 5.

семантически Вы можете полностью изменить номер, как это, var r= 5 - R.NextDouble()*5

Ofcourse 5 может быть переменной с любым числом.

Теперь уменьшите значение из произвольно сгенерированного числа при каждом тике.

private double decrementingValue = 5; 

... 

r = R.NextDouble()* 5; 
decrementingValue -= r; 

if(decrementingValue <= 0) 
     decrementingValue= 0; // you are finished 
+0

decmentingValue isnt в этом контексте, я должен определить его как 0 где-нибудь? –

+0

Да, определите его как поле в классе, начальное значение должно быть 5. –

+0

, но мне нужно использовать значение, потому что у меня есть var mapper = Mappers.Xy () .X (model => model.DateTime.Ticks) // использовать DateTime.Ticks как X .Y (model => model.Value); // используйте свойство value как Y –

0

Вы можете использовать абстрактный источник измерения

public interface IMeasurementSource 
{ 
    MeasureModel GetNext(); 
} 

Обеспечивают некоторую IMeasurementSource реализацию в классе (возможно, форма) и сохранить его в классе поле. Например.

private IMeasurementSource measurementSource = new BouncingMesasurementSource(5, 0.1); 

И называют это каждый раз, когда таймер тикает:

ChartValues.Add(measurementSource.GetNext()); 

Реализация абстракции

Вы можете реализовать этот интерфейс, получая измерения от реального источника. Или вы можете использовать случайные измерений генератора:

public class RandomMeasurementSource : IMeasurementSource 
{ 
    private readonly Random random = new Random(); 
    private readonly int min; 
    private readonly int max; 

    public RandomMeasurementSource(int min, int max) 
    { 
     this.min = min; 
     this.max = max; 
    } 

    public MeasureModel GetNext() 
    { 
     return new MeasureModel { DateTime = DateTime.Now, Value = random.Next(min, max) }; 
    } 
} 

Или раскачивания, который будет идти назад и силу от нуля до максимального значения:

public class BouncingMeasurementSource : IMeasurementSource 
{ 
    private readonly double max; 
    private double step; 
    private double current; 

    public BouncingMeasurementSource(int max, double step) 
    { 
     this.max = max; 
     this.step = step; 
     this.current = max; 
    } 

    public MeasureModel GetNext() 
    { 
     var model = new MeasureModel { DateTime = DateTime.Now, Value = current }; 
     current -= step; 

     if (current < 0 || max < current) 
     { 
      step = -step; 
      current = current < 0 ? 0 : max; 
     } 

     return model; 
    } 
} 
0

Построить класс генератора, который будет делать все расчеты новых значений для тебя.

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

enum Direction 
{ 
    Increase, 
    Decrease, 
} 

class ValueGenerator 
{ 
    private readonly Random _generator; 

    public ValueGenerator(Random generator) 
    { 
     if (generator == null) 
      throw new ArgumentNullException(nameof(generator)); 
     _generator = generator; 
    } 

    public double MinInterval { get; set; } = 0; 
    public double MaxInterval { get; set; } = 1; 
    public double MinValue { get; set; } = 0; 
    public double MaxValue { get; set; } = 100; 
    public double CurrentValue { get; set; } = 0; 
    public Direction CurrentDirection { get; set; } = Direction.Increase; 
    public int PossibilityToChangeDirection { get; set; } = 10; 

    public double NextValue() 
    { 
     if (_generator.Next(PossibilityToChangeDirection + 1) == PossibilityToChangeDirection/2) 
     { 
      switch (CurrentDirection) 
      { 
       case Direction.Increase: 
        CurrentDirection = Direction.Decrease; 
        break; 
       case Direction.Decrease: 
        CurrentDirection = Direction.Increase; 
        break; 
       default: 
        throw new InvalidOperationException(); 
      } 
     } 

     var newInterval = (MaxInterval - MinInterval) * _generator.NextDouble() + MinInterval; 
     if (CurrentDirection == Direction.Decrease) 
      newInterval = -newInterval; 

     if (CurrentValue + newInterval < MinValue) 
      CurrentValue = MinValue; 
     else if (CurrentValue + newInterval > MaxValue) 
      CurrentValue = MaxValue; 
     else 
      CurrentValue += newInterval; 

     return CurrentValue; 
    } 
} 

Пример

//The next code simulates data changes every 500 ms 
Timer = new Timer 
{ 
    Interval = 1000 
}; 
Timer.Tick += TimerOnTick; 

var vg = new ValueGenerator(new Random()) 
{ 
    MinValue = 0, 
    MaxValue = 5, 
    MinInterval = 0.1, 
    MaxInterval = 0.7, 
    CurrentValue = 3.0, 
    CurrentDirection = Direction.Decrease, 
    PossibilityToChangeDirection = 10, 
}; 

Timer.Start(); 

ChartValues.Add(new MeasureModel 
{ 
    DateTime = now, 
    Value = vg.NextValue(), 
}); 
Смежные вопросы