DynamicModule[{rockPos={0,1.0},rockVel={6,-1.0},dt=0.01,elasticity=0.7,width=0.1,height=0.02,b=0.003,gravity=9.81,cLift=1.2,cDrag=1.0,waterdensity=1,elapsedTime=0,running=False,sunk=False,initialState,deltaVy=0,deltaVx=0,motionAngle=10,surfaceAr=0,skipCount=0,skipRegistered=False,userMass=0.1,userTilt=10,userInitialX=0,userInitialY=1.0,userInitialVx=6,userInitialVy=-1.0,rightXBoundary=8},initialState={rockPos,rockVel,elapsedTime,deltaVy,deltaVx,motionAngle,sunk,surfaceAr,skipCount,skipRegistered};Column[{Row[{Button["Start",(rockPos={userInitialX,userInitialY};rockVel={userInitialVx,userInitialVy};motionAngle=userTilt;skipCount=0;skipRegistered=False;running=True;),Enabled->Dynamic[!running]],Button["Stop",running=False,Enabled->Dynamic[running]],Button["Reset",({rockPos,rockVel,elapsedTime,deltaVy,deltaVx,motionAngle,sunk,surfaceAr,skipCount,skipRegistered}=initialState;rockPos={userInitialX,userInitialY};rockVel={userInitialVx,userInitialVy};motionAngle=userTilt;skipCount=0;skipRegistered=False;running=False;)]}],DynamicModule[{horizontalAcc=0,verticalAcc=0,scaleFactor=0.01},Dynamic[If[!sunk&&running,(elapsedTime+=dt;horizontalAcc=-rockVel[[1]]*b/userMass;verticalAcc=-rockVel[[2]]*b/userMass-gravity;If[rockPos[[2]]<=height/2&&rockVel[[2]]<0,(If[!skipRegistered&&Abs[rockVel[[2]]]>0.1,(skipCount++;skipRegistered=True;)];surfaceAr=Immersed[3,height,gravity,rockVel[[2]],w[rockVel[[1]],cLift,width,userMass,motionAngle,waterdensity],motionAngle];deltaVy=scaleFactor*lifty[userMass,waterdensity,Norm[rockVel],surfaceAr,cLift,cDrag,motionAngle];deltaVx=scaleFactor*liftx[userMass,waterdensity,Norm[rockVel],surfaceAr,cLift,cDrag,motionAngle];rockVel[[2]]+=deltaVy;rockVel[[1]]+=deltaVx;rockPos[[2]]=height/2;rockVel[[2]]=-elasticity*rockVel[[2]];),skipRegistered=False];rockVel[[1]]+=horizontalAcc*dt;rockVel[[2]]+=verticalAcc*dt;rockVel[[1]]=Clip[rockVel[[1]],{-50,50}];rockVel[[2]]=Clip[rockVel[[2]],{-50,50}];rockPos+=rockVel*dt;If[(rockPos[[2]]<0.1&&Abs[rockVel[[2]]]<0.012),sunk=True];)];Graphics[{Gray,GeometricTransformation[Rotate[Rectangle[{-width,-height},{width,height}],motionAngleDegree],rockPos],Blue,Rectangle[{-10,-0.5},{rightXBoundary,0}],If[sunk,Inset[Style["ROCK SUNK",20,Red],{rightXBoundary/2,1},Center],{}]},PlotRange->{{-0.5,rightXBoundary},{-0.5,2}},ImageSize->600,Axes->True]]],Row[{"Rock Mass (kg): ",Row[{"0.05",Slider[Dynamic[userMass],{0.05,0.5}],"0.5"}]}],Row[{"Initial Tilt (degrees): ",Row[{"0",Slider[Dynamic[userTilt],{0,45}],"45"}]}],Row[{"Right X Boundary: ",Row[{"4",Slider[Dynamic[rightXBoundary],{4,20}],"20"}]}],Row[{"Initial X Position: ",Row[{"0",Slider[Dynamic[userInitialX],{0,1}],"1"}]}],(*Allthesecanbeadjustedforwhatwewant*)Row[{"Initial Y Position: ",Row[{"0",Slider[Dynamic[userInitialY],{0,2}],"2"}]}],Row[{"Initial X Velocity: ",Row[{"0",Slider[Dynamic[userInitialVx],{0,10}],"10"}]}],Row[{"Initial Y Velocity: ",Row[{"-10",Slider[Dynamic[userInitialVy],{-10,10}],"10"}]}],(*Displaynumericaloutputsdynamically*)Row[{"Elapsed Time: ",Dynamic[elapsedTime]}],Row[{"xP: ",Dynamic[rockPos[[1]]]}],Row[{"yP: ",Dynamic[rockPos[[2]]]}],Row[{"xV: ",Dynamic[rockVel[[1]]]}],Row[{"yV: ",Dynamic[rockVel[[2]]]}],Row[{"Lift ΔVy: ",Dynamic[deltaVy]}],Row[{"Drag ΔVx: ",Dynamic[deltaVx]}],Row[{"Tilt: ",Dynamic[motionAngle]}],Row[{"Surface Area: ",Dynamic[surfaceAr]}],Row[{"Skip Count: ",Dynamic[skipCount]}]}]]