Statistische Bestimmung von PI

  • VB6

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Statistische Bestimmung von PI

    Hallo zusammen-wie der Titel schon vermuten lässt probiere ich grade diese Methode aus...

    Ich habe soweit alles fertig allerdings ist mein Problem folgendes:

    Ich habe verschiedene Punkte die sich in einem Quadratischen bereich aufhalten.Durch den bereich läuft der Teil eines Kreises.Wie kann ich nun herausfinden ob die Teile im oder außerhalb des Kreises liegen? Ich kenne die Möglichkeit .IntersectsWith zu benutzen weis aber nur wie es für Quadrate funktioniert...

    hat jemand von euch eine Lösung/Idee?

    (VB2010)
    Wie genau könnte ich denn die Entfernung berechnen?

    Bishher habe ich

    Spoiler anzeigen

    Quellcode

    1. Option Strict On
    2. Imports System.Drawing
    3. Public Class Form1
    4. Dim rnd As New System.Random
    5. Dim Point_Size As Integer = 5
    6. Public liste As New List(Of Point)
    7. Dim Gesamt As Integer = 0
    8. Dim Inerhalb As Integer = 0
    9. Dim Außerhalb As Integer = 0
    10. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    11. Select Case e.KeyCode
    12. Case Keys.R
    13. add_point()
    14. End Select
    15. End Sub
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. Me.DoubleBuffered = True
    18. Form2.Show()
    19. End Sub
    20. Private Sub FPS_MAKER_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FPS_MAKER.Tick
    21. Me.Invalidate()
    22. End Sub
    23. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    24. With e.Graphics
    25. For Each Point In liste
    26. .FillEllipse(Brushes.Green, Point.X, Point.Y, Point_Size, Point_Size)
    27. Next
    28. Dim d As Integer = 200
    29. Dim r As Integer = d \ 2
    30. .DrawEllipse(Pens.Red, 100, 100, d, d)
    31. .DrawLine(Pens.Red, 100 + r, 0, 100 + r, d + 200)
    32. .DrawLine(Pens.Red, 0, 100 + r, 200 + r + r, 100 + r)
    33. .DrawRectangle(Pens.Red, 0, 0, 200 + d, 200 + d)
    34. .DrawRectangle(Pens.Red, 100 + r, r, r, r)
    35. .DrawString("Gesamt: " & Gesamt, Font, Brushes.Red, 10, 10)
    36. .DrawString("Inerhalb: " & Inerhalb, Font, Brushes.Red, 10, 30)
    37. .DrawString("Außerhalb: " & Außerhalb, Font, Brushes.Red, 10, 50)
    38. .DrawString("Pi: " & 4 * (Inerhalb / Außerhalb), Font, Brushes.Red, 10, 70)
    39. End With
    40. End Sub
    41. Private Sub add_point()
    42. Dim x As Integer = rnd.Next(0, 100 + 1)
    43. Dim y As Integer = rnd.Next(0, 100 + 1)
    44. x += 200
    45. y += 100
    46. Dim point As New Point(x, y)
    47. liste.Add(point)
    48. Gesamt += 1
    49. Form2.Timer1.Enabled = True
    50. End Sub
    51. End Class

    @Thorstian
    Du kannst nicht PI bestimmen, wenn Du durch Deine Geometrie das PI bereits reingesteckt hast (Kreis in Quadrat oder Rechteck).
    Was aber funktioniert: Wirf eine Nadel in beliebigem Winkel auf ein liniertes Papier und bestimme das Verhältnis von (Nadel fällt auf Linie) zu (Nadel fällt nicht auf Linie), das ist PI mal Nadellänge zu Linienabstand oder so was in der Art.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Thorstian schrieb:

    Dann hab ich wohl was falsch verstanden
    Wie gesagt: Pi berechnen, indem man Pi reinsteckt ist mathematisch schwachsinnig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In Informatik hatten wir schon andere Methoden - ich wollte es nur mal testen;eine Möglichkeit wäre wie ich`s zusammen gebastelt habe:

    (Is Lazarus)

    Spoiler anzeigen

    Quellcode

    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var
    3. i : Integer;
    4. s,z : Double;
    5. begin
    6. Memo1.clear;
    7. Memo2.clear;
    8. z:=1;
    9. s:=0;
    10. for i:=0 to StrToInt(Edit1.text) do
    11. begin
    12. s:=s+2/(z*(z+2));
    13. z:=z+4;
    14. memo1.append(FloatToStr(s*4));
    15. memo2.append(FloatToStr(i));
    16. end;
    17. end;

    timmi31061 schrieb:

    Das Berechnen von PI
    Da kommen wir der Sache doch schon wesentlich näher.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    ich hab hier openprocessing.org/sketch/139622 mal ein Beispiel hochgeladen, wie ich es machen würde - Funktioniert.
    Taste drücken, um Punkte wieder random anzuordnen.
    Spoiler anzeigen

    Java-Quellcode

    1. void setup() {
    2. size(400, 300);
    3. background(255);
    4. noFill();
    5. points = new PVector[2000];
    6. for (int i = 0; i < points.length; i++) {
    7. points[i] = new PVector(random(width), random(height));
    8. }
    9. }
    10. PVector[] points;
    11. void draw() {
    12. background(255);
    13. noFill();
    14. strokeWeight(1);
    15. stroke(0);
    16. //Rechteck:
    17. rect(width/2+100, height/2-100, -100, 100);
    18. //Kreisausschnitt:
    19. arc(width/2, height/2, 200, 200, radians(270), radians(360));
    20. strokeWeight(2);
    21. for (PVector p : points) {
    22. stroke(0);
    23. //Hier wird nachgeschaut, ob sich die Punkte im Kreisradius befinden
    24. if (dist(p.x, p.y, width/2, height/2) < 100 && p.x > width/2 && p.y <= height/2) {
    25. stroke(#ff0000);
    26. }
    27. point(p.x, p.y);
    28. }
    29. }
    30. void keyPressed() {
    31. for (int i = 0; i < points.length; i++) {
    32. points[i] = new PVector(random(width), random(height));
    33. }
    34. }



    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Link275“ ()

    Thorstian schrieb:

    die schnellste Methode?
    Statistisch dauert es länger, Reihenberechnungen dauern, je nach Konvergenz, auch unterschiedlich lange.
    Du musst ein geeignetes Abbruch-Kriterium definieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!