4

Timeメンバーを持つオブジェクトがあるコードに取り組んでいますtimeTime.timeアプリケーションが開始されてからの時間を秒単位で示します(浮動小数点値)。ここで、0から1の間、次に1から0までの脈動値を作成します。これにより、アプリケーションが停止するまでシンが実行され続けます。

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

この脈動する値をどのように作成しますか?

よろしく、ポルックス

4

5 に答える 5

20

sin()の使用について言及しているので、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の間の時間です。

于 2010-06-10T21:15:41.330 に答える
4

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

ああ、あなたは0と1の間の値も欲しかった。Math.Abs​​(100-(Timer%200))/100はどうですか。timerはDateTime.Now.TimeOfDay.TotalMillisecondsのようなものです。

編集: 私のテストでは、これはSinメソッドの2倍以上の速度であることが示されています。100万回の反復では、sinメソッドは.048秒かかりますが、Absメソッドは約.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));
}
于 2010-06-10T21:12:50.027 に答える
2

サイン関数が理想的だと思いますが、周期とスケールを調整する必要があります。

正弦関数は-1から1の間の結果を生成しますが、0から1の間にします。適切にスケーリングするには、が必要です(sin(x)+1)/2

正弦関数はゼロから始まり、pi / 2で1になり、piで再びゼロになり、3 * pi / 2で-1になり、2*piでゼロに戻ります。スケーリングすると、最初のゼロは3 * pi / 2で発生し、その後の最初の最大値は5/2*piで発生します。したがってx、前の式では(2*time + 3) * pi/2

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

于 2010-06-10T21:31:17.943 に答える
0

どのくらいの頻度でパルスさせたいですか?

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
}
于 2010-06-10T21:20:32.850 に答える
0

使いやすさの機能を調べてください。彼らはこの種のことをあらゆる種類の方法で行います-線形、ポリ、exp、sinなど。

于 2010-06-11T14:00:45.887 に答える