Tầng thuật toán AL nằm bên trên tầng cơ sở dữ liệu DML. Tầng thuật toán AL được thiết kế hoàn toàn tách biệt với DBMS bao gồm các lớp bao đóng các thuộc tính tương tự các lớp ở tầng dữ liệu và một số lớp khác.
Các lớp bao đóng các lớp ở dữ liệu là : CTinObject, CTinVertex, CTinTriangle và CTin. Các lớp này hoàn toàn giống các lớp cùng tên tương ứng ở tầng cơ sở dữ liệu như: CDBTinObject, CDBTinVertex, CDBTinTriangle và CDBTin về mặt ngữ nghĩa cộng với các phép toán được hiện thực dưới dạng các phương thức. Do đó, ở đây ta không cần phải khảo sát chi tiết chúng mà chỉ xem xét các lớp phụ trợ khác như : coordinate, CTinPlane, TinUtils, Vector3D, CTinQuery.
Chú ý: ở tầng thuật toán mỗi đối tượng trong lớp dữ liệu có một handle tương ứng. Các lớp trên tầng thuật toán có thể truy cập các thuộc tính của đỉnh, tam giác… đều phải thông qua handle này.
I.1. Lớp coordinate.
Các tọa độ trong Tin là số thực, do đó sai số trong việc tính toán là không thể tránh khỏi. Để sai sót trong phép so sánh hai số thực do sai số, ta lấy hiệu của hai số thực này rồi so sánh với một epsilon cho trước.
Ta xây dựng lớp coordinateđểđảm nhận việc so sánh này. Vì vậy, về mặt lưu trữ một biến kiểu coordinate hoàn toàn giống một biến số thực, nhưng trong tất các các phép so sánh giữa coordinate với coordinate hay với số thực đều là phép so sánh tương đối với một hằng epsilon định nghĩa trước khả thay đổi thời gian chạy. Điều này giúp đơn giản hóa các thuật toán trong việc kiểm soát sai số.
I.2. Lớp CTinPlane.
Lớp CTinPlane biểu diễn một mặt phẳng trong không gian 3D. Phương thức:
CTinPlane(HTTriangle T)
Xây dựng mặt phẳng qua tam giác xác định bởi handle T.
CTinPlane(const Vector3D& n, real x, real y, real z)
CTinPlane(const Vector3D& a, const Vector3D&b, real x, real y, real z)
Xây dựng mặt phẳng từ pháp vector n hoặc từ hai vector chỉ phương a, b và một điểm thuộc mặt phẳng.
CTinPlane(coordinate* abcd)
Xây dựng mặt phẳng từ phương trình Ax + By + Cz + D = 0 với A, B, C, D được chỉ định cho con trỏabcd.
int Intersect(POINT3D& p1, POINT3D& p2, POINT3D& result) int Intersect(HTVertex p1, HTVertex p2, POINT3D& result)
Tìm giao điểm của mặt phẳng với đoạn thẳng p1, p2.
coordinate Evaluate(real* xyz) Trả về khoảng cách đại số từđiểm xyz đến mặt phẳng. Thuộc tính: coordinate A , B, C, D Các tham số A, B, C, D của phương trình mặt phẳng. Vector3D NormVector Pháp vector đơn vị của mặt phẳng.
coordinate X[coordinate y_value][coordinate z_value] coordinate Y[coordinate z_value][coordinate x_value] coordinate Z[coordinate x_value][coordinate y_value]
Các giá trị x, y, z được xác định từ hai giá trị còn lại.
I.3. Lớp Vector3D.
Lớp Vector3D biểu diễn vector 3D trong không gian và các phép toán vector như: cộng, trừ, tích hữu hướng, vô hướng… Vector3D có thểđược khởi động từ HTVertex, từ hai điểm v.v…Xem thêm phần phụ lục để có thêm chi tiết về interface của lớp Vector3D.
I.4. Lớp CTinQuery.
CTinQuery cung cấp khả năng truy vấn trên cơ sở dữ liệu. CTinQuery bao đóng câu lệnh query của tần dữ liệu. Kết quả trả về được sử dụng tương tự như một mảng một chiều các handle HTObj.
Thuộc tính:
int ObjectAffected
Tổng sốđối tượng query được ở câu truy vấn vừa rồi.
HTObj Object[int index]
Handle của đối tượng thứ index trong kết quả truy vấn. Nếu index nằm ngoài khoảng 0 .. (ObjectAffected-1) thì một exception sẽđược phát sinh.
Phương thức:
CTinQuery(HTTin tinhandle)
Khởi động một đối tượng CTinQuery. TinHandle là handle của Tin mà các câu lệnh truy vấn tác động lên.
int SelectVertices(real* xyz1, real* xyz2, int tag=T_QUERY_ANYTAG)
Truy vấn các đỉnh nằm trong hình hộp giới hạn bởi các tọa độ trong xyz1 và xyz2 có giá trị có CTinVertex::tag == tag. Hàm trả về tổng số object truy vấn được.
int SelectVertices(real* xyz, real delta, int tag=T_QUERY_ANYTAG)
Truy vấn các đỉnh nằm trong hình lập phương có tâm là xyzđộ dài cạnh là 2*delta. Hàm trả về tổng số object truy vấn được.
int SelectTriangles(real* xyz1, real* xyz2, int tag=T_QUERY_ANYTAG)
Truy vấn các tam giác có ít nhất một đỉnh nằm trong hình hộp giới hạn bởi xyz1 và
xyz2. Hàm trả về tổng số object truy vấn được.
Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.
Truy vấn các tam giác có ít nhất một đỉnh nằm trong hình hộp có tâm là xyz cạnh 2*delta. Hàm trả về tổng số object truy vấn được.
int SelectTriangles(const CTinQuery& vertices)
Truy vấn các tam giác có ít nhất một đỉnh nằm trong kết quả query được trong
vertices. Hàm trả về tổng số object truy vấn được.
I.5. Lớp TinUtils.
TinUtils thật sựđóng vai trò như một namespace. Lớp TinUtils không hề chứa dữ liệu nào, nó chỉ bao gồm các phương thức static thực hiện một số chức năng nhỏ, đơn lẻ được dùng nhiều lần trong chương trình.