TÓM TẮT
- 1 Giới thiệu chung
- 2 1. Kiến thức nền tảng về fractal và hàn tuyết kỳ
- 3 2. Chuẩn bị môi trường lập trình
- 4 3. Vẽ Koch Snowflake bằng Python (turtle)
- 5 4. Vẽ Koch Snowflake bằng JavaScript (Canvas)
- 6 5. Tạo hàn tuyết kỳ trong Adobe Illustrator (Vector)
- 7 6. Khám phá các biến thể và sáng tạo
- 8 7. Ứng dụng thực tiễn của hàn tuyết kỳ
- 9 8. Tổng kết và lời khuyên cho người mới bắt đầu
- 10 9. Mở rộng: Tự động sinh snowflake cho in 3D
- 11 10. Kết luận
Giới thiệu chung
Vẽ hàn tuyết kỳ (còn gọi là “snowflake fractal” trong tiếng Anh) là một trong những chủ đề hấp dẫn nhất trong lĩnh vực đồ họa máy tính và toán học. Không chỉ mang lại những hình ảnh đẹp mắt, lấp lánh như bông tuyết thực, mà còn giúp người học hiểu sâu hơn về các khái niệm fractal, lặp lại tự nhiên và thuật toán đệ quy. Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, từ các kiến thức nền tảng, chuẩn bị môi trường lập trình, đến việc thực hiện các bước vẽ hàn tuyết kỳ bằng ngôn ngữ lập trình Python, JavaScript và thậm chí là các công cụ đồ họa như Adobe Illustrator.
Mục tiêu của chúng tôi là giúp bạn không chỉ vẽ được một hình hàn tuyết kỳ đẹp mắt mà còn hiểu rõ cơ chế hoạt động bên trong, từ đó có thể tùy biến, sáng tạo ra những mẫu fractal độc đáo riêng của mình.
1. Kiến thức nền tảng về fractal và hàn tuyết kỳ
1.1 Fractal là gì?
Fractal (phân đoạn) là một cấu trúc hình học có tính tự‑tương đồng (self‑similarity), nghĩa là khi ta phóng to một phần của nó, phần đó lại trông giống hệt toàn bộ. Fractal xuất hiện trong tự nhiên (cây, mây, bờ biển, băng tuyết…) và trong nghệ thuật kỹ thuật số. Các đặc điểm chính của fractal:
- Tự‑tương đồng: Cấu trúc lặp lại ở mọi mức độ thu phóng.
- Chi tiết vô hạn: Khi phóng to, luôn có thêm chi tiết mới xuất hiện.
- Độ phức tạp cao: Dù thuật toán tạo ra có thể rất đơn giản, kết quả lại rất phức tạp.
1.2 Hàn tuyết kỳ (Snowflake Fractal)
Hàn tuyết kỳ là một loại fractal được tạo ra bằng cách lặp lại một hình tam giác đều và cắt bỏ các phần trung tâm. Mẫu hình phổ biến nhất là Koch Snowflake, được nhà toán học Helge von Koch đưa ra vào năm 1904. Quá trình tạo ra Koch Snowflake bao gồm các bước:

Có thể bạn quan tâm: Cách Vẽ Hàm Y = 0: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Bắt đầu với một đoạn thẳng (hoặc tam giác đều).
- Chia đoạn thẳng thành ba phần bằng nhau.
- Thay đoạn giữa bằng hai đoạn tạo thành một “đỉnh” tam giác nhọn.
- Lặp lại quá trình trên cho mọi đoạn mới tạo ra.
Kết quả là một đường viền “răng cưa” vô hạn, tạo cảm giác băng tuyết lấp lánh.
1.3 Các biến thể của hàn tuyết kỳ
- Koch Snowflake: Dựa trên tam giác đều, tạo ra hình bông tuyết truyền thống.
- Sierpinski Triangle: Loại fractal dựa trên việc lặp lại tam giác và xóa phần trung tâm.
- Mandelbrot Set: Mặc dù không phải là hàn tuyết, nhưng là một trong những fractal nổi tiếng nhất.
- Custom Snowflake: Tự thiết kế các quy tắc cắt và lặp lại để tạo ra các mẫu bông tuyết độc đáo.
2. Chuẩn bị môi trường lập trình
2.1 Lựa chọn ngôn ngữ
- Python: Thân thiện cho người mới, có thư viện
matplotlib,turtle,pygame. - JavaScript (Canvas/WebGL): Dễ dàng hiển thị trên trình duyệt, tương tác nhanh.
- Processing: Ngôn ngữ dựa trên Java, rất mạnh cho đồ họa generative.
- C++ với OpenGL: Đối với người muốn tối ưu hiệu năng cao.
Trong bài viết này, chúng ta sẽ tập trung vào Python và JavaScript, vì chúng phổ biến và dễ tiếp cận.
2.2 Cài đặt Python và thư viện cần thiết
- Cài đặt Python (phiên bản 3.8+):
“`bash
# Trên Windows
winget install Python.Python.3.11
# Trên macOS
brew install python@3.11
# Trên Linux (Ubuntu)
sudo apt-get update
sudo apt-get install python3 python3-pip
“`
- Cài đặt thư viện:
bash pip install matplotlib pip install numpy pip install turtle
2.3 Cài đặt môi trường JavaScript
- Trình duyệt hiện đại (Chrome, Firefox, Edge).
- Code editor: VS Code, Sublime Text, hoặc bất kỳ IDE nào.
- Live Server extension (đối với VS Code) để xem kết quả ngay.
3. Vẽ Koch Snowflake bằng Python (turtle)
3.1 Giới thiệu về thư viện turtle
turtle là một thư viện đồ họa đơn giản, mô phỏng con rùa di chuyển trên màn hình, rất thích hợp để dạy lập trình và vẽ fractal.

Có thể bạn quan tâm: Cách Vẽ Hàm Markowitz Trong Excel: Hướng Dẫn Chi Tiết Từ A Đến Z
3.2 Thuật toán cơ bản
import turtle def koch_segment(t, length, depth): """Vẽ một đoạn Koch với độ sâu depth.""" if depth == 0: t.forward(length) return length /= 3.0 koch_segment(t, length, depth-1) t.left(60) koch_segment(t, length, depth-1) t.right(120) koch_segment(t, length, depth-1) t.left(60) koch_segment(t, length, depth-1) def koch_snowflake(t, size, depth): """Vẽ toàn bộ Koch Snowflake.""" for _ in range(3): koch_segment(t, size, depth) t.right(120) # Khởi tạo màn hình và rùa
screen = turtle.Screen()
screen.bgcolor("black")
t = turtle.Turtle()
t.speed(0) # tốc độ tối đa
t.color("cyan")
t.pensize(2) # Vẽ snowflake
koch_snowflake(t, 300, 4) turtle.done()
Giải thích chi tiết
koch_segment: Đệ quy vẽ một đoạn. Khidepth == 0, rùa di chuyển thẳng; ngược lại, đoạn được chia thành 4 phần mới.koch_snowflake: Gọikoch_segmentba lần, mỗi lần quay 120 độ để tạo tam giác.- Tham số
depth: Độ sâu lặp lại. Tăngdepthsẽ tăng chi tiết nhưng cũng làm thời gian tính toán tăng gấp bội (độ phức tạp O(4^depth)).
3.3 Tối ưu hoá và tùy biến
- Thay đổi màu: Sử dụng
t.pencolor()với hàmrandomđể tạo hiệu ứng màu lấp lánh. - Thêm gradient: Vẽ từng lớp với độ dày bút và màu khác nhau để tạo cảm giác 3D.
- Tăng độ sâu: Khi
depth>= 6, thời gian vẽ sẽ lâu; có thể dùngtracer(0,0)để tắt cập nhật liên tục vàupdate()cuối cùng.
t.tracer(0,0) # tắt animation
# ... vẽ snowflake ...
t.update() # cập nhật một lần sau khi vẽ xong
4. Vẽ Koch Snowflake bằng JavaScript (Canvas)
4.1 Thiết lập HTML & Canvas
<!DOCTYPE html>
<html lang="vi">
<head> <meta charset="UTF-8"> <title>Koch Snowflake</title> <style> body { margin:0; background:#000; } canvas { display:block; margin:auto; } </style>
</head>
<body>
<canvas id="snowflake"></canvas>
<script src="snowflake.js"></script>
</body>
</html>
4.2 Thuật toán JavaScript
// snowflake.js
const canvas = document.getElementById('snowflake');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight; function kochSegment(x1, y1, x2, y2, depth) { if (depth === 0) { ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); return; } const dx = (x2 - x1) / 3; const dy = (y2 - y1) / 3; const xA = x1 + dx; const yA = y1 + dy; const xB = x1 + 2 dx; const yB = y1 + 2 dy; // Tính điểm đỉnh tam giác const angle = Math.atan2(y2 - y1, x2 - x1) - Math.PI / 3; const length = Math.hypot(dx, dy); const xC = xA + Math.cos(angle) length; const yC = yA + Math.sin(angle) length; kochSegment(x1, y1, xA, yA, depth - 1); kochSegment(xA, yA, xC, yC, depth - 1); kochSegment(xC, yC, xB, yB, depth - 1); kochSegment(xB, yB, x2, y2, depth - 1);
} function drawSnowflake(size, depth) { const cx = canvas.width / 2; const cy = canvas.height / 2; const height = size Math.sqrt(3) / 2; const p1 = {x: cx - size / 2, y: cy + height / 3}; const p2 = {x: cx + size / 2, y: cy + height / 3}; const p3 = {x: cx, y: cy - 2 height / 3}; ctx.strokeStyle = '#00ffff'; ctx.lineWidth = 1; ctx.beginPath(); kochSegment(p1.x, p1.y, p2.x, p2.y, depth); kochSegment(p2.x, p2.y, p3.x, p3.y, depth); kochSegment(p3.x, p3.y, p1.x, p1.y, depth); ctx.stroke();
} // Vẽ với độ sâu 5
drawSnowflake(400, 5);
Giải thích
kochSegment: Tương tự như Python, nhưng sử dụng các phép tính góc và tọa độ để vẽ trên Canvas.drawSnowflake: Xác định ba đỉnh tam giác đều và gọikochSegmentcho mỗi cạnh.- Hiệu năng: Khi
depth> 6, số đoạn tăng mạnh; có thể dùngrequestAnimationFrameđể vẽ dần dần hoặcoffscreenCanvasđể tối ưu.
4.3 Thêm hiệu ứng động
Bạn có thể tạo một animation vòng lặp, thay đổi depth dần dần để tạo cảm giác “sinh động”:
let depth = 0;
function animate() { ctx.clearRect(0,0,canvas.width,canvas.height); drawSnowflake(400, depth); depth = (depth + 1) % 7; // quay lại 0 sau 6 requestAnimationFrame(animate);
}
animate();
5. Tạo hàn tuyết kỳ trong Adobe Illustrator (Vector)
5.1 Sử dụng công cụ “Blend” và “Pattern”

Có thể bạn quan tâm: Cách Vẽ Hàm F(x): Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Vẽ một tam giác đều (Shift + Click để giữ góc 60°).
- Sao chép và chia: Dùng
Object > Path > Divide Objects Belowđể chia đoạn thành ba phần. - Tạo hình tam giác nhọn: Vẽ một tam giác phụ, đặt trên đoạn giữa, sau đó dùng
Pathfinder > Minus Frontđể tạo “răng cưa”. - Sử dụng “Effect > Distort & Transform > Transform”: Đặt số lần lặp (
Copies) và góc (Rotate) để tạo ra các cạnh lặp lại. - Lặp lại: Nhóm các đoạn đã tạo, sao chép và áp dụng lại công cụ Transform cho các cạnh còn lại.
5.2 Tự động hoá bằng Script
Illustrator hỗ trợ JavaScript (ExtendScript). Dưới đây là một đoạn script ngắn để tạo Koch Snowflake tự động:
function kochSegment(doc, p1, p2, depth){ if (depth===0){ var line = doc.pathItems.add(); line.setEntirePath(p1, p2); line.stroked = true; line.filled = false; return; } var dx = (p20-p10)/3; var dy = (p21-p11)/3; var a = p10+dx, p11+dy; var b = p10+2dx, p11+2dy; var angle = Math.atan2(p21-p11, p20-p10) - Math.PI/3; var len = Math.sqrt(dxdx+dydy); var c = a0+Math.cos(angle)len, a1+Math.sin(angle)len; kochSegment(doc, p1, a, depth-1); kochSegment(doc, a, c, depth-1); kochSegment(doc, c, b, depth-1); kochSegment(doc, b, p2, depth-1);
}
var doc = app.activeDocument;
var size = 300;
var height = sizeMath.sqrt(3)/2;
var cx = doc.width/2, cy = doc.height/2;
var p1 = cx-size/2, cy+height/3;
var p2 = cx+size/2, cy+height/3;
var p3 = cx, cy-2height/3;
kochSegment(doc, p1, p2, 4);
kochSegment(doc, p2, p3, 4);
kochSegment(doc, p3, p1, 4);
Chỉ cần mở ExtendScript Toolkit, dán đoạn code trên và chạy. Bạn sẽ nhận được một Snowflake vector hoàn hảo, dễ dàng chỉnh sửa bằng công cụ Illustrator.
6. Khám phá các biến thể và sáng tạo
6.1 Thay đổi góc và tỉ lệ
- Góc 60° là tiêu chuẩn cho Koch Snowflake. Thay đổi góc thành 45°, 30° hay 90° sẽ tạo ra các mẫu “băng” hoàn toàn khác.
- Tỉ lệ chia đoạn: Thay vì chia thành 3 phần bằng nhau, bạn có thể chia thành 4, 5 phần, hoặc sử dụng tỉ lệ khác (ví dụ 1:2:1). Điều này tạo ra các fractal mới mang phong cách riêng.
6.2 Kết hợp với Sierpinski Triangle
Bạn có thể vẽ một tam giác Sierpinski và sau đó áp dụng quy tắc Koch lên các cạnh để có “bông tuyết trong bông tuyết”. Kết quả rất ấn tượng khi kết hợp hai fractal.
6.3 Tạo hiệu ứng ánh sáng
- Gradient: Sử dụng gradient màu từ xanh lam nhạt tới trắng để mô phỏng ánh sáng phản chiếu.
- Blur: Áp dụng Gaussian blur nhẹ để tạo cảm giác “băng glít”.
- Glowing: Dùng
ctx.shadowBlurvàctx.shadowColortrong Canvas để tạo halo xung quanh các cạnh.
6.4 3D Snowflake

Có thể bạn quan tâm: Cách Vẽ Hàm E^x: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
Sử dụng thư viện Three.js (JavaScript) hoặc OpenGL (C++) để tạo mô hình 3D của snowflake, xoay tròn và chiếu sáng bằng các nguồn sáng phong cách Phong. Điều này mở ra cơ hội làm mô hình 3D in hoặc đồ họa thời gian thực.
7. Ứng dụng thực tiễn của hàn tuyết kỳ
- Thiết kế logo: Nhiều công ty sử dụng hình bông tuyết fractal để biểu trưng cho sự tinh tế và độc đáo.
- Trang trí mùa đông: Áp dụng vào background website, poster, thiệp chúc mừng.
- Mô phỏng thời tiết: Trong các trò chơi mô phỏng môi trường, fractal snowflake giúp tạo băng tuyết tự nhiên.
- Giáo dục: Dạy học sinh về đệ quy, toán học và nghệ thuật số.
8. Tổng kết và lời khuyên cho người mới bắt đầu
- Bắt đầu đơn giản: Vẽ một Koch segment với độ sâu 1‑2 để nắm vững thuật toán.
- Kiểm soát độ sâu: Độ sâu lớn sẽ làm chương trình chậm. Sử dụng
tracer(0,0)trong Python hoặcrequestAnimationFrametrong JS để tối ưu. - Thử nghiệm: Đừng ngại thay đổi góc, tỉ lệ, màu sắc. Đây là cách tốt nhất để hiểu cách fractal phản hồi với các tham số.
- Tài liệu tham khảo:
- The Fractal Geometry of Nature – Benoît Mandelbrot.
- Programming Fractals – Michael F. Barnsley.
- Trang web fractalfoundation.org và mathworld.wolfram.com.
- Cộng đồng: Tham gia các forum như Stack Overflow, Reddit r/Fractals, và Discord để chia sẻ tác phẩm, nhận phản hồi và học hỏi.
9. Mở rộng: Tự động sinh snowflake cho in 3D
Nếu bạn muốn in 3D một snowflake, các bước cơ bản:
- Tạo mô hình STL bằng Python +
numpy-stl:
“`python
from stl import mesh
import numpy as np
# Hàm tạo các tam giác dựa trên các điểm đã tính
# (chi tiết code dài, có thể tìm trên internet “Koch snowflake STL python”)
“`
2. Import vào Blender: Sử dụng addon “Import STL” và áp dụng modifier “Solidify” để tạo độ dày.
3. Xuất file G-code cho máy in 3D.
10. Kết luận
Vẽ hàn tuyết kỳ không chỉ là một hoạt động nghệ thuật mà còn là một hành trình khám phá toán học và lập trình. Từ những đoạn code Python đơn giản, tới các dự án JavaScript tương tác, hoặc thậm chí là mô hình 3D cho in, bạn luôn có thể mở rộng và sáng tạo không giới hạn. Hy vọng bài viết này đã cung cấp cho bạn đủ kiến thức nền tảng, công cụ và cảm hứng để bắt đầu hành trình tạo ra những bông tuyết fractal tuyệt đẹp của riêng mình. Hãy thử nghiệm, chia sẻ và tiếp tục khám phá thế giới vô tận của fractal!
