11350


下記のように変化していく値で、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)){」を満たす内容を全て出力してしまう

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


CC BY-SA 3.0
2015-06-15T01:54:43.830
11348
2015-06-15T13:39:55.040
7886
question
javascript
ループで随時変化していく値の中で、閾値を越えたら一度だけ処理したい


「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]

としてください。


CC BY-SA 3.0
2015-06-15T02:16:22.080
11350
2015-06-15T05:11:06.653
2015-06-15T05:11:06.653
5793
5793
11348
answer


`Math.sign()`で符号が取れますので、それを比較するのが良いと思います。  
ちょうど`0`の場合、`0`が返りるため、そこは考慮が必要です。

[code]

    var t = 0;
    var prev_sign = Math.sin(Math.PI + t);
    var count = 0;
    
    while(count < 1000){
        var target = Math.sin(Math.PI + t);
        var sign = Math.sign(target);
        
        // 正負がちょうど0だった場合、直前の符号と同等とする
        sign = sign == 0 ? prev_sign : sign;
        
        if( prev_sign != sign ){
            $("#result").append(target+'<br />');
        }
        
        t += 0.02;
        prev_sign = sign;
        count++;
    }
[/code]

[code]

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div id="result"></div>
[/code]


CC BY-SA 3.0
2015-06-15T03:39:56.717
11355
2015-06-15T03:39:56.717
7214
11348
answer


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

[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]


CC BY-SA 3.0
2015-06-15T06:00:51.210
11365
2015-06-15T06:00:51.210
9796
11348
answer


以前の状態を参照するのは他の方と同じですが、前の処理で判定したはずの符号を再度求めるのは単純に無駄なので結果を残しておけばいいのではないでしょうか。

[code]

    target=Math.sin(Math.PI + t);
    value_positive=target>0;
    if(value_positive && (prev_value_positive ^ value_positive)){
        console.log("it's now");
    }
    prev_value_positive=value_positive;
    
[/code]

のようなものをループで回せばいいように思いますが。  
初期化等は適宜実施してください。


CC BY-SA 3.0
2015-06-15T13:39:55.040
11374
2015-06-15T13:39:55.040
8136
11348
answer