TASK 1: **Animated Sine Curve**

Write a Python program one.py with PyOpenGL to display an animation of sine function **y=Asin(x+B)**, satifying the following requirements:

- The window application’s size is (600, 600), and its upper-left corner is at (250, 250) on the screen;
- The window application’s title is
**Animated Sine Curve**. - The ranges of x and y are [-4, 4] (x is in radians);
- The amplitude A is a random float in [1, 2], and it is updated each time the window application restarts;
- The phase shift B is a float; it is initialized as 0, and incremented by 0.01 each time the screen refreshes;
- The two axes are drawn in white, with an arrow towards the positive direction at the end of each axis;
- The sine curve is drawn in yellow.
- Orthogonal projection is used in this task.

The following figure illustrates the expected window application.

TASK 2: **Clamped B-Spline**

Write a Python program two.py with PyOpenGL to display a clamped B-spline, satifying the following requirements:

- The window application’s size is (550, 550), and its upper-left corner is at (150, 150) on the screen;
- The window application’s title is
**Special B-Splines**. - The program reads a text file named
**control-points.txt**, including an**x,y**coordinate pair in each line as a control point, in the same folder; - Control points are drawn with size 4 in green.
- Based on the control points, a clamped B-spline is drawn.
- P(t)’s color, mixed by red and blue, depends on its curvature (R = curvature / 5, G = 0.0, B = 1 – curvature / 5);
- Curvature is clipped by [0, 5].
- Orthogonal projection is used in this task.

The following figure illustrates the expected window application, reading the sample **control-points.txt** provided.

TASK 3: **Hexagonal Pyramid**

Write a Python program three.py with PyOpenGL to display a 3D hexagonal pyramid, satifying the following requirements:

- The window application’s size is (400, 400), and its upper-left corner is at (100, 100) on the screen;
- The window application’s title is
**Hexagonal Pyramid**. - The program reads a text file named
**pyramid-params.txt**, including one line as**x,y,z,H,R**, in the same folder, where**x**,**y**and**z**are the coordinates of the top vertex*v*,**H**is the height, and**R**is the radius; we assume the top vertex*v*and the base centroid*c*are on the same vertical axis, and*c*is always under*v*; the distance between*c*and any base vertex*vi*is always**R**. - Based on the above information, a hexagonal pyramid is drawn.
- All faces are randomly and differently colored, except for the base in white.
- When the key
**R**is pressed, the radis increases by**0.01**and the hexagonal pyramid is redrawn. - When the key
**H**is pressed, the height decreases by**0.01**and the hexagonal pyramid is redrawn. - The hexagonal pyramid is static by default; When the key
**X**,**Y**or**Z**is pressed, the hexagonal pyramid toggles between being static and rotating 1 degree/refresh along the corresponding axis (i.e., the key**X**corresponds to the**x**axis), taking*c*as the origin. - Perspective projection is used in this task (FoV is 90 degrees towards the y-axis; Camera looks at the origin and uses the y-axis direction as the up-vector).

The following figure illustrates the expected window application, reading the sample **pyramid-params.txt** provided.