Рисование кривой Безье

нужно нарисовать кривую Безье:
а) обычный алгоритм(я реализовал только этот пункт)
б)алгоритм де Кастельо
в) составная кривая, рациональная кривая Безье
Помогите реализовать другие два пункта
#код обычного алгоритма кривой Безье

import pygame
from sys import exit
#цвет фона, линий между точками и цвет самой кривой. 
BLACK = (0,0,0)
WHITE = (100,100,100)
RED = (230, 0, 0)
dots = []#список для опорных точек
curve = []#список координат точек кривой
press = 0#переменная,которая является флагом
pygame.init()
screen = pygame.display.set_mode((1000, 600))
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_TAB:#добавляется событие на клавишу TAB для сброса всех данных
                dots = []
                curve = []
                press = 0
        if event.type == pygame.MOUSEBUTTONDOWN:#при нажатии левой кнопки мыши перебираю значения флага.
            if event.button ==1:
                if press == 0:#случай, когда флаг нулевой
                    press = 1
                    dots = [event.pos, event.pos, event.pos, event.pos]#добавление 4 точки со значениями позиции нажатия.
                elif press == 1:
                    press = 2
                elif press == 2:
                    press = 3
                elif press == 3:
                    press = -1
#Далее обработка события движения мыши по экрану. В зависимости от значения флага — меняется соответствующая точка
        if event.type == pygame.MOUSEMOTION:
            if press == 1:
                dots[3] = event.pos
            elif press == 2:
                dots[2] = event.pos
            elif press == 3:
                dots[1] = event.pos
    screen.fill(BLACK)
    if dots:
        pygame.draw.aalines(screen, WHITE, False, dots)#переход к отрисовке,
        for dot in dots:
            pygame.draw.circle(screen, WHITE, dot, 5, 1)#Добавление выделения опорных точек с помощью окружностей
        curve = []#Обнуление списка  точкек кривой, чтобы динамически рисовать её каждый кадр.
        for i in map(lambda x: x/100.0, range(0, 105, 5)):#Чтобы пройтись по дробным значениям t нам не подойдёт стандартный range – используем map в связке с лямбда функцией для генерации списка с дробными значениями и проходим по нему.
            x = (1.0-i)**3*dots[0][0] + 3*(1.0-i)**2*i*dots[1][0] + 3*(1.0-i)*i**2*dots[2][0] + i**3*dots[3][0]#Для значения X и Y используем формулу кубической кривой.
            y = (1.0-i)**3*dots[0][1] + 3*(1.0-i)**2*i*dots[1][1] + 3*(1.0-i)*i**2*dots[2][1] + i**3*dots[3][1]
            curve.append([x, y])
        pygame.draw.lines(screen, RED, False, curve, 3)#рисуется ломанная кривая
 
    pygame.display.flip()
    clock.tick(30)