特定の期間に 0..1..0..1..0 などから脈動する値を作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3018550

質問

私はあるコードに取り組んでいます Time メンバーとのオブジェクト time. Time.time 私のアプリケーションが数秒で開始されてから時間を与えてくれます(フロート値)。ここで、0 と 1 の間で脈動する値を作成し、その後再び 1 から 0 までの間で脈動する値を作成します。これは、アプリケーションが停止するまで継続的に動作を続けます。

sin() を使用しようと考えていましたが、このパルス値を作成するためにパラメータとして何を渡せばよいかわかりません。

この脈動する価値をどのように作成すればよいでしょうか?

よろしく、Pollux

役に立ちましたか?

解決

私はあなたはそれが0と1の間で連続的にパルスしたいと思いますので、あなたは罪を()、使用して言及しています。

このような何かを行います。

float pulse(float time) {
    const float pi = 3.14;
    const float frequency = 10; // Frequency in Hz
    return 0.5*(1+sin(2 * pi * frequency * time));
}

1/frequency = 0.1 second 1つの間の時間である期間である。

他のヒント

x = 1 - x ではどうでしょうか?または、時間をベースにしたい場合は、Timer % 2 を使用します。

ああ、0 と 1 の間の値も必要でしたね。Math.abs(100-(Timer%200)) / 100ここで、タイマーはdatetime.now.timeofday.totalmillisecondsのようなものです

編集:私のテストによると、これは Sin メソッドの 2 倍以上高速です。100 万回の反復では、sin メソッドでは 0.048 秒かかりますが、Abs メソッドでは約 0.023 秒かかります。また、当然ながら、2 つの波形からは異なる波形が得られます。Sin は正弦波を生成し、Abs は三角波を生成します。

static void Main(string[] args)
{
   System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
   sw.Start();
   const int count = 1000000;
   float[] results = new float[count];
   for (int i = 0; i < count; i++)
   {
      results[i] = AbsPulse(i/1000000F);
      //results[i] = SinPulse(i / 1000000F);
   }
   sw.Stop();
   Console.WriteLine("Time Elapsed: {0} seconds", sw.Elapsed.TotalSeconds);
   char[,] graph = new char[80, 20];
   for (int y = 0; y <= graph.GetUpperBound(1); y++)
      for (int x = 0; x <= graph.GetUpperBound(0); x++)
         graph[x, y] = ' ';
   for (int x = 0; x < count; x++)
   {
      int col = x * 80 / count;
      graph[col, (int)(results[x] * graph.GetUpperBound(1))] = 'o';
   }
   for (int y = 0; y <= graph.GetUpperBound(1); y++)
   {
      for (int x = 0; x < graph.GetUpperBound(0); x++)
         Console.Write(graph[x, y]);
      Console.WriteLine();
   }
}

static float AbsPulse(float time)
{
   const int frequency = 10; // Frequency in Hz
   const int resolution = 1000; // How many steps are there between 0 and 1
   return Math.Abs(resolution - ((int)(time * frequency * 2 * resolution) % (resolution * 2))) / (float)resolution;
}

static float SinPulse(float time)
{
   const float pi = 3.14F;
   const float frequency = 10; // Frequency in Hz
   return 0.5F * (1 + (float)Math.Sin(2 * pi * frequency * time));
}
正弦関数は、私が思う理想的であるが、あなたは時間とスケールを調整する必要があります。

正弦関数は-1から1の間の結果を生成しますが、あなたが正しくそれをスケーリングするには、0と1の間に行きたいあなたは(sin(x)+1)/2を望んます。

正弦関数はゼロから始まり、PIで再びPI / 2、ゼロで1になる-1 3 * PI / 2、および2 * PIでゼロに後方に。スケーリングされた、最初のゼロは、3 * PI / 2で起こる、その後第1の最大5/2 * PIであろう。前の式でx(2*time + 3) * pi/2あるのでます。

すべて一緒にそれを置く:(sin((2*time.time + 3) * pi/2) + 1) / 2

どのくらいの頻度でそれがパルスたい?

レッツ・発言は、あなたが10秒かけて0から1へ行きたい。

float pulseValueForTime(int sec) {
    int pulsePoint = sec % 10;
    float pulsePercent = (float)pulsePoint / (float)10;
    float pulseInTermsOfPI = (pulsePercent * 2 * PI) - PI;
    float sinVal = MagicalSinFunction(pulseInTermsOfPI); // what framework you use to compute sin is up to you... I'm sure you can google that!
    return (sinVal + 1) / 2; // sin is between 1 and -1, translate to between 0 and 1
}

使いやすさの機能を調べます。彼らはマナーのすべての種類でこの種のものを行う - 。リニア、ポリ、EXP、罪など

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top