# Write A Python Program

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.

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.

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 xy and z are the coordinates of the top vertex vH 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 XY 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.