Chú giải:
• Thực thể VERTEX: lưu trữ thơng tin về đỉnh trong khơng gian. Ngồi các giá trị tọa độ khơng gian, ta cịn lưu trữ màu của đỉnh.
• Thực thể TRIANGLE: lưu trữ thơng tin về các tam giác. Thuộc tính kèm theo mỗi tam giác là: màu tô, màu cạnh, độ rộng cạnh và mẫu cạnh.
• Thực thể FILLSTYLE: chứa thơng tin về các mẫu tơ (fill pattern).
• Thực thể TIN: lưu trữ thơng tin về một TIN. Thuộc tính kèm theo là tên của TIN, không gian bao phủ nhỏ nhất (Minimum Bounding Region), độ dài cạnh dài nhất nối giữa hai đỉnh trong TIN.
• Thực thể TINATTRIBUTE: thuộc tính do người dùng định nghĩa.
• Thực thể ATTRIBUTEVALUE: là các giác trị của một TINATTRIBUTE. Hai thực thể này chủ yếu dùng trong quá trình hiển thị Tin sẽ được trình bày cụ thể hơn ở tầng Presentaion.
• Thực thể TINOBJECT: là lớp tổng quát hóa của các lớp trên. Mỗi instance của lớp này có thuộc objID là một số nguyên duy nhất, tăng dần được dùng như một
định danh đối tượng khi cần kết nối các đối tượng TIN sang các CSDL khác.
II.2. Hiện thực các lớp C++.
II.2.1. Lược đồ lớp.
Từ các thực thể của ERD, ta xây dựng lược đồ lớp dựa trên chuNn UML như sau:
+getMBR() : float* +objID : int CDBTinObject +x : float +y : float +z : float +color : int CDBTinVertex +color : int CDBTinTriangle +VertexCount() : int +TriangleCount() : int +AddVertex() : CDBTinVertex +RemoveVertex() +AddTriangle() : CDBTinTriangle +RemoveTriangle() +name : char* CDBTin PVirtual PObject -pattern : int[] CDBFillStyle +NextObjID : int CDBTinInfo +FillSylte 1 -VVList<> m_Triangles 0..* 1 -VVList<> m_Vertex 0..* -m_Triangle 0..* -m_Vertices 3 -m_Tin Hình 2-2. Lược đồ lớp. Chú giải:
- CDBTinObject: dẫn xuất từ thực thể TINOBJECT trong lược đồ ERD.
Ngồi thuộc tính objID, mỗi đối tượng CDBTinObject có phương thức
getMBR() để trả về vùng bao phủ nhỏ nhất (Minimum Bounding Region),
nếu có, của mỗi đối tượng Tin.
- CDBTinVertex: dẫn xuất từ thực thể VERTEX. Mỗi đỉnh có thể thuộc vào
một TIN.
- CDBTinTriangle: dẫn xuất từ thực thể TRIANGLE
- CDBTin: dẫn xuất từ thực thể TIN. Lớp CDBTin có hai bốn phương thức quan trọng AddVertex(), RemoveVertex(), AddTriangle(), RemoveTriangle()
nhằm bảo đảm tính nhất quán của dữ liệu. - CDBFillStyle: dẫn xuất từ thực thể FILLSTYLE.
Ta thấy các lớp CDBTinVertex, CDBTinTriangle, CDBTin đều kế thừa từ lớp
PVirtual. Như đã trình bày ở trên, do các các đối tượng thuộc các lớp này so sánh bằng thông qua nội dung. của chúng. Hai đỉnh bằng nhau khi có tọa độ khơng gian bằng nhau. Hai tam giác bằng nhau khi các đỉnh của chúng bằng nhau từng đôi một. Hai
TIN bằng nhau khi chúng có cùng tên.
Trong lược đồ lớp xuất hiện thêm lớp CDBTinInfo. Đây là một lớp đặc biệt. Nó chỉ có duy nhất một instance trong một CSDL. Instance của lớp này chứa một số thông tin giúp cho việc sinh ra giá trị objID cho các đối tượng TIN.
II.2.2. Tính tồn vẹn dữ liệu trong CSDL của TIN.
Một yêu cầu cơ bản CSDL là tính tồn vẹn và nhất qn dữ liệu. u cầu toàn vẹn và nhất quán dữ liệu được thể hiện ở mối liên kết giữa đỉnh và tam giác. Khi xóa một tam
Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.
giác ra khỏi TIN, ta cần xóa các tham khảo đến tam giác này từ các đỉnh của nó. Và khi xóa một đỉnh, ta cần xóa tất cả các tam giác đi qua đỉnh này. Ngoài ra, trong một TIN khơng có hai đối tượng bằng nhau. Phép so sánh bằng giữahai đối tượng được
trình bày như phần trên
Để bảo tồn tính tồn vẹn và nhất quán dữ liệu, việc thêm và xóa cách đỉnh, tam giác
vào/ra khỏi TIN không thể thực hiện một cách trực tiếp mà phải thông qua hai phương thức AddVertex() và AddTriangle() của lớp CDBTin.
II.2.3. Interface của các lớp persistent. a. CDBTinObject. a. CDBTinObject.
class CDBTinObject: public PVirtual {
public:
CDBTinObject(); ~CDBTinObject() {}; CDBTin* Tin();
void setTin(Link<CDBTin> tin); void setObjId(int new_id);
virtual int getObjType() const; // TIN_ROOT virtual real* get_mbr() const;
// overriden methods
virtual o_4b compare(const PVirtual& key) const; virtual o_u4b hash() const;
// static methods
static CDBTinObject* findTinObj(o_u4b objID); // getter & seter
o_u4b getObjID() { return m_objID; } // property & public fields
__declspec(property(get=getObjID)) o_u4b objID;
int tag;
int UserData; // 32-bit transient user data };
b. CDBTinVertex.
class CDBTinVertex : public CDBTinObject {
public:
CDBTinVertex(real x, real y, real z); virtual ~CDBTinVertex();
void getCoordinate(real* xyz); void setCoordinate(real* xyz) ;
CDBTinTriangle* triangles(int index) const;
int triangle_cnt() const { return RefTriangles.size(); } bool isRefTriangle(CDBTinTriangle& T);
public: // static methods
static real* UnMap(real* _xyz); static real* Map(real* xyz); static void MapReset();
static void MapRestore(void* pMap); static void* MapSave();
static bool MapEnabled();
static void MapEnable(bool enabled);
static void MapCoordinate(int* AxisOrder, real* Origin, int*
AxisDir, int abs_map=0);
static void MapAxisDirection(int dirX, int dirY,int dirZ, int abs_map=0);
static void MapOrigin(real orgX, real orgY, real orgZ, int abs_map=0);
static void MapAxisOrder(int newX, int newY, int newZ, int abs_map=0);
public: // overriden methods
virtual o_4b compare(const PVirtual& key) const; virtual int getObjType() const;
virtual real* get_mbr() const; };
c. CDBTinTriangle.
class CDBTinTriangle : public CDBTinObject {
public:
CDBTinTriangle() ; virtual ~CDBTinTriangle() ;
CDBTinVertex* vertex(int index) const; real* getNormVector();
void getNormVector(real* xyz); public: // overriden methods
virtual int getObjType() const;
virtual o_4b compare(const PVirtual& key) const; virtual real* get_mbr() const;
public: // property & public field
Link<CDBTinFillStyle> FillStyle; linestyle lineStyle[3];
};
d. CDBTin.
class CDBTin : public CDBTinObject {
public:
CDBTin(LPTSTR name); virtual ~CDBTin();
int IndexOf(CDBTinObject& obj);
CDBTinVertex* Vertices(unsigned int index); CDBTinVertex* findVertex(real x, real y, real z); CDBTinVertex* findVertex(CDBTinVertex& p);
CDBTinVertex* addVertex(real x, real y, real z); int VertexCount() const;
CDBTinTriangle* Triangles(unsigned int index);
CDBTinTriangle* findTriangle(CDBTinVertex* a, CDBTinVertex* b,
CDBTinVertex* c);
CDBTinTriangle* findTriangle(CDBTinTriangle& t);
CDBTinTriangle* addTriangle(CDBTinVertex& a, CDBTinVertex& b,
CDBTinVertex& c);
int TriangleCount() const;
void removeTriangle(CDBTinTriangle& t); void removeVertex(CDBTinVertex& p); void Empty();
void* SelectVertex(real* XRange,real* YRange,real* ZRange,int tag); void* SelectVertex(real* xyz1, real* xyz2, int tag);
void* SelectTriangle(real* xyz1, real* xyz2, int tag); void* SelectTriangle(void* vertices, int tag);
void ClearTag(int what); public: // overriden methods
virtual int getObjType() const; virtual real* get_mbr() const; public: // static methods
static CDBTin* newTin(LPTSTR name, int persistent=1); static CDBTin* findTin(LPTSTR name);
static int TinCount(); static CDBTin* Tin(int index); };
Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.
II.3. Tạo và nạp lược đồ CSDL.
Lược đồ CSDL Versant được tạo ra bằng trình biên dịch lược đồ (schema compiler)
schcomp.exe. Đầu vào của schcomp.exe là tập tin .imp chứa các khai báo về các lớp
persistent của CSDL. Sau đây là nội dung đầy đủ của tập tin TincoreSchema.imp khai báo các lớp persistent của thư viện GTIN.
#include <cxxcls/pobject.h> #include <cxxcls/vlist.h> #include <cxxcls/vset.h> #include "RootClasses.h" #include "tin.h" #include "tinvertex.h" #include "tintriangle.h" O_CAPTURE_SCHEMA(CDBTinInfo) O_CAPTURE_SCHEMA(CDBTinObject) O_CAPTURE_SCHEMA(CDBTin) O_CAPTURE_SCHEMA(CDBTinVertex) O_CAPTURE_SCHEMA(CDBTinTriangle) O_CAPTURE_SCHEMA(CDBTinFillStyle) O_CAPTURE_SCHEMA(VVList(CDBTinVertex)) O_CAPTURE_SCHEMA(VVList(CDBTinTriangle)) O_CAPTURE_SCHEMA(VVList(CDBTinObject)) O_CAPTURE_SCHEMA(VVSet(CDBTinTriangle)) O_CAPTURE_SCHEMA(VVSet(CDBTinVertex)) O_CAPTURE_SCHEMA(VVSet(CDBTinObject)) O_TRANSIENT(CDBTinObject, "objID","UserData") O_TRANSIENT(CDBTinVertex,"x","y","z","Color","mapX","mapY","mapZ") O_TRANSIENT(CDBTinTriangle,"FillColor") O_TRANSIENT(CDBTinFillStyle,"Style","Name","m_Active","Active","IsDefault Style") O_TRANSIENT(CDBTin,"BottomLeft","TopRight","Name","MaxEdgeLen","DefaultFi llStyle") O_TRANSIENT(CDBTinInfo,"DefaultFillStyle","NextObjID","ActiveStyle") III. HỆ TỌA ĐỘ ÁNH XẠ.
III.1. Tại sao có hệ tọa độ ánh xạ?
Trong một số bài toán, để giải thuật trở nên đơn giản, trong sáng hơn, ta cần dùng đến hệ tọa độ ánh xạ. Các giá trị tọa độ không gian của các đối tượng TIN là giá trị đo đạc từ thế giới thực. Các giá trị này thông qua qua một số phép ánh xạ sẽ trở thành giá trị tọa độ của đối tượng đó trong một hệ tọa độ khác, đó là hệ tọa độ ánh xạ. Như vậy phép ánh xạ ở đây thực chất là các phép biến đổi hệ trục tọa độ. Để dảm bảo tính hiệu quả của chương trình, lớp DML chỉ cung cấp các phép biến đổi đơn giản cho phép
người dùng tịnh tiến hệ trục và thực hiện các phép xoay trục theo những góc 900. Một ví dụ dùng hệ tọa độ ánh xạ sẽ được trình bày ở phần giải thuật: “giao TIN với mặt phẳng”.
III.2. Các phép ánh xạ.
DML hỗ trợ ba phép ánh xạ cơ bản: thay đổi vị trí trục, đảo hướng trục và tịnh tiến gốc tọa độ. Các phép ánh xạ này lưu trữ trong cấu trúc MAPSTATUS.
typedef struct {
int AxisOrder[3]; real Origin[3]; int AxisDir[3]; } MAPSTATUS, *PMAPSTATUS;
Các phép ánh xạ là hai chiều và có mang tính tương đối. Ánh xạ thuận chuyển tọa độ thế giới thực sang tọa độ ánh xạ; ánh xạ nghịch chuyển tọa độ ánh xạ sang tọa độ thế giới thực. Phép ánh xạ tương đối tác động lên bảng ánh xạ dựa vào hệ trục tọa độ hiện tại. Phép ánh xạ tuyệt đối tác động lên bảng ánh xạ theo hệ trục chuNn ban đầu.
Objects/ Search Query Mapping is enabled. Mapping is disabled. World coordinate World coordinate Mapped coordinate
APPLICATION coordinateObject