Krzywe Béziera

Krzywe Béziera są powszechnie używane w grafice komputerowej, CAD, animacji i innych dziedzinach związanych z projektowaniem. Krzywe te są definiowane za pomocą punktów kontrolnych. Poniżej wyjaśnienie, jak działają krzywe Béziera oraz jak je generować.

Krzywa Béziera

Krzywa Béziera jest określona przez zestaw punktów kontrolnych P0, P1, …, Pn. Dla czterech punktów kontrolnych, krzywa Béziera trzeciego stopnia (cubic Bézier curve) jest najczęściej używana i ma równanie parametryczne:

B(t)=(1−t)3P0+3(1−t)2tP1+3(1−t)t2P2+t3P3

gdzie t jest parametrem, który zmienia się od 0 do 1.

Algorytm de Casteljau

Algorytm de Casteljau jest używany do efektywnego rysowania krzywych Béziera. Jest to metoda rekursywna, która dzieli krzywą na mniejsze części.

Poniżej znajduje się przykład implementacji krzywej Béziera trzeciego stopnia w Pythonie przy użyciu biblioteki matplotlib do wizualizacji. Uruchomienie poniższego kodu wygeneruje krzywą Béziera trzeciego stopnia z podanymi punktami kontrolnymi, co pozwala na wizualizację jej kształtu. Można modyfikować punkty kontrolne, aby zobaczyć, jak zmienia się krzywa.

Implementacja algorytmu w języku Python

import numpy as np
import matplotlib.pyplot as plt
def bezier_curve(P0, P1, P2, P3, num_points=100):
    t = np.linspace(0, 1, num_points)
    curve = (1-t)**3[:, None] * P0 + 3*(1-t)**2[:, None] * t[:, None] * P1 + 3*(1-t)[:, None] * t**2[:, None] * P2 + t**3[:, None] * P3
    return curve
# Definicja punktów kontrolnych
P0 = np.array([0, 0])
P1 = np.array([1, 2])
P2 = np.array([3, 3])
P3 = np.array([4, 0])
# Generowanie krzywej Béziera
curve = bezier_curve(P0, P1, P2, P3)
# Rysowanie krzywej Béziera i punktów kontrolnych
plt.plot(curve[:, 0], curve[:, 1], label="Krzywa Béziera")
plt.scatter([P0[0], P1[0], P2[0], P3[0]], [P0[1], P1[1], P2[1], P3[1]], color='red')
plt.plot([P0[0], P1[0], P2[0], P3[0]], [P0[1], P1[1], P2[1], P3[1]], 'r--', label="Linie kontrolne")
plt.legend()
plt.xlabel("x")
plt.ylabel("y")
plt.title("Krzywa Béziera trzeciego stopnia")
plt.show()

Komentarze