2014-10-27 7 views
0

Я пытаюсь использовать Reactive Extensions for Unity (UniRX, reimplementation Reactive Extensions, совместимый с Unity 4.5) для распознавания жестов. Есть simple example out there, но он использует очень простой жест.Реактивное программирование - ответ на последовательность событий

Я написал логику для генерации потока векторов признаков в IObservable.

Я хотел бы реализовать логику, которая выглядит так: «Посмотрите на IObservable. Когда (начальные условия возникают), если только (условия отмены/прерывания), после события полного действия не возникает событие жестов».

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

т.е.

// initial condition -- passes events through if hand more open than some threshold, and closing 
handStream 
    .Buffer(2, 1) 
    .Where(h => h[0].pinchStrength > m_openThresh) 
    .Where(h => h[0].pinchStrength > h[1].pinchStrength) 

или

// end condition -- passes event through if hand more closed than some threshold 
handStream 
    .Where(h => h[0].pinchStrength < m_pinchThresh) 

но второе выражение не имеет смысла, если первые условия не были выполнены в какой-то предыдущий раз.

Как я должен подходить к этому, парадигматически?

+1

Напоминает мне [парнеры Rxx] (https://rxx.codeplex.com/wikipage?title=Parsers). –

ответ

1

Похоже, что вам нужно сделать какие-то изменения на следующий запрос:

var query = 
    handStream 
     .Buffer(2, 1) 
     .Publish(bhs => 
      bhs 
       .Where(h => /* start condition */) 
       .Select(h => 
        bhs 
         .Where(x => /* values to return */) 
         .TakeUntil(
          bhs 
           .Where(x => /* stop condition */)))) 
     .Switch(); 

В основном это выглядит для вашего стартового состояния, а затем вернуться наблюдаемым, который будет возвращать значения, которые вы заинтересованы в до происходит условие остановки. Метод .Switch() «переключает» на последний наблюдаемый возвращенный (закрывающий предыдущий). Стоит играть с этим оператором, так как он очень мощный.

Возможно, вам понадобится оператор .Publish(...) в зависимости от вашего начального потока.

Смежные вопросы