Biểu diễn lưới đa giác

Một phần của tài liệu (LUẬN văn THẠC sĩ) mô hình 3d và một số kỹ thuật mô hình hóa 3d trong mô phỏng (Trang 33 - 40)

Ba cách biểu diễn lưới đa giác được xét ở đây là : biểu diễn theo hàm hiện, con trỏ tới danh sách các đỉnh và con trỏ tới danh sách các cạnh (Foley et al.. 1994).

Trong cách biểu diễn theo hàm hiện (explicit representation), mỗi một đa giác được biểu diễn bởi danh sách tọa độ của các đỉnh:

P = ( (x1, y1, z1),(x2, y2, z2), .. , (xn, yn ,zn)).

Các đỉnh được lưu theo thứ tự mà ta sẽ gặp chúng khi đi một vòng quanh đa giác. Có các cạnh giữa các đỉnh trong danh sách và giữa đỉnh đầu và cuối. Với một đa giác đơn, cách biểu diễn này hiệu quả về không gian; với một lưới đa giác sẽ tốn nhiều không gian hơn vì toạ độ của các đỉnh chung được liệt kê hai lần.

Vấn đề là không có cách biểu diễn theo hàm hiện cho các cạnh chung và các đỉnh chung. Chẳng hạn, để di chuyển một đỉnh mà tất cả các cạnh nối với đỉnh đó đều phải biến đối theo, ta phải xác định tất cả các đa giác có

chung đỉnh đó. Việc tìm kiếm này đòi hỏi phải so sánh ba tọa độ của một đỉnh một đa giác với các đa giác khác. Cách làm hiệu quả nhất là sắp xếp N cặp toạ độ, nhưng quá trình này tốn N log2N, và có thể nguy hiểm vì một đỉnh có thể sẽ có toạ độ khác đi do quá trình làm tròn. Đo đó sẽ không thể thực hiện chính xác được. Trong phương pháp này, lưới đa giác được biểu diễn dưới dạng tô màu đa giác hoặc vẽ đường nét bên ngoài cần phải được chuyển đổi các đỉnh và cắt các cạnh của mỗi đa giác. Mỗi cạnh chung sẽ được vẽ hai lần. Đó chính là nguyên nhân vẽ lại trong bút vẽ, thiết bị ghi phim, và các hệ hiển thị vector và raster.

Đa giác được xác định theo con trỏ tới danh sách các đỉnh (pointers to a vertex list), mỗi đỉnh của lưới đa giác được lưu chỉ một lần trong danh sách các đỉnh V = ((x1, y1 z1),(x2, y2 z2), .. , (xn, yn zn)).

Một đa giác được xác định bởi danh sách các chỉ số (hoặc các con trỏ) tới danh sách các đỉnh. Chẳng hạn, một đa giác có các đỉnh là 3, 5, 7 và 10 thì danh sách các đỉnh được biểu diễn là P = (3, 5, 7, 10)

Hình 2.1. Lưới đa giác xác định bằng các chỉ số trong danh sách

Một ví dụ của cách biểu diễn này được chỉ ra trong hình 2.2 có một vài ưu điểm hơn so với cách biểu diễn đa giác theo hàm hiện. Mỗi một đỉnh chỉ được lưu một lần, như vậy tiết kiệm được không gian. Hơn nữa, tọa độ của các đỉnh có thể được thay đổi một cách dễ dàng. Tuy nhiên, vẫn khó khăn để xác định các đa giác có chung cạnh; các đa giác có chung cạnh vẫn được vẽ

hai lần cạnh chung đó. Ta có thể giải quyết các vấn đề này bằng cách biểu diễn các cạnh theo hàm hiện, như trong phương pháp sau:

Khi một đa giác được xác định bởi con trỏ tới danh sách các cạnh

(pointers to all edge list), ta có danh sách các cạnh V. Trong phương pháp này, biểu diễn đa giác theo danh sách các con trỏ nhưng không phải trỏ tới danh sách các đỉnh mà là trỏ tới danh sách các cạnh, mỗi cạnh đúng một lần. Mỗi một cạnh trong danh sách các cạnh trỏ tới hai đỉnh trong danh sách các đỉnh để xác định một cạnh, và một hoặc hai đa giác mà cạnh đó thuộc về.

Như vậy, mô tả đa giác dưới đạng P = (El , .. , En) và một cạnh được mô tả : E = (Vl ,V2 ,P1 ,P2). Khi một cạnh chỉ thuộc vào một đa giác, P1 hoặc P2 sẽ là rỗng. Hình 2.2 cho ta ví dụ về cách biểu diễn này.

V = (V1, V2, V3, V4) = ((x1,y2,z1), .. , (x4, y4, z4)) E1 = (V1, V2, P1, λ) E2 = (V2, V3, P2, λ) E3 = (V3, V4, P2, λ) E4 = (V4, V2, P1, P2) E5 = (V4, V1, P1, λ) P1 = (E1, E4, E5) P2 = (E2, E3, E4)

Hình 2.2. Lưới đa giác xác định bởi danh sách các cạnh cho mỗi đa giác ( λ biểu diễn giá trị rỗng)

Khi biểu diễn đa giác bởi các cạnh. thay bằng cách biểu diễn tất cả các đa giác thì tránh được các phép cắt, chuyển đổi và chuyển đổi phân hình. Việc tô màu đa giác cũng được thực hiện dễ dàng. Trong một vài trường hợp. khi mô tả cấu trúc của một đối tượng dạng tổ ong 3D, một số cạnh sẽ là cạnh

chung của hai đa giác. Trong trường hợp này, khi mô tả một cạnh có thể mở rộng ra bao gồm một số đa giác: E = (Vl , V2 , P1 , P2 , Pn).

Trong ba cách biểu diễn này (đa giác theo hàm hìện, con trỏ tới danh sách các đỉnh, con trỏ tới danh sách các cạnh) không dễ dàng xác định xem những cạnh nào trùng với một đỉnh; tất cả các cạnh đều phải được kiểm tra.

Hình 2.3. Biểu diễn mặt cầu bằng lưới đa giác

Tất nhiên, các thông tin có thể được thêm vào để xác định các mối quan hệ.

Khi biểu diễn dữ liệu cho bề mặt lưới đa giác hoặc cho một vật thể ba chiều nói chung trong máy tính, nên nhập dữ liệu thành một file riêng. Điều này rất tiện lợi khi ta muốn thay đổi vật thể thì chỉ cần thay đổi dữ liệu ở file riêng này. Ngoài ra, cách tổ chức dữ liệu thành file riêng này còn giảm được bộ nhớ cho chương trình và thực hiện rất tốt với cả vật thể phức tạp. Trong CAD, các

fìle này đã có định dạng sẵn.

Phương trình mặt phẳng

Khi làm việc với nhiều đa giác hoặc lưới đa giác, ta thường cần phải biết tới phương trình của mặt phẳng chứa đa giác đó. Trong một vài trường hợp, các phương trình này được biết theo hàm ẩn qua phương pháp xác định đa giác. Nếu không biết được phương trình, ta có thể sử dụng toạ độ của ba đỉnh để xác định mặt phẳng.

Phương trình hàm ẩn

Phương trình mặt phẳng có thể được biểu diễn theo dạng sau:

F(x, y, z) = Ax + By + Cz + D = 0 (2.l ) Trong đó (x,y,z) xác định một điểm tuỳ ý trong mặt phẳng, các hệ số A, B, C và D là các hằng số mô tả đặc điểm không gian của mặt phẳng.

Cho ba điểm không thẳng hàng Pl , P2 , P3 , trong mặt phẳng ta có thể xác định các giá trị A, B, C và D bằng cách giải hệ phương trình tuyến tính sau: 𝐴 𝐷𝑥1 +𝐵 𝐷𝑦1 +𝐶 𝐷𝑧1 = −1, 𝑖 = 1,2,3 (2.2) Kết quả được: A=y1(z2 - z3) + y2(z3 - z1) + y3(z1 - z2) B=z1(x2 - x3) + z2(x3 - x1) +z3(x1 -x2) (2.3) C=x1(y2 -y3) + x2(y3 -y1) + x3(y1 - y2)

Mặt phẳng của phương trình (2.1) chia không gian 3 chiều thành hai phần riêng biệt, một bên chứa các điểm có toạ độ (x,y,z) mà F(x,y,z) > 0 và phần còn lại chứa các điểm có toạ độ (x,y,z) mà F(x.y,z) < 0.

Để xác định dấu của một phần mặt phẳng, người ta thường chọn các điểm đặc biệt (thường là gốc = (0,0,0) nếu nó không nằm trong mặt phẳng) và thay thế toạ độ vào F(x,y,z). Chẳng hạn, mặt phẳng 2x-3y+5z+7 = 0 chia không gian 3D thành hai phần. Phần mặt phẳng chứa điểm gốc tọa độ

O(0,0,0) sẽ chứa tất cả các điểm (x,y,z) có F(x,y,z) > 0

Hướng của mặt phẳng có thể được mô tả bởi pháp tuyến của mặt phẳng. Ta tính được bằng tích của các vector P1P2 x PlP3 (hoặc P2P3 x P2P1 , v.v..).

Vector pháp tuyến này có ba thành phần A, B, C xác định bởi phương trình (2.3), nếu tích vector này là 0, ba điểm này thẳng hàng và không xác định được mặt phẳng. Nếu có thể được, ta dùng đỉnh khác để thay thế.

Cho một tích các vector khác 0, ta có thể xác định D bằng cách thay thế pháp tuyến [A, B, C] và một trong ba điểm vào phương trình (2.l ).

Khi đã xác định được phương trình của mặt phẳng bằng cách sử dụng toạ độ của tất cả các đỉnh, ta có thể đánh giá sự không đồng phẳng của đa giác bằng cách tính các khoảng cách từ mặt phẳng tới mỗi đỉnh. Khoảng cách d tới đỉnh có toạ độ (x,y,z) là : 2 2 2 Ax By Cz D d A B C       (2.4)

Khoảng cách này có thể dương hoặc âm, tuỳ thuộc vào vị trí của điểm đó đối vị trí mặt phẳng. Nếu đỉnh ở trên mặt phẳng thì d = 0. Tất nhiên, nếu chỉ để xác định xem điểm đó nằm ở phía bên nào đối với mặt phẳng, ta chỉ cần xét dấu của d, như vậy việc chia cho căn là không cần thiết và ta chỉ cần chú ý đến dấu biểu thức tử số của phương trình (2.4).

Ta cũng thấy rằng, phương trình của mặt phẳng là không duy nhất; khi nhân thêm với hằng số k sẽ làm thay đổi phương trình, nhưng không làm thay đổi mặt phẳng. Tốt nhất là nên lưu trữ các hệ số của mặt phẳng với pháp tuyến của nó; chẳng hạn có thể lưu nghịch đảo của độ dài của vector pháp tuyến.

2 2 2 1 k A B C    (2.5)

Sau đó, khoảng cách được tính dễ dàng từ phương trình (2.4) nếu mẫu số là 1.

Xác định điểm trên mặt phẳng

Giả thiết rằng mặt phẳng được xác định bởi ba điểm không thẳng hàng Pl, P2 , và P3. Một điểm P(x,y,z) nằm trên mặt phẳng, thì vector P1 P phải là kết hợp tuyến tính của vector P1P2 và P1P3 . Nói một cách khác, tồn tại hai số thực u v sao cho:

P1 P = u P1P2 + v P1P3

y-y1=u(y2-y1)+v(y3-y1) z-z1=u(z2-z1)+v(z3-z1)

Có thể viết lại như sau: x= (1-u-v)x1+ux2+vx3

y= (1-u-v)y1+uy2+vy3

z=(1-u-v)z1+uz1+vz3

trong đó u và v là hai số thực.

Một phần của tài liệu (LUẬN văn THẠC sĩ) mô hình 3d và một số kỹ thuật mô hình hóa 3d trong mô phỏng (Trang 33 - 40)