Zufallspunkte im Kreis



  • Hallo Spezialisten! 🙂

    void pixel(int anz)
    {
      for (int i = 0; i < anz; i++)
      {
        pPixel.x = random(Form1->ClientWidth);
        pPixel.y = random(Form1->ClientHeight);
        Form1->Canvas->Pixels[pPixel.x][pPixel.y] = clLime;
    
        Form1->Canvas->Font->Color = clWhite;
        Form1->Canvas->TextOutA(50,1,pPixel.x);
        Form1->Canvas->TextOutA(50,15,pPixel.y);
      }
    }
    

    Mit der o.g Funktion lasse ich mir auf einem Form zufällige Punkte ausgeben.
    Nur würde ich jetzt die Punkte auf eine Kreisfläche begrenzen.
    Ich habe also einen Mittelpung Point(200,200) und die zufälligen Pixel sollen maximal 200pixel vom Mittelpunkt entfernt sein.

    Welches Argument muss ich dann random(arg) übergeben? Oder wie kann ich das anstellen?

    Danke schonmal!
    Tippo



  • Hallo

    Auf einer zweidimensionalen Fläche kommst du um zwei Zufallszahlen nicht umhin. Wenn du eine Kreisfläche haben willst must du eben prüfen ob der Abstand Mittelpunkt-Zufallspunkt kleinergleich des gewünschten Radius ist. Dazu brauchst du nur den Satz des Pythagoras.

    bis bald
    akari



  • Ok, wenn's denn so sein soll. Hätte ja sein können es gibt ne elegantere Lösung.

    Danke.



  • Du könntest auch zwei Zufallswerte ph (0 bis 360 bzw. 0 bis 2*Pi) und r (0 bis Wunschradius) ermitteln und daraus mit x=r*cos(ph)+x0; y=r*sin(ph)+y0; die Koordinaten berechnen - dann sind deine Punkte auf jeden Fall im Kreis, aber nicht mehr gleichmäßig verteilt.



  • Hey das ist gut. Das werde ich heute Abend gleich mal versuchen.
    Das di Punkte dann nicht mehr wirklich zufällig sein ist soweit erstmal egal.

    MfG
    Tippo



  • CStoll schrieb:

    aber nicht mehr gleichmäßig verteilt.

    Weil sich die Dichte zum Zentrum hin quadratisch erhöht? Das kann man leicht kompensieren.
    ph= {0..2Pi}
    r = {0..sqrt(R)}
    x = r²cos(ph)
    y = r²sin(ph)



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Mathematik verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn Rechenzeit pro Punkt nicht unbedingt konstant sein muss, würde ich die Variante von akari wählen. Man muss ja nur ungefähr 22% der Zufallszahlen wegwerfen.



  • Tim schrieb:

    Wenn Rechenzeit pro Punkt nicht unbedingt konstant sein muss, würde ich die Variante von akari wählen. Man muss ja nur ungefähr 22% der Zufallszahlen wegwerfen.

    ist ja immerhin sogar erwartet konstant. okay, für ein echtzeitsystem ist es schon kritisch, aber für alles andere isses gut.



  • complexe zahlen spuckt kein zufallgenerator aus, oder?



  • Naja, eine zufällige komplexe Zahl ist ja auch bloß ein Paar aus zufälligen reellen Zahlen..



  • Jester schrieb:

    Tim schrieb:

    Wenn Rechenzeit pro Punkt nicht unbedingt konstant sein muss, würde ich die Variante von akari wählen. Man muss ja nur ungefähr 22% der Zufallszahlen wegwerfen.

    ist ja immerhin sogar erwartet konstant. okay, für ein echtzeitsystem ist es schon kritisch, aber für alles andere isses gut.

    Weisst ja, dass das für mich eher die Ausnahme ist 😉

    Aber was genau verstehst du/man unter "erwartet konstant"? Konstant im Mittel?



  • Tim schrieb:

    Aber was genau verstehst du/man unter "erwartet konstant"? Konstant im Mittel?

    Ja sozusagen. Aber halt gemittelt über die Wahrscheinlichkeitsverteilung. Die Laufzeit des Programms ist eine Zufallesvariable. Nennen wir die Anzahl der Runden, wie oft wir ziehen müssen X.

    Fertig nach einmal ziehen hat Wahrscheinlichkeit p (p ist etwa 0.8) also P(X=1) = p
    Fertig nach zwei zwei Zügen, also P(X=2) = (1-p)*p
    P(X=k) = (1-p)^(k-1)*p

    Diese Reihe konvergiert gegen eine feste Zahl c. Das ist die durchschnittliche Anzahl an Runden, die man ziehen muß. Man kann auch zeigen, dass es extrem unwahrscheinlich ist, dass man viel öfter ziehen muß.

    http://de.wikipedia.org/wiki/Erwartungswert



  • Danke. Wieder was gelernt 🙂


Anmelden zum Antworten