2010-06-11 15 views
9

Tôi phải vẽ một hình elip có kích thước tùy ý và định hướng pixel theo pixel. Nó có vẻ khá dễ dàng để vẽ một hình elip có trục chính và nhỏ phù hợp với trục x và y, nhưng xoay hình elip theo góc tùy ý có vẻ phức tạp hơn. Ban đầu tôi mặc dù nó có thể làm việc để vẽ hình elip không xoay và áp dụng một ma trận xoay cho mỗi điểm, nhưng nó có vẻ như là có thể gây ra lỗi làm tròn, và tôi cần độ chính xác khá cao.Làm cách nào để vẽ hình elip với pixel định hướng tùy ý bằng pixel?

Nghi ngờ của tôi về phương pháp này có đúng không? Làm thế nào tôi có thể hoàn thành nhiệm vụ này chính xác hơn?

Tôi đang lập trình bằng C++ (mặc dù điều đó không thực sự quan trọng vì đây là câu hỏi định hướng thuật toán nhiều hơn).

Chỉnh sửa: như David đã chỉ ra, tôi đoán tôi thực sự có thể tự hỏi cách thực hiện nội suy pixel.

Trả lời

9

Sử dụng:

x = X cos(a) - Y sin(a) 
y = Y cos(a) + X sin(a) 

đâu a là góc quay ngược, (x, y) là tọa độ mới, và (X, Y) là cũ.

Bạn nên sử dụng phao để giữ độ chính xác. Chỉ cần đi qua mọi điểm, áp dụng sự biến đổi, và voilà.

Chỉnh sửa: sau một số tìm kiếm, đây là một số mã của Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html vẽ các phần conic bị raster.

+1

Tôi tin rằng điều này có nguy cơ thông thường với "chuyển tiếp" biến đổi: rằng việc đánh răng sẽ khiến bạn "bỏ qua" pixel trong các tọa độ được chuyển đổi. – dmckee

+0

Vâng, đó là lý do tại sao tôi đã tìm kiếm một phương pháp khác. Có cách nào tốt để đối phó với răng cưa không? – amc

+0

Vâng, ý tôi là, tất cả phụ thuộc vào thư viện bạn sử dụng để vẽ. Nhưng răng cưa sẽ làm hỏng bất kỳ loại quay nào. Câu hỏi của bạn nên là "làm cách nào để làm nội suy pixel?" :) –

1

Sử dụng phương pháp Bresenham vẽ các hình elip có trục thẳng hàng, nhưng áp dụng một hình cắt cho hình elip được vẽ. Bạn cũng sẽ cần phải sửa đổi độ dài của các trục. A sheared ellipse is also an ellipse. Phương pháp này bảo toàn lợi thế của Bresenham trong việc vẽ các hình elip được lấp đầy bằng cách sử dụng các đoạn thẳng đứng. Những gì bạn cần để làm điều này là chức năng mà bản đồ một đặc điểm kỹ thuật của một hình elip về trục và quay vào một bộ khác nhau của các trục và một cắt. Một giải pháp có sẵn trực tuyến tại http://scratch.mit.edu/projects/50039326/ với một cuộc thảo luận về phương pháp và một description of the math involved tại http://scratch.mit.edu/discuss/topic/94194/

Các bản đồ này được phát hiện bởi Nathan Dinsmore (user nXIII tại MIT Scratch site)

+0

Điều này thật tuyệt vời.Nên là câu trả lời hàng đầu vì nó là một giải pháp mới, tốt hơn cho một câu hỏi cũ. – tukra