Vẽ đường khử răng cưa nhanh


11

Thuật toán dòng của Bresenham là cách vẽ các đường thẳng chỉ bằng các phép toán số nguyên nhanh (cộng, trừ và nhân với 2). Tuy nhiên, nó tạo ra các dòng bí danh. Có một cách nhanh chóng tương tự để vẽ các đường khử răng cưa?


1
Một vài câu hỏi ... bạn đang thực hiện logic vẽ trên CPU hoặc GPU? Ngoài ra, bạn đang tìm kiếm các thuật toán dựa trên số nguyên hoặc dấu phẩy động?
Alan Wolfe

5
@AlanWolfe, thuật toán số nguyên trên CPU - môi trường giống như thuật toán của Bresenham được thiết kế cho.
Đánh dấu

3
vi.wikipedia.org/wiki/Xiaolin_Wu%27s_line_alacticm là trang cổ điển, mặc dù trang wikipedia khá nửa vời và tôi không có quyền truy cập vào bài báo. Điều này cảm thấy giống như một câu hỏi lười biếng, vì nó khá dễ dàng để tìm thấy điều này bằng cách thực hiện một số googling cơ bản.
yuriks

2
Chỉ cần suy nghĩ thành tiếng, tôi cho rằng Bresenham có thể dễ dàng điều chỉnh để vẽ các đường kẻ dày nhiều pixel. Sau đó, bạn có thể thực hiện khử răng cưa bằng cách tính khoảng cách của từng tâm pixel từ đường lý tưởng toán học và áp dụng một số hàm dự phòng.
Nathan Reed

2
Tôi không thể đánh dấu một nhận xét là chính xác, mặc dù.
Đánh dấu

Câu trả lời:


9

Có một cách nhanh chóng tương tự để vẽ các đường khử răng cưa?

Không, bởi vì theo định nghĩa, một đường chống răng cưa chạm vào nhiều pixel hơn. Các thuật toán như vậy sẽ chậm hơn.


Trong một trình rasterizer phần mềm, cách phổ biến để vẽ các đường chống răng cưa là thuật toán dòng của Xiaolin Wu . Không khó để thực hiện, và dù sao cũng có mã giả chất lượng cao bất thường tại liên kết đó.

Trong ống raster phần cứng, dòng nguyên thủy được mở rộng thành một hình tứ giác không gian màn hình bằng trình đổ bóng hình học mặc định (hoặc do người dùng cung cấp), sau đó được vẽ thành hai hình tam giác, sau đó có thể được khử răng cưa theo những cách thông thường.

Trong một raytracer, có nhiều lựa chọn khác nhau. Thật đáng suy nghĩ về cách bạn thực sự muốn vẽ một đối tượng 1D. Có lẽ như một hình trụ (woo bóng!). Lưu ý rằng điều này giới thiệu các vấn đề về phối cảnh / báo trước có thể (hoặc có thể không) là những gì bạn muốn. Không có sự khái quát rõ ràng. Sau đó, rõ ràng, bất cứ điều gì bạn làm, bạn chỉ cần thay thế nó.


"Và dù sao cũng có mã giả chất lượng cao khác thường ở liên kết đó", tôi không đồng ý. Mã giả đó có thể không phải là một triển khai đúng thuật toán của Wu mặc dù nó dường như là thứ được sử dụng ở vô số nơi trên web. Thuật toán ban đầu của Wu đã thu hút từ cả hai đầu vào phía trong về phía trung tâm và thực sự nhanh hơn Bresenham vì nó thực hiện khoảng một nửa số thao tác mặc dù nó ghi vào nhiều pixel hơn. Tôi đang nói về thuật toán thực tế của Wu không phải là thuật toán được đăng trong bài viết trên wikipedia được liên kết.
Bạch tuộc

@Octopus [Thể hiện sự hoài nghi mơ hồ, đặc biệt là trên bit nhanh hơn, nhưng thiếu bối cảnh để bác bỏ hoặc xác nhận nếu điều này là như vậy, các nguồn, chỉnh sửa và chỉnh sửa tất nhiên được chào đón.]
imallett

Phụ thuộc vào những gì bạn đếm. Nếu bạn vẽ từ cả hai đầu vào trong thì thuật toán của Wu thực hiện một nửa các phép tính nhưng gấp đôi số pixel ghi. Xem Bảng 1 trong bài viết của Wu, được liên kết trên Wikipedia. Vì vậy, nếu ghi pixel đắt tiền, như trường hợp khi ghi vào màn hình LCD trên kết nối nối tiếp, thì thuật toán của Wu đắt hơn Bresenham. (Tôi phải thừa nhận rằng tôi không hiểu tại sao thuật toán của Bresenham cũng không thể sử dụng tính đối xứng.)
Jan-Åke Larsson

1
Nhưng tôi đồng ý với @Octopus, thậm chí chấp nhận "rút từ đầu này sang đầu kia", mã giả là thuật toán của Wu chỉ khi số học số nguyên được sử dụng xuyên suốt. Mã tôi thấy trực tuyến sử dụng số học dấu phẩy động, đây là một thay đổi đáng kể. Trong bài báo của Wu, thuật toán chỉ sử dụng số học số nguyên (hoặc thực tế là số học điểm cố định).
Jan-Åke Larsson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.