12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- # @ Author: Giovanni Dalmasso
- # @ Create Time: 09-02-2024 17:02:07
- # @ Modified by: M. Musy
- import numpy as np
- from vedo import Arrow2D, Latex, Line, Mesh, Plotter, Text3D, dataurl
- # Define the forces and initial angle
- FB = 800 # Newton
- FA = 750 # Newton
- theta = 48 # Initial angle in degrees
- # Calculate the initial components of FA and Fx
- theta_rad = np.radians(theta)
- FA_x = FA * np.sin(theta_rad)
- FA_y = FA * np.cos(theta_rad)
- Fx = FB * np.cos(np.radians(30)) + FA * np.sin(theta_rad)
- # Initialize the text object for Fx with its initial value
- arrow_Fx = Arrow2D([0, 0, 0], (Fx, 0, 0), c="green4")
- label_Fx = Text3D(f"F_x : {Fx:.0f}~N", pos=(Fx, 0, 0), c="green4", s=80)
- # Create arrows for forces
- arrow_FA = Arrow2D([0, 0, 0], (FA_x, FA_y, 0), c="red4")
- label_FA = Text3D(f"F_A : {FA:.0f}~N", (FA_x, FA_y, 0), c="red4", s=80)
- arrow_FB = Arrow2D(
- [0, 0, 0],
- [FB * np.cos(np.radians(30)), -FB * np.sin(np.radians(30)), 0],
- c="blue4",
- )
- arrow_FB.name = "ArrowFixed"
- label_FB = Text3D(
- f"F_B : {FB:.0f}~N",
- pos=(FB * np.cos(np.radians(30)), -FB * np.sin(np.radians(30)), 0),
- c="blue4",
- s=80,
- )
- label_FB.name = "LabelFixed"
- # Vertical line to represent the reference direction for theta
- vertical_line = Line([0, 0, 0], [0, FA_y, 0], c="black", lw=10)
- theta_txt = Latex(r"\vartheta", s=400).pos([0, FA_y / 3, 0])
- deg = Latex(r"30^\circ", s=400).pos([400, -300])
- gio = Text3D("Giovanni D.", s=50, c="blue4", italic=True).pos(-600, -300, 0)
- car = Mesh(dataurl + "porsche.ply").c("k8").lighting("metallic").phong()
- car.scale(50).pos(-300, 0, 0).rotate(90)
- def update_scene(widget, event):
- """Update the forces FA and Fx based on the angle theta."""
- # Recalculate components of FA and Fx
- theta = np.radians(widget.value)
- FA_x, FA_y = FA * np.sin(theta), FA * np.cos(theta)
- Fx = FB * np.cos(np.radians(30)) + FA * np.sin(theta)
- arrow_FA = Arrow2D([0, 0, 0], (FA_x, FA_y, 0), c="red4").z(0.1)
- arrow_Fx = Arrow2D([0, 0, 0], (Fx, 0, 0), c="green4")
- label_FA.pos(FA_x, FA_y, 0.1).text(f"F_A : {FA:.0f}~N")
- label_Fx.pos(Fx, 0, 0).text(f"F_x : {Fx:.0f}~N")
- plt.remove("Arrow2D").add([arrow_FA, arrow_Fx])
- # Create the plotter and a slider to adjust the angle theta
- plt = Plotter(bg2="lightblue", size=(1200, 800))
- plt.add(car, vertical_line, theta_txt, deg, gio)
- plt.add(arrow_FA, arrow_FB, arrow_Fx, label_FA, label_FB, label_Fx)
- plt.add_slider(update_scene, 0, 90, value=theta, title="Theta Angle")
- plt.show(zoom=1.3).close()
|