Domanda

Sto lavorando su un codice in cui ho un file Time oggetto con un membro time. Time.time Mi dà il tempo da quando la mia applicazione è iniziata in secondi (valore float).Ora voglio creare un valore pulsante tra 0 e 1 e poi di nuovo da 1 a 0, che continua a farlo finché l'applicazione non si interrompe.

Stavo pensando di utilizzare sin() ma non so cosa passargli come parametro per creare questo valore pulsante.

Come creerei questo valore pulsante?

Cordiali saluti, Pollux

È stato utile?

Soluzione

Lei parla di utilizzare sin (), quindi credo che si vuole pulsare continuo tra 0 e 1.

Qualcosa di simile lo farà:

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 è il periodo, che è il tempo tra 1 della.

Altri suggerimenti

Che ne dici di x = 1 - x?Oppure, se vuoi che sia basato sul tempo, usa Timer % 2

Oh, volevi anche i valori tra 0 e 1.Che ne dici di Math.abs (100 - (timer % 200)) / 100 dove il timer è qualcosa come DateTime.Now.TimeofDay.TotalMilliseconds

Modificare:I miei test indicano che questo è più del doppio più veloce del metodo Sin.Per 1 milione di iterazioni, il metodo sin impiega 0,048 secondi mentre il metodo Abs impiega circa 0,023 secondi.Inoltre, ovviamente, ottieni forme d'onda diverse dai due.Sin produce un'onda sinusoidale, mentre Abs produce un'onda triangolare.

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

Una funzione seno sarebbe l'ideale credo, ma è necessario regolare il periodo e la scala.

La funzione seno produce risultati tra -1 e 1, ma si vuole andare tra 0 e 1. Per scalare in modo corretto si desidera (sin(x)+1)/2.

La funzione inizia sinusoidali a zero, passa a 1 a pi / 2, azzerare a pi, -1 a 3 * pi / 2, e torna a zero 2 pi *. Scala, il primo zero avverrà a 3 * pi / 2 e sarà il primo massimo dopo che alle 5/2 pi *. Così x nella formula precedente è (2*time + 3) * pi/2.

Mettere tutto insieme: (sin((2*time.time + 3) * pi/2) + 1) / 2

Con quale frequenza si desidera polso?

diciamo Let vuoi andare da 0 a 1 più di 10 secondi.

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
}

Guardate in funzioni facilità. Lo fanno questo genere di cose in tutti i tipi di modi -. Lineari, poli, export, peccato, etc

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top