Frage

Ich arbeite an einigen Code, wo ich ein Time Objekt mit einem Mitglied time haben. Time.time gibt ich die Zeit, da meine Anwendung in Sekunden (float value) gestartet. Jetzt möchte ich von 1 auf 0 wieder einen pulsierenden Wert zwischen 0 und 1 und dann schaffen, die ausdünnt, bis machen weiterhin die Anwendung nicht mehr.

Ich dachte sin () zu verwenden, aber nicht wissen, was es passieren, wie paramters diesen pulsierenden Wert zu schaffen.

Wie kann ich das pulsierende Wert schaffen?

Mit freundlichen Grüßen, Pollux

War es hilfreich?

Lösung

Sie erwähnen mit sin (), so dass ich denke, man es kontinuierlich zwischen 0 und 1 pulsieren soll.

So etwas wie dies tun:

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 ist die Zeit, die die Zeit zwischen 1 ist.

Andere Tipps

Wie etwa x = 1 - x? Oder wenn Sie es an der Zeit wollen basierte Anwendung Timer% 2

sein

Oh, wollten Sie die Werte zwischen 0 und 1 als auch. wie etwa Math.Abs ??(100 - (Timer% 200)) / 100 Wo Timer ist so etwas wie DateTime.Now.TimeOfDay.TotalMilliseconds

Edit: Meine Tests zeigen, dass dies mehr als doppelt so schnell wie die Methode Sin. Für 1 Million Iterationen nimmt die Sünde Methode 0,048 Sekunden, während die ABS-Methode etwa 0,023 Sekunden dauert. Außerdem erhalten Sie unterschiedliche Wellenformen aus den beiden, natürlich. Sin erzeugt eine Sinuswelle, während Abs eine Dreieckswelle erzeugt.

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));
}

Eine Sinusfunktion ideal wäre glaube ich, aber Sie müssen die Zeit und die Skala einzustellen.

Die Sinusfunktion erzeugt Ergebnisse zwischen -1 und 1, aber Sie gehen wollen zwischen 0 und 1. es zu skalieren richtig wollen Sie (sin(x)+1)/2.

Die Sinusfunktion beginnt bei Null, bei pi geht auf 1/2 wieder Null bei Pi, -1 bei 3 * Pi / 2 und zurück auf Null bei 2 * pi. Skaliert wird die erste Null bei 3 * pi passieren / 2 und das erste Maximum nach, dass bei 5/2 * pi sein. So x in der vorherige Formel (2*time + 3) * pi/2.

Dass sie alle zusammen: (sin((2*time.time + 3) * pi/2) + 1) / 2

Wie oft wollen Sie es pulsieren?

Lassen Sie uns sagen möchten, dass Sie von 0 bis 1 über 10 Sekunden gehen.

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
}

Schauen Sie in Einfache Funktionen. Sie machen diese Art der Sache in allen möglichen Weisen -. Linear, Poly, exp, sin, etc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top