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