Làm thế nào tôi nên điền vào một hình dạng bao gồm các đường cong Bezier và các đường thẳng?


8

Tôi đã làm việc trên một thư viện đồ họa một thời gian và đã đến lúc tôi phải vẽ Bezier và các phông chữ dựa trên dòng. Cho đến thời điểm này tôi bị mắc kẹt với điều này:

Tôi

một

Các đường màu xanh lá cây là các đường dẫn Bezier và phần màu trắng là những gì được hiển thị.

Mã tôi sử dụng cho Beziers là ở đây . Một trong những dòng là ở đây . Đối với những người không biết đó là Lua.

Kết xuất đường dẫn (dòng): 32 - 39 Thuật toán như sau:

  1. Lặp lại từ 0 đến 1 tại các khoảng thời gian nhất định
  2. tính x và y với công thức này: (1-index)^2*x1+2*(1-index)*index*x2+index^2*x3

Cho đến thời điểm này mọi thứ hoạt động tốt. Các đường màu xanh lá cây được tạo bằng phương pháp đường dẫn.

Phần màu trắng được hiển thị theo một cách hoàn toàn khác:

  1. Tôi nhận được tọa độ x của Beziers và các dòng tại một Y cụ thể, đặt chúng vào một bảng.
  2. Tôi lặp qua bảng và mỗi lần tôi gặp một điểm tôi thay đổi giá trị của trạng thái. Trong cùng một vòng lặp cũng là kiểm tra xem trạng thái được bật. Nếu có, tôi vẽ một pixel lên màn hình.

Để tìm giá trị x của ay, tôi sử dụng phương thức getX (dòng 46 trong Bezier và dòng 31 trong Dòng).

Mã tôi sử dụng cho bản vẽ là mã này:

local xBuffer = {}
local state = false

for i=0,500 do
    for k,v in pairs(beziers) do
        a,b = v.getX(i)
        if a then
            xBuffer[round(a)] = 1
            if b then
                xBuffer[round(a)] = 1
            end
        end
    end
    for k,v in pairs(lines) do
        a = v.getX(i)
        if a then
            xBuffer[round(a)] = 1
        end
    end
    state = false
    for x=0,600 do
        if xBuffer[x] then
            state = not state
        end
        if state then
            love.graphics.points(x,i)
        end
    end
end

Giải thích nhanh: cho i, v theo cặp lặp qua bảng được đưa ra làm đối số cho các cặp. love.graphics.point (x, y) đặt điểm tại x, y.

Cảm ơn trước.


Có một lý do không ai trả lời? Tôi có nên cải tổ câu hỏi?
Người tạo

1
Những ngày đầu của nó chỉ có rất nhiều người có thời gian để trả lời và cho đến nay bạn chỉ đạt 5 lượt xem. Stackexchange này vẫn còn là một đứa trẻ sơ sinh và không có nhiều người dùng cho nó thời gian.
joojaa

ĐỒNG Ý. Cảm ơn. Tôi đã không nhận ra rất ít người ở đây.
Người tạo

Câu trả lời:


6

Nếu bạn đang vội để làm cho trình kết xuất của bạn hoạt động bạn đã có thói quen đa giác đầy đủ hoạt động chính xác , tôi có thể đề xuất một cách tiếp cận khác, có thể dễ dàng hơn không? Mặc dù tôi không quen thuộc với Lua, nhưng có vẻ như bạn đang giải quyết giao điểm chính xác của đường quét với Bezier bậc hai, mặc dù đáng ngưỡng mộ, có thể là quá mức cần thiết.

Thay vào đó, hãy chia nhỏ Beziers của bạn thành các đoạn thẳng và sau đó ném chúng vào bộ chuyển đổi quét đa giác. Tôi đề nghị chỉ sử dụng phân chia nhị phân (đệ quy): tức là Bezier bậc hai với các điểm kiểm soát, có thể được chia thành hai Beziers, và trong đó (cũng rất tuyệt nếu bạn chỉ có các phép toán điểm cố định).( ¯ Một , ¯ D , ¯ E ) ( ¯ E , ¯ F , ¯ C )(A¯,B¯,C¯)(A¯,D¯,E¯)(E¯,F¯,C¯)

D¯=A¯+B¯2E¯=A¯+2B¯+C¯4F¯=B¯+C¯2

IIRC, mỗi khi bạn chia nhỏ, lỗi giữa Bezier và chỉ một đoạn thẳng nối các điểm cuối giảm theo hệ số ~ 4x, do đó, không có nhiều phân chia trước khi phép tính gần đúng tuyến tính sẽ không thể phân biệt được với sự thật đường cong. Bạn cũng có thể sử dụng hộp giới hạn của các điểm kiểm soát để quyết định xem bạn có thể bỏ qua quy trình phân chia sớm hay không vì đó cũng sẽ là một giới hạn bảo thủ trên đường cong.


1
Cảm ơn! A, B, C là vectơ phải không? Ngoài ra, tôi đang sử dụng phương pháp scanline vì nó cho phép tôi có được số điểm chính xác mà tôi cần. Bạn có thể xem mã và đoán tại sao nó không hoạt động? Chỉ là các công thức. Ngoài ra tôi sẽ nêu lên phản hồi, nhưng tôi không có 15 danh tiếng.
Người tạo

Đúng, AB & C là vectơ; 2D trong trường hợp của bạn nhưng nó cũng áp dụng tốt cho kích thước N. Đối với việc duyệt mã ... như tôi đã nói, tôi không biết Lua và thậm chí nhận được trình kết xuất đường quét đa giác chuẩn chính xác có thể rất khó khăn - ví dụ: Bạn phải rất cẩn thận khi đếm các giao cắt nằm chính xác trên các vị trí đỉnh. Khi bạn mở rộng điều đó để xử lý trực tiếp Beziers (điều mà tôi đã làm cách đây hơn 20 năm), điều đó vẫn khó khăn hơn. Tôi xin lỗi tôi không có thời gian.
Simon F

1
Cảm ơn đã giúp đỡ. Chỉ cần tìm thấy vấn đề. A và c trong phương trình bậc hai đã đảo ngược.
Người tạo
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.