-1

これは私が達成しようとしている効果です:リンク

私は 4 つのウェーブを取得しましたが、それらは確かにアニメーション化されていますが、それぞれにわずかに異なるアニメーションを与えることに行き詰まりました。現時点では、すべての曲線が同じ速度で同じ方向に移動し、同じ場所で切り替わります。それらは、これらすべての側面でわずかに異なるはずです。私が探している最終結果は、私が投稿したリンクと非常によく似ていますが、各波は最大 1 つのサイクルしか持てず、1 回上昇して 1 回下降するという違いがあります。ご意見ありがとうございます。

以下は私のコードです:

function start() {  
  var canvas = $("canvas");
  console.log(canvas);
  canvas.each(function(index, canvas) {
      var context = canvas.getContext("2d"); 
      canvas.width = $(".box").eq(index).width();
      canvas.height = $(".box").eq(index).height();
      context.clearRect(0, 0, canvas.width, canvas.height);
      drawCurves(context, step);
      step += 1;
  });
  requestAnimationFrame(start);
}
var step = -1;
function drawCurves(ctx, step) {
    var width = ctx.canvas.width;
    var height = ctx.canvas.height;
    ctx.lineWidth = 2;
    
  for (i = 0; i < 4 ; i++) {    
    var x = 0;
    var y = 0;
    ctx.beginPath();
    if (i === 0 ) {
      ctx.strokeStyle = "red";
      var amplitude = 20;
     var frequency = height / (2 * Math.PI) ; 
      console.log(i, frequency);
     }  if ( i === 1) {
         ctx.strokeStyle = "blue";
       var amplitude = 30;
      var frequency = (height / (2 * Math.PI));
      console.log(i, frequency);
     }  if ( i === 2) {
          ctx.strokeStyle = "green";
       var amplitude = 40;
       var frequency = height / (2 * Math.PI) ;
      console.log(i, frequency);     
     }  if (i === 3) {
       ctx.strokeStyle = "yellow";
       var amplitude = 50;
      var frequency = height / (2 * Math.PI) ;
      console.log(i, frequency);
     }
  ctx.save();
  ctx.translate(-amplitude * Math.sin(step / frequency), 0);
  while (y < height) {
    x = (width / 2) + (amplitude * Math.sin((y + step) / frequency)) ;
    ctx.lineTo(x, y);
    y++;
  }
  ctx.closePath();
  ctx.stroke();
  ctx.restore();
}
  }


$(document).ready(function() {
  start();
})
<!DOCTYPE html>
<html>

<head>
</head>

<body>
   
  <div class="box">
       <canvas id="canvas"></canvas>
    </div>
  <div class="box">
       <canvas id="canvas"></canvas>
    </div>
  
</body>

</html>

そしてこちらがコードペン

4

2 に答える 2

0

コードは正弦波を 1 つだけ描画します。私はあなたにそれらのポイントをアドバイスします:

_異なる (同時の) 波が必要な場合は、ドロー ポイントで異なる x/y 値を使用する必要があります。

_$(document).ready(function() をアニメーション ループとして使用しますが、これは良い方法ではありません。アニメーションの場合は、setInterval を設定するか、アニメーションを作成することを目的とした requestAnimationFrame をより適切に使用する必要があります。各アニメーション ループで描画します。 4 つの副鼻腔線、代わりにオブジェクトを使用するための手順を忘れますが、それは重要な点ではありません.コードを試す時間はありませんが、代わりに requestAnimationFrame(start()) を使用するとどうなりますか? $document.ready ? 明らかに各アニメーションで clearRect(width,height); を使用して描画場所をクリアします。

_4 つのステップは、同じデカルト方程式の y に +1 から +4 を追加します。それは本当にわずかな変化であるため、人間の目には実際には見えない正弦曲線です。各ステップ/オブジェクト、つまり Math.sin(y)+10 または Math.sin(y)*10 などに異なる正弦波方程式を使用して、異なる方程式を使用することも、異なるオブジェクトごとに異なる増分値を使用することもできます。_i'll tr​​anslate を回避し、for ループを使用して x 値をインクリメントし、sin(x) と必要な式を使用して y 値を取得します。これは個人的な選択ですが、.translate() 行を記述することを避け、通常の座標を使用します座標を移動する代わりに、console.log でキャンバス領域の実際の座標を簡単に確認できます。

_以前と同様に、配列内のオブジェクトを使用し (そしてそれをループし)、4 つのオブジェクトのそれぞれの styleColor と重みを設定すると、プログラムの開始時にチェック IF を破棄できます。

きれいなコードを書く時間はありません。

于 2019-05-13T11:19:47.303 に答える