Các thuật toán kiểm tra quan hệ hình học trong không gian 2D và 3D

MỤC LỤC

CÁC ĐỐI TƯỢNG HÌNH HỌC VÀ SỰ TƯƠNG QUAN

CÁC QUAN HỆ HÌNH HỌC TRONG 3D 1. Các đối tượng hình học cơ bản

 Tính góc giữa đường thẳng và mặt phẳng nếu đường thẳng và mặt phẳng cắt nhau.  Tính khoảng cách giữa đường thẳng và mặt phẳng nếu đường thẳng và mặt phẳng song song nhau.

CÁC THUẬT TỐN KIỂM TRA SỰ TƯƠNG QUAN GIỮA CÁC ĐỐI TƯỢNG HÌNH HỌC

CÁC QUAN HỆ HÌNH HỌC TRONG MẶT PHẲNG (2D) 1. Tính góc giữa hai đường thẳng

    Cho hai đoạn thẳng, xác định chúng có cắt nhau không, nếu có tìm giao điểm.Giả sử đường 1 từ a đến b và đường 2 từ c đến d như trong hình vẽ, hai đoạn thẳng có thể bố trí theo nhiều cách khác nhau. Thuật giải này sử dụng các giao điểm giữa các đường biên của vùng cần tô với các đường thẳng gọi là dòng quét và xác định các pixel nào nằm trong vùng tô màu giữa hai giao điểm liên tiếp, đó chính là các pixel dọc theo đường quét nằm giữa hai giao điểm và nằm bên trong đa giác. Khi dòng quét đi qua một đỉnh P của đa giác (chính là giao điểm của 2 cạnh của đa giác) nó tạo ra 2 giao điểm, mỗi điểm với 1 cạnh của đa giác đi qua đỉnh đó, nếu đỉnh ở giá trị cực (local extremum) Pixels ở bên trái và bên phải của đỉnh đó sẽ có cùng parity, nhưng nếu đỉnh không ở giá trị cực các Pixels ở bên trái và bên phải của đỉnh đó sẽ có parity ngược nhau, do đó ta cần có một xử lý đặc biệt hơn.

     Nếu P là giao điểm của hai cạnh có hướng y trùng nhau (hai cạnh đều có giá trị y cùng tăng hay giảm - Scan Line 2) thì dòng quét có 1 điểm giao. Vì những Pixels đối với bên trái và phải của đỉnh đó khác parity, khác giá trị kiểm tra inside-outside; ta phải làm ngắn một trong hai cạnh đi một chút (giảm y của đầu cạnh đó một pixel). Để xác định hình chữ nhật này ta lấy min hoặc max các tọa độ đỉnh của đa giác trong hệ tọa độ Descartes rồi tăng, hoặc giảm 1 để đảm bảo hình chữ nhật là hình bao và đa giác hồn tồn nằm trong nó.

     Kiểm tra 2 cạnh đa giác liên tiếp, nếu đỉnh chung không là điểm cực trị (local extremum), làm ngắn đầu cạnh của một cạnh đi qua đỉnh chung một pixel.  Ứng với một đường quét ngang yi nào đó, ta xác định các điểm cắt (bằng giải thuật tìm giao điểm giữa hai đoạn thẳng đã có), giữa các đường quét ngang với tất cả các cạnh của đa giác.  Nếu điểm cắt trùng với đỉnh của đa giác: Nếu có một cạnh song song với đường quét thì đỉnh trước đếm tăng và đỉnh sau không đếm tăng.

    “Từ một điểm P bất kỳ, vẽ một tia chỉ cắt đa giác ở những điểm trong của các cạnh (nghĩa là : không đi qua đỉnh nào của đa giác); nếu số giao điểm là lẻ thì P là điểm trong, nếu số giao điểm là chẵn thì P là điểm ngồi”. Về mặt kỹ thuật mọi đường cong đơn, phẳng, kín, liên thông, không tự cắt đều có thể tiếp cận tuyến tính bằng một đa giác bao gồm một số hữu hạn các cạnh liên tiếp. Các chương trình ứng dụng mô tả các hình ảnh bằng hệ tọa độ thế giới thực, có thể là bất kỳ hệ tọa độ Descartes nào mà người dùng cảm thấy thuận tiện nhất.

    Bài tốn clipping sau đây được xét cho trường hợp tổng quát hơn: clipping với đa giác đơn bất kì (cho cả hai trường hợp đa giác lồi hoặc lừm). Duyệt SUBJ theo hướng đi tới cho tới khi tìm được 1 điểm giao đi vào (entering intersection), là điểm giao mà SUBJ di chuyển từ ngồi vào trong đa giác CLIP.Và đưa điểm này vào danh sách xuất đa giác được clip. Với một đa giác n đỉnh, ta có thể phân thành n - 2 tam giác bằng cách từ một đỉnh nào đó của tam giác ta vẽ các cạnh nối đến tất cả các cạnh còn lại của đa giác.

    Do đú để hình thành công thức tổng quát tính diện tích một đa giác bất kỳ ta phải biến đổi công thức tính diện tích tam giác một chút. Trong công thức tính diện tích tam giác trên, thay vì dùng trị tuyệt đối của tích hai vector, ta nhân nó với un, chuẩn hướng (độ dài đơn vị) ra của mặt chứa đa giác (nếu đa giác nằm trong mặt xy, un là k).

    Hình 1 Hình 2
    Hình 1 Hình 2

    THIẾT KẾ CHƯƠNG TRÌNH THIẾT KẾ CHƯƠNG TRÌNH

    • CÁCH TỔ CHỨC CÁC HÀM TRONG OPENGL 3D CÁCH TỔ CHỨC CÁC HÀM TRONG OPENGL 3D

       Lớp CView : Có chức năng hiển thị những hiện thực cuả chương trình kiểm tra các quan hệ hình học.  Các hàm kiểm tra điểm P ở bên trong / bên ngồi đa giác BOOL TestPoint_Boundary (CPoint P,UINT n,CPoint dayP[]) BOOL Giaodiem(CPoint P,UINT n,CPoint dayP[]).  Các hàm kiểm tra quan hệ giữa 2 đường thẳng double LengthOfSegment(CPoint A,CPoint B) void CKiemTra2DView::OnTinhgoc().

       Các hàm kiểm tra quan hệ giữa đoạn thẳng và đa giác void Trungdiem(CPoint A,CPoint B,CPoint &TDiem).  Nhóm hàm liên quan đến các thao tác của hình lăng trụ void CKiemTra2DView:: OnLangTru().  Nhóm hàm liên quan đến các thao tác của hình chóp void CKiemTra2DView::OnNhapDinhChop() void CKiemTra2DView:: OnChieu_Chop().

       Nhóm hàm liên quan đến các thao tác của hình nón void CKiemTra2DView::OnHinhnon().  Các hàm kiểm tra tính đồng phẳng của đa giác void CKiemTra2DView::OnNhapDagiac() void CKiemTra2DView::PlanarPolygon().  Các hàm thực hiện các thao tác nhập tọa độ cho mặt phẳng, điểm, đường thẳng.

       Các hàm thực hiện các thao tác kiểm tra, tính tốn giữa các đối tượng điểm, đường thẳng, mặt phẳng.  Các hàm thực hiện việc vẽ, demo các vật thể void CKiemTra3DView:: GLRenderScene() void CKiemTra3DView:: Cube(). CkiemTra3DDoc:: ~ CkiemTra3DDoc() BOOL CkiemTra3DDoc:: OnNewDocument() void CkiemTra3DDoc:: Serialize(CArchive& ar).

      TRÌNHTRÌNH

         Màn hình làm việc trong phần 2D, bao gồm các đề mục như thao tác trong 2D, thao tác trong 3D và các thao tác xử lý tương ứng. Người sử dụng có thể dùng phím Enter hay tổ hợp các phím để chọn các thao tác phù hợp. Trong phần kiểm tra 2D bao gồm các đối tượng điểm, đường thẳng, đa giác và các thao tác kiểm tra tương ứng với các đối tượng hình học này.

         Màn hình làm việc khi người dùng chọn một trong các thao tác kiểm tra giữa các đối tượng hình học. Từ những tương quan cơ bản đã đựơc thiết kế của đề tài này, xây dựng lên nhiều bài tốn hình học khác.