Kreisberechnung ist falsch, brauche Hilfe



  • Moin,

    ich wollte mit ein paar Matheroutinen einen Kreis berechnen bzw, Positionen für Objekte die sich radial von einem Mittelpunkt wegbewegen.

    //schleife ca 2500 mal
    //{
    float x, y;
    
    //erstelle uns einen winkel zwischen 0.0f und 360.0f
    angle += ((rand() % (int) (360*200+1)) - 360*100) / 100.0f;
    
    x = (velocity * lifetime) * sin(angle / 180 * 3.141592653);
    y = (velocity * lifetime) * cos(angle / 180 * 3.141592653);
    //}
    

    (velocity * lifetime) entspricht dabei lediglich einem Multiplikator. Das Problem ist, dass wenn ich viele Objekte zeichnen würde, ich eigentlich so etwas wie einen Kreis darstellen müsste. Da nach dem Gesetz der großen Zahlen alle Winkel mindestens ein mal betroffen sind usw.

    Ich sehe aber, dass ein gewisser Kreisauschnitt immer ausgelasen wird, so von ca 30°. Hab aber den Fehler noch nicht rausgefunden. 😕 Kann mir jemand dabei helfen, bitte?

    mfg freaker



  • Wieso berechnest du zufällige Punkte? Ich würde etwas systematischer an die Sache rangehen. Das Gesetz der grossen Zahlen stimmt natürlich (besonders bei linearen Kongruenzgeneratoren), aber viel effizienter ist es immer noch, gleich die benötigten Punkte auszurechnen.

    const float radius = velocity * lifetime;
    const unsigned int num_points = 100; // vielleicht dem Radius anpassen
    for (unsigned int i = 0; i < num_points; ++i)
    {
    	float angle = 2 * 3.141592653f * i / num_points;
    
    	float x = radius * cos(angle);
    	float y = radius * sin(angle);
    
    	draw_point(x, y);
    }
    

    Du könntest auch in der For-Schleife gleich float s inkrementieren, allerdings riskierst du dabei (kleine) Rundungsfehler.



  • Ich wollte ja absichtlich zufällig berechnete Punkte erhalten. Es handlet sich bei dem ganzen um ein Partikelsystem, hier speziell um einen Emitter, der die Partikel kreisförmig emittiert. Und da brauche ich zufällige Punkte, damit die Partikel nicht wie in einer Strahlenkanone reihum herausgeschossen werden.



  • Okay, das hättest du aber auch sagen dürfen. Ich habe deinen Post so verstanden, als ob du das Gesetz der Grossen Zahlen dazu verwenden wolltest, einen Kreis zu zeichnen.

    Berechne den Winkel dann eben so:

    float angle = (2 * 3.141592653f * rand()) / RAND_MAX;
    



Anmelden zum Antworten