import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Generate unit circle points
theta = np.linspace(0, 2 * np.pi, 1000)
x_circle = np.cos(theta)
y_circle = np.sin(theta)
# Initialize figure
fig, ax = plt.subplots(figsize=(8, 8))
ax.plot(x_circle, y_circle, 'b-', label="Unit Circle") # Unit circle
ax.axhline(0, color="gray", linestyle="dotted")
ax.axvline(0, color="gray", linestyle="dotted")
# Add dynamic triangle components
triangle_line, = ax.plot([], [], 'r-', linewidth=2, label="Triangle Sides")
point, = ax.plot([], [], 'ro') # Moving point on the circle
# Text for dynamic values
dynamic_text = ax.text(0.03, 0.03, "", fontsize=12, color="black", ha="left", transform=ax.transAxes)
# Set up axis limits and labels
ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.set_title("Sine as a Triangle on the Unit Circle", fontsize=14)
ax.set_xlabel("cos(θ)", fontsize=12)
ax.set_ylabel("sin(θ)", fontsize=12)
ax.legend(loc="upper left")
# Animation update function
def update(frame):
angle = theta[frame]
x_point = np.cos(angle)
y_point = np.sin(angle)
degrees = np.degrees(angle) % 360 # Convert radians to degrees
# Update triangle
triangle_line.set_data([0, x_point, x_point, 0], [0, y_point, 0, 0])
# Update point on the circle
point.set_data([x_point], [y_point]) # Fixed this line to avoid the warning
# Update text for angle, opposite side length, and sin(θ)
dynamic_text.set_text(f"Angle: {degrees:.1f}°\nOpposite Side Length: {y_point:.2f}\nsin(θ): {y_point:.2f}")
return triangle_line, point, dynamic_text
# Create animation
ani = animation.FuncAnimation(fig, update, frames=len(theta), interval=20, blit=True)
plt.show()