import random; from math import sin,cos; from geometry2d import pi,Points,Vectors,Lines,Segments; # Dielengerade, hier einfach die x-Achse floorLine=Lines.toLineWithDir(Points(0,0),Vectors(1,0)); random.seed(); # Wurf der Nadel def needlePitch() -> bool: yNdM=random.uniform(-0.5,0.5); # Zufällige Lage der geworfenen Nadel auf der y-Achse # im Intervall (-½,½) PtNdM=Points(0.0,yNdM); # Punkt der Nadelmitte auf der Diele phiNd=random.uniform(-pi/2,pi/2); # Zufällige Orientierung der Nadel auf der Diele # im Intervall (-π/2,π/2) DvNd=Vectors(sin(phiNd),cos(phiNd)); # Richtungsvektor der Nadel auf der Diele needle=Segments.toSegmentWithDir(PtNdM,DvNd,1); # Erzeugung des Segments (Strecke) aus der Nadelmitte, # dem Richtungsvektor und der Nadellänge 1 return needle.isIntersectionOf_withLine(floorLine); # Test, ob die Strecke die Gerade schneidet # end def needlePitch # ------------------------------------------------------------------------------# # ------------------------------------------------------------------------------# if __name__=='__main__': print('\n# Beginning Pi-mit-Dielenbretter ...\n'); # ------------------------------------------------------------------------------# # ------------------------------------------------------------------------------# total=2000000; # Standardwert 2000000 # Anzahl der Würfe crossed=0; # Nadel überkreuzt die Dielengerade total_10=total/10; k=1; for ix in range(1,total+1,1): if ix==k*total_10: print(k) k=k+1; if needlePitch(): crossed+=1; # end for result: float=crossed/total; # Wahrscheinlichkeit für die Überkreuzung print("\nNb of Pitches : ",total); print("crossed : ",crossed); print("Result Prop : ",result); print("Result Prop % : ",result*100," %"); print("|Result-2/pi| : ",abs(result-2.0/pi)); # ------------------------------------------------------------------------------# # ------------------------------------------------------------------------------# print('\n# Finished Pi-mit-Dielenbretter.\n'); # end if main