2008-09-20 24 views
14

Tôi đang cố gắng tìm/thực hiện một thuật toán để tính toán giao lộ (một đối tượng đầy mới) của hai đối tượng 2D tùy ý. Các đối tượng được xác định bằng cách sử dụng một trong hai dòng hoặc beziers khối và có thể có lỗ hoặc tự giao nhau. Tôi biết một số thuật toán hiện có đang thực hiện tương tự với đa giác, listed here. Tuy nhiên, tôi muốn hỗ trợ beziers mà không cần phân chia chúng thành đa giác, và đầu ra nên có khoảng điểm kiểm soát tương tự như đầu vào ở những khu vực không có nút giao.Bezier clipping

này là dành cho một chương trình tương tác để làm một số CSG nhưng cắt không cần phải là thời gian thực. Tôi đã tìm kiếm một lúc nhưng chưa tìm được điểm khởi đầu tốt.

Trả lời

10

tôi thấy các ấn phẩm sau đây là thông tin tốt nhất về Bezier Clipping:

T. W. Sederberg, BYU, hình học khóa học Thiết kế Ghi chú Computer Aided

Chương 7 nói về đường cong Intersection có sẵn trực tuyến. Nó phác thảo 4 phương pháp khác nhau để tìm giao lộ và mô tả Bezier Clipping chi tiết:

http://www.tsplines.com/technology/edu/CurveIntersection.pdf

1

Có một số tài liệu nghiên cứu học thuật về làm Bút chì cắt:

http://www.andrew.cmu.edu/user/sowen/abstracts/Se306.html

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.61.6669

http://www.dm.unibo.it/~casciola/html/research_rr.html

Tôi khuyên bạn nên các phương pháp interval bởi vì như bạn mô tả, bạn không phải phân chia thành đa giác và bạn có thể nhận được kết quả được đảm bảo cũng như xác định độ chính xác tùy ý của riêng bạn cho resultset. Để biết thêm thông tin về hiển thị khoảng thời gian, bạn cũng có thể tham khảo http://www.sunfishstudio.com

3

Tôi đã viết mã để thực hiện việc này từ rất lâu rồi. Dự án tôi đã làm việc trên các đối tượng 2D được xác định bằng cách sử dụng các ranh giới Bezier chắp vá được tạo ra dưới dạng đường dẫn PostScipt.

Cách tiếp cận tôi đã sử dụng là:

Để đường cong p, q, được xác định bởi các điểm kiểm soát Bezier. Họ có giao nhau không?

Tính các hộp giới hạn của các điểm kiểm soát. Nếu chúng không chồng lên nhau, thì hai đường cong không cắt nhau. Nếu không:

p.x (t), p.y (t), q.x (u), q.y (u) là đa thức khối trên 0 < = t, u < = 1.0. Khoảng cách bình phương (p.x - q.x) ** 2 + (p.y - q.y) ** 2 là đa thức trên (t, u). Sử dụng Newton-Raphson để thử và giải quyết điều đó bằng không. Vứt bỏ bất kỳ giải pháp nào bên ngoài 0 < = t, u < = 1.0

N-R có thể hoặc không thể hội tụ. Các đường cong có thể không giao nhau, hoặc N-R chỉ có thể nổ tung khi hai đường cong gần như song song. Vì vậy, cắt bỏ N-R nếu nó không hội tụ sau một số lần lặp lại tùy ý. Đây có thể là một con số khá nhỏ.

Nếu N-R không hội tụ về một giải pháp, chia một đường cong (nói, p) thành hai đường cong pa, pb tại t = 0,5. Điều này là dễ dàng, nó chỉ là các điểm giữa tính toán, như bài báo được liên kết cho thấy. Sau đó kiểm tra đệ quy (q, pa) và (q, pb) cho giao lộ. (Lưu ý rằng trong lớp đệ quy tiếp theo rằng q đã trở thành p, sao cho p và q được luân phiên tách trên mỗi lớp đệ quy.)

Hầu hết các cuộc gọi đệ quy trở lại nhanh chóng vì các hộp giới hạn không chồng chéo .

Bạn sẽ phải cắt bỏ đệ quy ở độ sâu tùy ý, để xử lý các trường hợp lạ khi hai đường cong song song và không hoàn toàn chạm vào, nhưng khoảng cách giữa chúng là nhỏ tùy ý - có lẽ chỉ có 1 ULP của sự khác biệt .

Khi bạn tìm thấy giao lộ, bạn chưa hoàn thành, bởi vì đường cong khối có thể có nhiều giao cắt.Vì vậy, bạn phải phân chia từng đường cong tại điểm giao nhau, và đệ quy kiểm tra nhiều sự giao nhau giữa (pa, qa), (pa, qb), (pb, qa), (pb, qb).

6

Tôi biết mình có nguy cơ bị thừa, nhưng tôi đang điều tra cùng một vấn đề và tìm ra giải pháp mà tôi đã đọc trong các tài liệu học tập nhưng chưa tìm được giải pháp làm việc.

Bạn có thể viết lại các đường cong Bezier là một tập hợp của hai phương trình bậc ba bi variate như thế này:

  • Δx = ax₁ * t₁^3 + bx₁ * t₁^2 + cx₁ * t₁ + dx₁ - ax₂ * t₂^3 - bx₂ * t₂^2 - cx₂ * t₂ - dx₂
  • ∆y = ay₁ * t₁^3 + by₁ * t₁^2 + cy₁ * t₁ + dy₁ - ay₂ * t₂^3 - by₂ * t₂^2 - cy₂ * t₂ - dy₂

Rõ ràng, các đường cong giao nhau cho các giá trị của (t₁, t₂) trong đó ∆x = ∆y = 0. Thật không may, nó phức tạp bởi thực tế là tôi t là khó khăn để tìm rễ trong hai chiều, và phương pháp tiếp cận gần đúng có xu hướng (như một nhà văn khác đặt nó) thổi lên. Nếu bạn đang sử dụng số nguyên hoặc số hợp lý cho các điểm kiểm soát của mình, thì bạn có thể sử dụng Căn cứ Groebner để viết lại các đa thức bậc 3 đa biến thành một (có thể-up-to-order-9- do đó-bạn-chín-thể-giao lộ của bạn) đa thức monovariate. Sau đó bạn chỉ cần tìm nguồn gốc của bạn (cho, nói t₂) trong một chiều, và cắm kết quả của bạn trở lại vào một trong các phương trình ban đầu của bạn để tìm kích thước khác.

Burchburger có phần giới thiệu thân thiện với người dân về căn cứ Groebner được gọi là "Cơ sở Gröbner: Giới thiệu ngắn về hệ thống lý thuyết" rất hữu ích đối với tôi. Google nó. Các giấy khác hữu ích được gọi là "Nhanh, chính xác làm phẳng đường Bézier khối và đường cong bù đắp" của TF Hain, có nhiều phương trình tiện ích cho đường cong bezier, bao gồm cách tìm các hệ số đa thức cho x và y phương trình. Để biết liệu việc cắt xén Bezier có giúp ích cho phương pháp cụ thể này hay không, tôi nghi ngờ nó, nhưng việc cắt xén bezier là một phương pháp thu hẹp nơi giao lộ có thể, chứ không phải để tìm câu trả lời cuối cùng (mặc dù có thể gần đúng) . Rất nhiều thời gian với phương pháp này sẽ được chi tiêu trong việc tìm kiếm phương trình đơn biến đổi, và nhiệm vụ đó không nhận được bất kỳ dễ dàng hơn với clipping. Tìm nguồn gốc là do so sánh tầm thường. Tuy nhiên, một trong những ưu điểm của phương pháp này là nó không phụ thuộc vào đệ quy phân chia đường cong, và vấn đề trở thành một vấn đề tìm kiếm gốc một chiều đơn giản, điều này không dễ dàng, nhưng được ghi chép đầy đủ. Điểm bất lợi chính là việc tính toán các cơ sở Groebner là tốn kém và trở nên rất khó sử dụng nếu bạn đang xử lý các đa thức dấu chấm động hoặc sử dụng các đường Bezier bậc cao hơn.

Nếu bạn muốn một số mã đã hoàn thành trong Haskell để tìm giao lộ, hãy cho tôi biết.

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