ループで随時変化していく値の中で、閾値を越えたら一度だけ処理したい


下記のように変化していく値で、0を越えた時点で一度だけ処理するにはどうすれば良いでしょうか？  
**Math.sin(Math.PI + t)**  
・t += 0.02;

[code]

    -0.021590975726093416
    -0.021590975726093416
    -0.021590975726093416
    -0.021590975726093416
    -0.021590975726093416
    -0.0015926529164847303
    -0.0015926529164847303
    -0.0015926529164847303
    -0.0015926529164847303
    -0.0015926529164847303
    0.018406306933055464
    0.018406306933055464
    0.018406306933055464
    0.018406306933055464
    0.018406306933055464
    0.03839790450523747
    0.03839790450523747
    0.03839790450523747
    0.03839790450523747
    0.03839790450523747
    
[/code]

* * *

**現状コードのイメージ**

[code]

    target = Math.sin(Math.PI + t);
    flg = true;
    if((flg==true)&&( target < 0)){
      console.log(target);
      flg=false;
    }else if((flg==false)&&(target > 0)){
      flg=true;
    }
    t += 0.02;
    
[/code]

* * *

**最終的にやりたいこと**  
・(0を越える度毎に、)0を越えた時点の値を1度だけ表示したい  
・現状では、「if((flg==true)&&( target < 0)){」を満たす内容を全て出力してしまう

※ループ値は、マイナスからプラスへ変化したり、プラスからマイナスへ変化したりする予定




「0を越える」の解釈が自明ではないので、初期値と`<` `<=` `>` `>=`は適宜選択してください

[code]

    prev = 0 ;
    while(...){
      target = Math.sin(Math.PI + t);
      if(prev < 0 && target > 0){
        console.log(target);
      }
      t += 0.02;
      prev = target;
    }
    
[/code]

「0を越える」が「符号が変化した」の意味なら、条件文はコメントで補足していただいたとおり

[code]

    prev < 0 && target > 0 || prev > 0 && target < 0
    
[/code]

としてください。




現在値・直前値の関係から条件判別するのがよいと思います

[code]

    (function () {
    
    // 符号が負から正に変わったかどうかを判別する関数
    function aroundCheck(prev, curr) {
        return prev < 0 && curr >= 0;
    }
    
    // トリガーしたい条件ごとに関数を作る
    // 内容は適当
    function onePercent(prev, curr) {
        return Math.random() < 1 / 100;
    }
    
    // たくさん条件がある場合には、条件判別関数を渡せるようにすると便利です
    // 条件が1種類しかない場合は関数化しなくていいと思います
    function doLoop(checkFunc) {
        var initialValue = Math.sin(Math.PI);
        var curr = initialValue;
        var prev = initialValue;
    
        for (var i = 0; i < 2000; ++i) {
    
            curr = Math.sin(Math.PI + i * 0.02);
    
            if (checkFunc(prev, curr)) {
                console.log(
                    'prev: ' + prev + '(' + (Math.PI + (i - 1) * 0.02) + ')',
                    'curr: ' + curr + '(' + (Math.PI + i * 0.02) + ')');
            }
    
            prev = curr;
    
        }
    }
    
    // 必要に応じて判別用の関数を差し替える
    console.info('----------------');
    doLoop(aroundCheck);
    console.info('----------------');
    doLoop(onePercent);
    
    })();
    
[/code]

