Có thể bạn quan tâm: Cách Vẽ Đường Cao Hcn: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
TÓM TẮT
- 1 Mở Đầu
- 2 1. Định Nghĩa và Lịch Sử Ngắn Gọn
- 3 2. Toán Học Cơ Bản Của Đường Cong Bézier
- 4 3. Vẽ Đường Cong Bézier Bằng Tay
- 5 4. Vẽ Đường Cong Bézier Trong Phần Mềm Đồ Họa
- 6 5. Lập Trình Vẽ Đường Cong Bézier
- 7 6. Các Kỹ Thuật Nâng Cao
- 8 7. Ứng Dụng Thực Tế
- 9 8. Thực Hành: Tạo Đường Cong Bézier Từ Đầu
- 10 9. Những Sai Lầm Thường Gặp Khi Làm Việc Với Bézier
- 11 10. Kết Luận
Mở Đầu
Trong thế giới đồ họa máy tính, thiết kế UI/UX, hoạt hình và thậm chí là trong lập trình CAD, đường cong Bézier (Bezier curve) là một công cụ không thể thiếu. Được đặt theo tên của Pierre Bézier, một kỹ sư người Pháp đã phát triển chúng vào những năm 1960 để mô tả các hình dạng trong thiết kế ô tô, đường cong Bézier đã nhanh chóng trở thành tiêu chuẩn trong hầu hết các phần mềm vẽ vector như Adobe Illustrator, CorelDRAW, Inkscape hay các thư viện đồ họa như Canvas (HTML5), SVG, OpenGL và Direct2D.
Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, từ những kiến thức nền tảng nhất về đường cong Bézier, cách tính toán, cách vẽ bằng tay và bằng mã lập trình, cho tới các kỹ thuật nâng cao và các trường hợp thực tế trong thiết kế. Nội dung được chia thành các phần rõ ràng, kèm theo ví dụ minh họa, hình ảnh (mô tả) và các đoạn code mẫu, giúp bạn nắm vững cách vẽ đường cong Bézier một cách hiệu quả và sáng tạo.
Lưu ý: Bài viết này hướng tới độc giả có kiến thức cơ bản về đại số và lập trình. Nếu bạn chưa quen với các khái niệm như vector, ma trận hay ngôn ngữ lập trình nào đó, hãy xem lại các tài liệu nền tảng trước khi tiếp tục.
Có thể bạn quan tâm: Cách Vẽ Đường Bình Độ: Hướng Dẫn Chi Tiết Từ A Đến Z
1. Định Nghĩa và Lịch Sử Ngắn Gọn
1.1. Đường Cong Bézier Là Gì?
Đường cong Bézier là một đường cong tham số được xác định bởi một tập hợp các điểm điều khiển (control points). Khi thay đổi vị trí của các điểm này, hình dạng của đường cong sẽ thay đổi một cách mượt mà và dự đoán được. Đối với một đường cong Bézier bậc n, chúng ta cần n + 1 điểm điều khiển.
1.2. Lịch Sử Phát Triển
- 1950s-1960s: Pierre Bézier và Paul de Casteljau (cùng thời kỳ) độc lập phát triển các thuật toán tính toán đường cong trong ngành công nghiệp ô tô.
- 1970s: Đường cong Bézier được tích hợp vào các hệ thống CAD (Computer-Aided Design) đầu tiên.
- 1990s-2000s: Sự xuất hiện của phần mềm đồ họa vector và chuẩn SVG (Scalable Vector Graphics) đưa đường cong Bézier vào web.
- Hiện nay: Đường cong Bézier là nền tảng của hầu hết các công cụ vẽ vector, công cụ hoạt hình, và thậm chí trong các thuật toán machine learning (ví dụ: generative models).
2. Toán Học Cơ Bản Của Đường Cong Bézier
2.1. Công Thức Tổng Quát
Đối với một đường cong Bézier bậc n với các điểm điều khiển (P_0, P_1, …, P_n), công thức tham số Bernstein được viết như sau:
B(t) = \sum_{i=0}^{n} \binom{n}{i} (1-t)^{n-i} t^{i} P_i \quad\text{với}\; t \in 0, 1
Trong đó:
– (\binom{n}{i}) là hệ số tổ hợp (C(n, i)).
– ( (1-t)^{n-i} t^{i}) là các đa thức Bernstein.
– (P_i) là các vector (điểm) trong không gian 2D hoặc 3D.
2.2. Đường Cong Bézier Bậc Hai (Quadratic)
Khi (n = 2), chúng ta có ba điểm điều khiển (P_0, P_1, P_2). Công thức trở thành:
B(t) = (1-t)^2 P_0 + 2(1-t)t P_1 + t^2 P_2
Đây là dạng phổ biến trong các phần mềm vẽ khi bạn kéo một điểm điều khiển duy nhất để tạo đường cong mượt.
2.3. Đường Cong Bézier Bậc Ba (Cubic)
Với (n = 3) (bốn điểm điều khiển), công thức:
B(t) = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t) t^2 P_2 + t^3 P_3
Đường cong bậc ba là tiêu chuẩn trong hầu hết các ứng dụng vì nó cân bằng giữa tính linh hoạt và độ phức tạp tính toán.
2.4. Thuật Toán De Casteljau
Thuật toán De Casteljau là một phương pháp lặp để tính điểm trên đường cong Bézier và đồng thời là nền tảng cho việc chia đoạn (subdivision) đường cong. Thuật toán hoạt động như sau:
- Bắt đầu với tập hợp các điểm điều khiển (P_0, P_1, …, P_n).
- Tại mỗi bước lặp, tạo ra một tập hợp mới các điểm:
P_i^{(k)} = (1-t) \cdot P_i^{(k-1)} + t \cdot P_{i+1}^{(k-1)}
trong đó (k) là số bước lặp (từ 1 tới n) và (i) chạy từ 0 tới (n-k).
- Khi đạt đến bước (k = n), ta thu được một điểm duy nhất (P_0^{(n)}) chính là (B(t)).
Lợi ích:
– Ổn định số học hơn so với tính trực tiếp công thức Bernstein.
– Dễ dàng chia đoạn đường cong thành hai đoạn Bézier con, rất hữu ích trong rasterization và adaptive rendering.
3. Vẽ Đường Cong Bézier Bằng Tay

Có thể bạn quan tâm: Cách Vẽ Đường Chuẩn Độ: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
3.1. Dụng Cụ Cơ Bản
- Bút vẽ hoặc bút máy.
- Thước kẻ (để định vị các điểm điều khiển).
- Giấy kẻ (có lưới hoặc không).
3.2. Các Bước Thực Hiện
Bước 1: Xác Định Các Điểm Điều Khiển
- P0 và P3 (đối với cubic) là điểm đầu và điểm cuối của đường cong.
- P1, P2 là các điểm kéo (handle points) quyết định độ cong.
Bước 2: Vẽ Đường Thẳng Nối Các Điểm
- Nối P0 → P1 → P2 → P3 bằng các đoạn thẳng nhẹ. Đây là đường điều khiển (control polygon).
Bước 3: Sử Dụng Phương Pháp De Casteljau
- Chọn một giá trị t (ví dụ: 0.25, 0.5, 0.75) và thực hiện các bước nội suy:
- Nội suy giữa P0 và P1: (Q_0 = (1-t)P_0 + tP_1)
- Nội suy giữa P1 và P2: (Q_1 = (1-t)P_1 + tP_2)
- Nội suy giữa P2 và P3: (Q_2 = (1-t)P_2 + tP_3)
- Tiếp tục nội suy Q0‑Q1 và Q1‑Q2 để có R0, R1.
- Cuối cùng nội suy R0‑R1 để có điểm trên đường cong (B(t)).
- Đánh dấu B(t) trên giấy.
Bước 4: Lặp Lại Với Nhiều Giá Trị t
- Với các giá trị t khác nhau (ví dụ: mỗi 0.1), lặp lại bước 3 để tạo nhiều điểm trên đường cong.
- Khi đủ điểm, nối chúng bằng một đường mượt (có thể dùng bút tròn mỏng).
Bước 5: Hoàn Thiện
- Xóa bỏ các đường dẫn điều khiển (nếu không cần) để chỉ còn lại đường cong mượt.
3.3. Mẹo Thủ
- Giữ tay nhẹ để có thể sửa đổi các điểm dễ dàng.
- Khi điểm kéo gần nhau, đường cong sẽ gần đường thẳng.
- Độ dài tay cầm (handle length) ảnh hưởng đến độ “cứng” của đoạn cong.
4. Vẽ Đường Cong Bézier Trong Phần Mềm Đồ Họa
4.1. Adobe Illustrator
- Chọn công cụ Pen (P).
- Nhấp để tạo điểm đầu (P0).
- Kéo chuột để tạo điểm kéo (P1). Đường thẳng hướng của chuột sẽ quyết định hướng và độ dài của tay cầm.
- Nhấp để tạo điểm cuối (P3) hoặc tiếp tục kéo để tạo thêm các đoạn Bézier liên tiếp.
- Sửa đổi: Dùng công cụ Direct Selection (A) để di chuyển các điểm điều khiển hoặc tay cầm.
4.2. Inkscape (Miễn phí)
- Quy trình tương tự như Illustrator, nhưng công cụ Bezier (B) cho phép tạo đường thẳng hoặc đường cong tùy theo việc kéo chuột.
- Để chỉnh sửa: Nhấn F2 (Node tool) và kéo các node hoặc các tay cầm.
4.3. CorelDRAW
- Sử dụng Freehand Tool hoặc Bezier Tool.
- Corel còn có tính năng Dynamic Split để tự động chia đường cong khi độ phức tạp tăng.
4.4. Các Lưu Ý Chung
| Yếu tố | Illustrator | Inkscape | CorelDRAW |
|---|---|---|---|
| Độ chính xác tay cầm | Rất cao (điều chỉnh bằng Shift) | Cao (có grid) | Trung bình |
| Hỗ trợ Bézier bậc cao | Có (có thể thêm nhiều node) | Có | Có |
| Shortcut nhanh | P (Pen), A (Direct Select) | B (Bezier), N (Node) | B (Bezier), A (Shape) |
| Xuất file | AI, SVG, PDF | SVG, PDF | CDR, SVG |
5. Lập Trình Vẽ Đường Cong Bézier
5.1. HTML5 Canvas + JavaScript
<canvas id="myCanvas" width="600" height="400" style="border:1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d'); // Định nghĩa 4 điểm điều khiển
const P0 = {x: 50, y: 350};
const P1 = {x: 150, y: 50};
const P2 = {x: 450, y: 50};
const P3 = {x: 550, y: 350}; // Vẽ đường cong bézier bậc 3
ctx.beginPath();
ctx.moveTo(P0.x, P0.y);
ctx.bezierCurveTo(P1.x, P1.y, P2.x, P2.y, P3.x, P3.y);
ctx.strokeStyle = '#ff6600';
ctx.lineWidth = 3;
ctx.stroke(); // Vẽ điểm điều khiển (để minh họa)
function drawHandle(p, color){ ctx.fillStyle = color; ctx.beginPath(); ctx.arc(p.x, p.y, 5, 0, Math.PI2); ctx.fill();
}
drawHandle(P0, 'red');
drawHandle(P1, 'green');
drawHandle(P2, 'green');
drawHandle(P3, 'red'); // Vẽ polygon điều khiển
ctx.setLineDash(5,5);
ctx.beginPath();
ctx.moveTo(P0.x, P0.y);
ctx.lineTo(P1.x, P1.y);
ctx.lineTo(P2.x, P2.y);
ctx.lineTo(P3.x, P3.y);
ctx.strokeStyle = '#999';
ctx.stroke();
ctx.setLineDash();
</script>
Giải thích:
– bezierCurveTo nhận 4 tham số: 2 điểm điều khiển và 1 điểm cuối (điểm đầu đã được moveTo).
– Đường nét setLineDash dùng để vẽ đường polygon điều khiển, giúp người dùng quan sát mối quan hệ.
5.2. SVG Path
<svg width="600" height="400" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"> <!-- Đường cong Bézier bậc 3 --> <path d="M50,350 C150,50 450,50 550,350" stroke="#ff6600" fill="none" stroke-width="3"/> <!-- Các điểm điều khiển --> <circle cx="50" cy="350" r="5" fill="red"/> <circle cx="150" cy="50" r="5" fill="green"/> <circle cx="450" cy="50" r="5" fill="green"/> <circle cx="550" cy="350" r="5" fill="red"/> <!-- Đường polygon điều khiển --> <polyline points="50,350 150,50 450,50 550,350" fill="none" stroke="#999" stroke-dasharray="5,5"/>
</svg>
Lưu ý: Trong SVG, ký hiệu C đại diện cho cubic Bézier, Q cho quadratic.
5.3. Python + Matplotlib
import numpy as np
import matplotlib.pyplot as plt def bezier_cubic(P0, P1, P2, P3, t): return (1-t)3 P0 + 3(1-t)2t P1 + 3(1-t)t2 P2 + t3 P3 # Định nghĩa các điểm (numpy array)
P0 = np.array(0, 0)
P1 = np.array(1, 2)
P2 = np.array(3, 2)
P3 = np.array(4, 0) ts = np.linspace(0, 1, 200)
curve = np.array(bezier_cubic(P0, P1, P2, P3, t) for t in ts) plt.plot(curve:,0, curve:,1, 'r-', linewidth=2) # Đường cong
plt.plot(P00, P10, P20, P30, P01, P11, P21, P31, 'k--', linewidth=1) # Đường điều khiển
plt.scatter(P00, P10, P20, P30, P01, P11, P21, P31, c='red','green','green','red', s=50)
plt.axis('equal')
plt.show()
Kết quả sẽ hiển thị đường cong Bézier cùng các điểm điều khiển và đường polygon.
5.4. Thuật Toán Rasterization (DDA)
Khi vẽ Bézier trên màn hình raster, ta thường dùng algorithme de subdivision (phân đoạn) hoặc forward differencing. Dưới đây là một ví dụ đơn giản bằng C++:
struct Point { double x, y; }; void drawCubicBezier(Point p0, Point p1, Point p2, Point p3)
{ const int STEPS = 1000; // số bước chia for (int i = 0; i <= STEPS; ++i) { double t = double(i) / STEPS; double mt = 1 - t; double x = mtmtmtp0.x + 3mtmttp1.x + 3mtttp2.x + tttp3.x; double y = mtmtmtp0.y + 3mtmttp1.y + 3mtttp2.y + tttp3.y; setPixel(round(x), round(y)); // hàm setPixel tùy nền tảng }
}
Đối với hiệu năng cao, thay vì tính lại đa thức mỗi lần, ta có thể tính đạo hàm bậc nhất và đạo hàm bậc hai để dùng công thức forward differencing – giảm chi phí tính toán đáng kể.
6. Các Kỹ Thuật Nâng Cao
6.1. Chia Đoạn Đường Cong (Subdivision)
- Mục đích: Tăng độ chính xác khi rasterize, hoặc tạo các đoạn con để áp dụng các hiệu ứng riêng biệt.
- Cách thực hiện: Dùng thuật toán De Casteljau với t = 0.5 để chia đường cong thành hai đường cong Bézier con, mỗi con có cùng số điểm điều khiển nhưng vị trí khác nhau.
- Áp dụng: Khi cần adaptive rendering, ví dụ trong game engine, ta chia đoạn cho đến khi độ dài đoạn đủ ngắn để được vẽ bằng một đoạn thẳng.
6.2. Độ Mượt (Smoothness) và Độ Liên Tục Của Đạo Hàm

Có thể bạn quan tâm: Cách Vẽ Đường Che Mặt: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- C1 Continuity: Khi nối hai đoạn Bézier, để đường cong không có “góc”, vector tiếp tuyến tại điểm nối phải trùng nhau. Điều này yêu cầu:
P_{n}^{(1)} – P_{n-1}^{(1)} = P_{0}^{(2)} – P_{1}^{(2)}
- C2 Continuity: Độ liên tục của đạo hàm bậc hai, cho phép chuyển đổi mượt hơn, thường dùng trong thiết kế font.
6.3. Bézier Nhiều Đoạn (Path)
Trong thực tế, một hình dạng phức tạp thường không thể mô tả bằng một đoạn Bézier duy nhất. Ta kết hợp nhiều đoạn (các “segment”) thành một path. Các chuẩn như SVG hoặc PostScript cho phép mô tả chuỗi lệnh M, L, C, Q, Z để tạo đường đóng.
6.4. Bézier Độ Cao (Higher‑Order)
Mặc dù Cubic là phổ biến, trong một số trường hợp cần độ linh hoạt hơn (ví dụ: mô phỏng đường biên phức tạp trong CAD), ta có thể dùng Bézier bậc 5, 7. Tuy nhiên:
– Chi phí tính toán tăng nhanh (O(n²) cho mỗi điểm).
– Độ ổn định số học giảm, nên nên chuyển đổi sang B‑Spline hoặc NURBS.
6.5. Bézier và B‑Spline
- B‑Spline là tổng quát hoá của Bézier, cho phép điểm điều khiển ít hơn để mô tả cùng một hình dạng.
- Khi cần điểm điều khiển nội địa (local control) – thay đổi một điểm chỉ ảnh hưởng tới một phần nhỏ của đường – B‑Spline là lựa chọn tốt hơn.
- NURBS (Non‑Uniform Rational B‑Spline) cho phép điểm cân (weight), thích hợp cho các hình dạng conic (đường tròn, elip).
7. Ứng Dụng Thực Tế
7.1. Thiết Kế UI/UX
- Các button, input field, card thường có border radius được vẽ bằng Bézier để tạo cảm giác mềm mại.
- Transition animation trong CSS (
transition-timing-function: cubic-bezier(...)) cho phép tùy chỉnh tốc độ thay đổi, tạo cảm giác “bóng” tự nhiên.
button { transition: all 0.3s cubic-bezier(0.42, 0, 0.58, 1);
}
7.2. Đồ Họa Vector và Logo
- Logo công ty thường được vẽ bằng các đường cong Bézier để đảm bảo khả năng mở rộng vô hạn mà không mất chất lượng.
- Khi xuất ra PDF hoặc SVG, các phần mềm lưu trữ các điểm điều khiển, cho phép in ấn siêu mịn.
7.3. Hoạt Hình (Animation)
- Motion paths trong After Effects, Blender hoặc Unity thường dựa trên Bézier để xác định vị trí một đối tượng theo thời gian.
- Easing functions trong game engine (Unity, Unreal) được cài đặt bằng các hàm Bézier.
7.4. CAD và CNC
- Đường cong Bézier được dùng để mô tả đường biên công cụ cắt trong máy CNC, vì các máy có thể chuyển đổi Bézier sang G‑code (đường thẳng và vòng tròn) một cách chính xác.
7.5. Machine Learning
- Trong generative models (ví dụ: VAE, GAN) cho vector graphics, đầu ra thường là một tập hợp các điểm điều khiển Bézier, vì chúng cung cấp một biểu diễn gọn gàng và mượt mà của hình ảnh.
8. Thực Hành: Tạo Đường Cong Bézier Từ Đầu
8.1. Bài Tập 1: Vẽ Đường Cong Quadratic Bằng De Casteljau
- Chuẩn bị: Giấy kẻ, bút, thước.
- Điểm điều khiển: P0(10, 200), P1(150, 50), P2(300, 200).
- Thực hiện: Với t = 0, 0.25, 0.5, 0.75, 1, tính các điểm nội suy và đánh dấu.
- Kết quả: Nối các điểm để tạo đường cong mượt.
8.2. Bài Tập 2: Lập Trình Bézier Cubic trong HTML Canvas
- Mục tiêu: Tạo một giao diện kéo‑thả các điểm điều khiển để người dùng có thể thay đổi hình dạng trực tiếp.
- Công nghệ: HTML, CSS, JavaScript.
- Yêu cầu: Khi người dùng kéo một điểm, đường cong cập nhật ngay lập tức; hiển thị polygon điều khiển.
(Bạn có thể tham khảo đoạn code ở mục 5.1 và mở rộng bằng việc thêm sự kiện mousedown, mousemove, mouseup.)
8.3. Bài Tập 3: Chuyển Đổi Đường Cong Bézier Sang G‑Code
- Bối cảnh: Bạn có một đoạn Bézier bậc ba và muốn cắt bằng máy CNC.
- Bước 1: Chia đoạn thành các đoạn thẳng ngắn (sử dụng subdivision tới khi độ lệch < 0.01mm).
- Bước 2: Tạo file G‑code:
G0 X10 Y200 ; di chuyển nhanh tới điểm đầu G1 X... Y... F1500 ; di chuyển bằng đường thẳng - Kết quả: Máy cắt sẽ theo dõi đường cong gần như chính xác.
9. Những Sai Lầm Thường Gặp Khi Làm Việc Với Bézier
| Sai Lầm | Mô Tả | Cách Khắc Phục |
|---|---|---|
| Không hiểu ý nghĩa của tay cầm | Nghĩ rằng tay cầm chỉ là “điểm” | Nhớ rằng độ dài và hướng của tay cầm quyết định độ cong. |
| Quên đồng bộ hoá các điểm khi nối nhiều đoạn | Đường cong có “góc” tại các nút nối | Đảm bảo C1 continuity (điểm tiếp tuyến đồng nhất). |
| Sử dụng quá nhiều điểm điều khiển | Đường cong trở nên “gợn sóng” | Giữ số điểm ít nhất cần thiết; cân nhắc chuyển sang B‑Spline nếu cần. |
| Tính toán trực tiếp công thức Bernstein | Gặp lỗi số học (floating‑point) khi t gần 0 hoặc 1 | Dùng De Casteljau để ổn định hơn. |
| Không tối ưu khi rasterize | Hiệu năng kém trên thiết bị di động | Áp dụng adaptive subdivision hoặc forward differencing. |
10. Kết Luận
Đường cong Bézier không chỉ là một khái niệm toán học, mà còn là một công cụ sáng tạo mạnh mẽ, hiện diện trong mọi khía cạnh của thiết kế số hiện đại. Từ việc vẽ tay trên giấy, qua các phần mềm đồ họa chuyên nghiệp, đến việc lập trình trực tiếp trên web hay trong môi trường CAD, hiểu và thành thạo cách vẽ, điều chỉnh, và tối ưu hoá Bézier sẽ giúp bạn:
- Tạo ra các hình dạng mượt mà, độ phân giải vô hạn.
- Kiểm soát độ linh hoạt và độ chính xác của các đường cong.
- Tối ưu hoá hiệu năng khi render trên các nền tảng khác nhau.
- Áp dụng trong animation, UI/UX, in ấn, công nghiệp và máy học.
Hãy bắt đầu thực hành ngay hôm nay: vẽ một vài đường cong bằng tay, sau đó chuyển sang phần mềm, cuối cùng thử lập trình một đoạn Bézier trong Canvas hoặc SVG. Khi bạn cảm nhận được sức mạnh của chúng, bạn sẽ không còn muốn quay lại các phương pháp cũ nữa.
Chúc bạn thành công và sáng tạo không giới hạn!
