Bresenham
Vào thời xưa, khi mọi người vẫn đang viết các thói quen video cơ bản của riêng họ để vẽ các đường và vòng tròn, không có gì lạ khi sử dụng thuật toán dòng Bresenham cho điều đó.
Bresenham giải quyết vấn đề này: bạn muốn vẽ một đường trên màn hình để di chuyển các dx
pixel theo hướng ngang trong khi đồng thời kéo dài các dy
pixel theo hướng dọc. Có một ký tự "floaty" vốn có cho các dòng; ngay cả khi bạn có pixel nguyên, bạn kết thúc với độ nghiêng hợp lý.
Thuật toán phải nhanh, có nghĩa là nó chỉ có thể sử dụng số học số nguyên; và nó cũng biến mất mà không có bất kỳ phép nhân hay phép chia nào, chỉ có phép cộng và phép trừ.
Bạn có thể điều chỉnh trường hợp đó:
- "Hướng x" của bạn (theo thuật toán Bresenham) là đồng hồ của bạn.
- "Hướng y" của bạn là giá trị bạn muốn tăng (nghĩa là vị trí của nhân vật của bạn - cẩn thận, đây không thực sự là "y" của sprite của bạn hoặc bất cứ điều gì trên màn hình, hơn nữa là một giá trị trừu tượng)
"X / y" ở đây không phải là vị trí trên màn hình, mà là giá trị của một trong các kích thước của bạn theo thời gian. Rõ ràng, nếu sprite của bạn đang chạy theo hướng tùy ý trên màn hình, bạn sẽ có nhiều Bresenham chạy riêng, 2 cho 2D, 3 cho 3D.
Thí dụ
Giả sử bạn muốn di chuyển nhân vật của mình theo chuyển động đơn giản từ 0 đến 25 dọc theo một trong các trục của bạn. Khi nó di chuyển với tốc độ 2.5, nó sẽ phát triển ở khung 10.
Điều này giống như "vẽ một đường" từ (0,0) đến (10,25). Lấy algoritm dòng của Bresenham và để cho nó chạy. Nếu bạn làm đúng (và khi bạn nghiên cứu nó, nó sẽ nhanh chóng trở nên rõ ràng về cách bạn làm đúng), sau đó nó sẽ tạo ra 11 "điểm" cho bạn (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25).
Gợi ý thích ứng
Nếu bạn google thuật toán đó và tìm một số mã (Wikipedia có một hiệp ước khá lớn về nó), có một số điều bạn cần để ý:
- Nó rõ ràng hoạt động cho tất cả các loại
dx
và dy
. Bạn quan tâm đến một trường hợp cụ thể mặc dù (nghĩa là bạn sẽ không bao giờ có dx=0
).
- Việc thực hiện thông thường sẽ có một số trường hợp khác nhau cho các góc phần tư trên màn hình, tùy thuộc vào việc có
dx
và dy
tích cực, tiêu cực abs(dx)>abs(dy)
hay không. Bạn tất nhiên cũng chọn những gì bạn cần ở đây. Bạn phải đặc biệt chắc chắn rằng hướng tăng theo 1
mỗi tích tắc luôn là hướng "đồng hồ" của bạn.
Nếu bạn áp dụng những đơn giản hóa này, kết quả thực sự sẽ rất đơn giản và loại bỏ hoàn toàn mọi thực tế.