Mit seinen Streuversuchen (Goldfolienbeschuss mit Alphateilchen) hatte Rutherford 1911 die Entdeckung gemacht,
dass Atome keine kompakten Kugeln sind, wie bisher angenommen (Daltonsches Atommodell), sondern zum größten
(räumlichen) Teil aus Nichts bestehen, was sich danach mit dem Kern-Hülle-Modell erklären ließ.
Aus Performancegründen werden jedoch in der Simulation die abstoßenden Kräfte zwischen den einzelnen Alphateilchen vernachlässigt.
Code: Alles auswählen
Enumeration
#Window
#Start
#Stop
#Pause
#Clear
#ISpeed
#Speed
#TSpeed
#IMax
#Max
#TMax
#Display
#Screen
EndEnumeration
#Au_Ladung=79
#Alpha_Masse=4
#Alpha_Ladung=2
#DELTA_t=0.004
#Gravsonst=50
#Alpha_SpotX=0
#Alpha_SpotY=250
Structure Alpha
x.d
y.d
vx.d
vy.d
EndStructure
Global Speed.l,Max.l,NumberOfAu.l
NumberOfAuPerLine=16
NumberOfAu=3*NumberOfAuPerLine
Global NewList Alpha.Alpha()
Global Dim Au.Point(NumberOfAu)
Global Dim Screen.l(500)
Speed=20
Max=20
Global Drawing.l
Procedure DeltaPosition(*Alpha.Alpha,Au_x,Au_y,*Save.Alpha)
With *Alpha
Alpha_x.d=\x
Alpha_y.d=\y
Alpha_vx.d=\vx
Alpha_vy.d=\vy
EndWith
r.d=Sqr((Alpha_x-Au_x)*(Alpha_x-Au_x)+(Alpha_y-Au_y)*(Alpha_y-Au_y))
F.d=#Gravsonst*#Alpha_Ladung*#Au_Ladung/(r*r)
Fx.d=F*(Alpha_x-Au_x)/r
Fy.d=F*(Alpha_y-Au_y)/r
ax.d=Fx/#Alpha_Masse
ay.d=Fy/#Alpha_Masse
delta_vx.d=ax*#DELTA_t
delta_vy.d=ay*#DELTA_t
delta_x.d=(Alpha_vx+delta_vx)*#DELTA_t
delta_y.d=(Alpha_vy+delta_vy)*#DELTA_t
With *Save
\x+delta_x
\y+delta_y
\vx+delta_vx
\vy+delta_vy
EndWith
EndProcedure
Procedure CalcNewPosition(*Alpha.Alpha)
Save.Alpha
For Au=0 To NumberOfAu
DeltaPosition(*Alpha,Au(Au)\x,Au(Au)\y,@Save)
Next Au
With *Alpha
\x+Save\x
\y+Save\y
\vx+Save\vx
\vy+Save\vy
EndWith
EndProcedure
Procedure Simulation()
ClearList(Alpha())
For Screen=0 To 500
Screen(Screen)=0
Next Screen
Repeat
If CountList(Alpha())<Max
AddElement(Alpha())
DiffX=Random(20)-10
Alpha()\x=#Alpha_SpotX
Alpha()\y=#Alpha_SpotY+DiffX
Streuung.d=DiffX/80*Random(20)/20
DiffV=Random(5)
Alpha()\vx=Cos(ATan(Streuung))*Speed*(5+DiffV)/10
Alpha()\vy=Sin(ATan(Streuung))*Speed*(5+DiffV)/10
EndIf
ResetList(Alpha())
While NextElement(Alpha())
CalcNewPosition(Alpha())
If Alpha()\x>=700 Or Alpha()\y<=0 Or Alpha()\y>=500 Or Alpha()\x<0
If Alpha()\y<=500 And Alpha()\y>=0 And Alpha()\x>=700
Screen(Int(Alpha()\y))+1
EndIf
DeleteElement(Alpha())
If CountList(Alpha())<Max
AddElement(Alpha())
DiffX=Random(20)-10
Alpha()\x=#Alpha_SpotX
Alpha()\y=#Alpha_SpotY+DiffX
Streuung.d=DiffX/80*Random(20)/20
DiffV=Random(5)
Alpha()\vx=Cos(ATan(Streuung))*Speed*(5+DiffV)/10
Alpha()\vy=Sin(ATan(Streuung))*Speed*(5+DiffV)/10
EndIf
EndIf
Wend
StartDrawing(ImageOutput(#Display))
Drawing=1
Box(0,0,700,500,0)
ResetList(Alpha())
While NextElement(Alpha())
Circle(Alpha()\x,Alpha()\y,2,RGB(255,0,0))
Wend
For Au=0 To NumberOfAu
Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
Next Au
StopDrawing()
Drawing=0
StartDrawing(ImageOutput(#Screen))
Drawing=1
Box(0,0,70,500,16777215)
For Screen=0 To 500
Line(69,Screen,-Screen(Screen),0,RGB(255,0,0))
Next Screen
StopDrawing()
Drawing=0
SetGadgetState(#Display,ImageID(#Display))
SetGadgetState(#Screen,ImageID(#Screen))
Delay(4)
ForEver
EndProcedure
Au1=Round(NumberOfAu/3,0)-1
Au2=NumberOfAu-Round(NumberOfAu/3,0)
StepAu=Int(500/(Au1+2))
For Au=0 To Au1
Au(Au)\x=550
Au(Au)\y=StepAu*(Au+1)
Next Au
For Au=Au1+1 To Au2
Au(Au)\x=580
Mod=(NumberOfAu+1)%3+1
Au(Au)\y=StepAu*(Au-Au1-1)+Int(StepAu/Mod)
Next Au
For Au=Au2+1 To NumberOfAu
Au(Au)\x=610
Au(Au)\y=StepAu*(Au-Au2)
Next Au
OpenWindow(#Window,0,0,800,600,"Rutherfordscher Streuversuch",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CreateImage(#Display,700,500)
StartDrawing(ImageOutput(#Display))
Box(0,0,700,500,0)
For Au=0 To NumberOfAu
Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
Next Au
StopDrawing()
CreateImage(#Screen,70,500)
StartDrawing(ImageOutput(#Screen))
Box(0,0,70,500,16777215)
StopDrawing()
CreateGadgetList(WindowID(#Window))
ImageGadget(#Display,10,10,700,500,ImageID(#Display),#PB_Image_Border)
ImageGadget(#Screen,720,10,70,500,ImageID(#Screen),#PB_Image_Border)
TextGadget(#ISpeed,10,530,90,20,"Geschwindigkeit :")
TrackBarGadget(#Speed,110,520,440,20,1,50,#PB_TrackBar_Ticks)
TextGadget(#TSpeed,110,540,440,20,"Min"+Space(132)+"Max")
TextGadget(#IMax,10,570,90,20,"Anzahl :")
TrackBarGadget(#Max,110,560,440,20,1,100,#PB_TrackBar_Ticks)
TextGadget(#TMax,110,580,440,20," 1"+Space(137)+"100")
ButtonGadget(#Start,560,520,110,30,"Start")
ButtonGadget(#Stop,560,560,110,30,"Stop"):DisableGadget(#Stop,1)
ButtonGadget(#Pause,680,520,110,30,"Pause"):DisableGadget(#Pause,1)
ButtonGadget(#Clear,680,560,110,30,"Löschen"):DisableGadget(#Clear,1)
SetGadgetState(#Speed,Speed)
GadgetToolTip(#Speed,Str(Speed))
SetGadgetState(#Max,Max)
GadgetToolTip(#Max,Str(Max))
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Start
Simulation=CreateThread(@Simulation(),0)
DisableGadget(#Start,1)
DisableGadget(#Stop,0)
DisableGadget(#Pause,0)
DisableGadget(#Clear,1)
Pause=0
Case #Stop
If IsThread(Simulation)
KillThread(Simulation)
If Drawing=1
StopDrawing()
EndIf
EndIf
DisableGadget(#Start,0)
DisableGadget(#Stop,1)
DisableGadget(#Pause,1)
DisableGadget(#Clear,0)
Pause=0
Case #Speed
Speed=GetGadgetState(#Speed)
GadgetToolTip(#Speed,Str(Speed))
Case #Max
Max=GetGadgetState(#Max)
GadgetToolTip(#Max,Str(Max))
Case #Pause
If Pause=0
Pause=1
PauseThread(Simulation)
If Drawing=1
StopDrawing()
EndIf
StartDrawing(ImageOutput(#Display))
Box(8,8,4,12,16777215)
Box(16,8,4,12,16777215)
StopDrawing()
SetGadgetState(#Display,ImageID(#Display))
Else
Pause=0
ResumeThread(Simulation)
EndIf
Case #Clear
StartDrawing(ImageOutput(#Display))
Box(0,0,700,500,0)
For Au=0 To NumberOfAu
Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
Next Au
StopDrawing()
StartDrawing(ImageOutput(#Screen))
Box(0,0,70,500,16777215)
StopDrawing()
SetGadgetState(#Display,ImageID(#Display))
SetGadgetState(#Screen,ImageID(#Screen))
DisableGadget(#Clear,1)
EndSelect
EndSelect
Until Event=#PB_Event_CloseWindow
CloseWindow(#Window)
End