2010-12-27 27 views
8

Tóm tắt: Tôi đang làm việc trên một ứng dụng vẽ trên nền web và cần vẽ các đường splines dày 1px đi qua các điểm kiểm soát của chúng.Vẽ bí danh, sppx pixel 1px hoàn hảo (Catmull-Rom, cụ thể)

Vấn đề tôi đang gặp phải là tôi cần vẽ từng pixel giữa p1 và p2 như thể tôi đang sử dụng công cụ bút chì 1px. Vì vậy, không có chống răng cưa và một pixel tại một thời điểm. Điều này cần phải được thực hiện bằng tay mà không cần sử dụng bất kỳ mã thư viện đường/đường cong nào vì hệ thống bàn chải của tôi phụ thuộc vào việc có tọa độ pixel để áp dụng đầu cọ vẽ cho khung vẽ.

Về cơ bản, tôi cần phải kết hợp một pixel bước từ một cái gì đó giống như thuật toán Bresenham với tọa độ được trả về bởi phương trình Catmull-Rom. Tôi gặp rắc rối bởi vì các điểm Catmull-Rom không được phân bố đồng đều (vì vậy tôi không thể chỉ nói có 100 pixel trong đường cong và chạy phương trình 100 lần). Tôi đã thử sử dụng giá trị khởi đầu ước tính tối đa của vùng đồng bằng X và Y và lấp đầy khoảng trống với Bresenham, nhưng do làm tròn tôi vẫn kết thúc với một số phần "bẩn" (tức là đường rõ ràng đang di chuyển lên và đến phải nhưng tôi vẫn nhận được hai điểm ảnh với cùng một thành phần Y, dẫn đến một phần "chất béo" của dòng).

Tôi tích cực điều này đã được giải quyết vì gần như mọi chương trình đồ họa vẽ splines đều phải hỗ trợ các đường cong điểm ảnh sạch mà tôi theo sau. Sau một chút nghiên cứu toán học, mặc dù, tôi là một chút bối rối và vẫn không có một giải pháp. Lời khuyên nào?

EDIT: Dưới đây là một ví dụ về một đường cong mà tôi có thể phải render:

alt text

nào có thể có một kết quả mong đợi tìm kiếm như thế này (lưu ý rằng đây là một ước tính):

alt text

Sử dụng phương trình đường trục Catmull-Rom, chúng tôi cần bốn điểm để tạo phân khúc. P0 và P3 được sử dụng làm tang cho hướng vào và ra từ phân đoạn P1-> P2. Với một spline Catmull-Rom, phần màu xanh là tất cả được interpolated như t di chuyển từ 0 đến 1. P0 và P3 có thể được nhân đôi để đảm bảo rằng phần màu xanh lá cây được trả lại, do đó, đó không phải là một vấn đề đối với tôi.

Vì mục đích đơn giản, tôi cần hiển thị các pixel trên đường cong giữa P1 và P2, với điều kiện tôi có tang ở dạng P0 và P3. Tôi không nhất thiết phải sử dụng dây chuyền Catmull-Rom, nhưng chúng dường như là công cụ thích hợp cho công việc này vì các điểm kiểm soát phải được chuyển qua. Sự phân bố không đồng nhất của các điểm nội suy là những gì ném cho tôi một vòng lặp.

EDIT2: Dưới đây là một ví dụ về những gì tôi có nghĩa là khi tôi nói đường cong kết quả của tôi là bẩn:

alt text

Các mũi tên màu đỏ chỉ ra một vài địa điểm nơi có không phải là một pixel. Điều này xảy ra vì các thành phần X và Y của tọa độ được tính toán không thay đổi ở cùng một tỷ lệ. Vì vậy, khi mỗi thành phần được làm tròn (vì vậy tôi có vị trí pixel chính xác) có thể là trường hợp X hoặc Y không bị va chạm vì tọa độ được tính toán là (42.4999, 50.98). Trao đổi vòng cho một tầng hoặc ceil không giải quyết được vấn đề, vì nó chỉ thay đổi nơi nó xảy ra.

+0

Thật tuyệt vời nếu bạn có thể thêm một bản vẽ khác cho thấy kết quả mong đợi từ P1 đến P2. –

+0

@belisarius Tôi đã không làm việc ra các phép tính mà điểm ảnh sẽ được điền vào dựa trên phương trình Catmull-Rom, nhưng hình ảnh thứ hai sẽ cung cấp cho bạn một ý tưởng về những gì tôi đang cố gắng để đạt được. – Xenethyl

+0

Tôi đã yêu cầu nó vì bình luận của bạn: _ nhưng tôi vẫn nhận được hai điểm ảnh với cùng một thành phần Y_ –

Trả lời

2

Ở đây bạn có a paper describing method for the re-parametrization of splines để có được các khoảng cách đều nhau dọc theo chiều dài đường cong.Tôi nghĩ rằng điều này có thể giải quyết vấn đề của bạn nếu bạn có thể thích ứng với đường cong Catmull-Rom (không quá khó, tôi đoán)

+0

Cảm ơn bạn đã liên kết tới bài báo. Tôi đã không bao gồm "chiều dài hồ quang" trong Googling của tôi. Tôi chỉ tìm kiếm nhiều hơn một chút và đưa ra kết quả tốt hơn nhiều (xem http://www.actionscript.org/forums/showthread.php3?t=213252). Có vẻ như là giải pháp được chấp nhận cho bản lề này khá một chút về tính xấp xỉ và tính toán trước. Điều này có thể đặt ra một vấn đề hiệu suất cho tôi vì điều này đang được thực hiện trong JavaScript. Tôi có thể đăng lại vấn đề của mình một cách khác nhau sau khi tôi đã bỏ qua vấn đề này, nhưng trong thời gian này tôi cảm ơn vì sự giúp đỡ. Bạn chắc chắn đã chỉ cho tôi đúng hướng. – Xenethyl

+0

@Xenethyl Rất vui được giúp đỡ! Hy vọng bạn có thể tối ưu hóa nó cho kịch bản của bạn. –

Các vấn đề liên quan