Để nhập dữ liệu vào chương trình chúng ta cần xây dựng một cấu trúc dữ liệu thích
hợp để lưu trữ các thông số của con đường.
Một con đường bao gồm nhiều đoạn đường (Segment). Mỗi đoạn đường gồm có các thơng số như: điểm bắt đầu và điểm kết thúc, chiều rộng, chiều cao, độ dốc tối đa cho phép, thể tích đào (khoan), thể tích đắp.
Nhận xét rằng điểm kết thúc của đoạn đường thứ index sẽ là điểm bắt đầu của đoạn đường thứ index + 1. Do đó, chúng ta sẽ lưu trữ các điểm mốc vào một danh sách
riêng, các đoạn đường vào một danh sách riêng. Số lượng phần tử đoạn đường ít hơn số lượng phần tử điểm mốc một phần tử. Đoạn đường thứ index sẽ có điểm bắt đầu là phần tử thứ index và điểm kết thúc là phần tử thứ (index + 1) trong danh sách điểm mốc.
Hình 6-4 Cấu trúc dữ liệu lưu trữ con đường
Bên ngoài ứng dụng chỉ nhìn thấy danh sách đoạn đường nhưng bên trong chúng ta thật sự thao tác trên dữ liệu danh sách điểm mốc rồi tính tốn lại kết quả.
class TRoad: public TObject {
public:
class Corner: public TObject {
public:
__fastcall Corner(real x, real y, real z, TRoad* Road); virtual __fastcall ~Corner();
__fastcall operator Point3D();
Corner& __fastcall operator=(const Point3D& p); };
class Segment: public TObject {
public:
bool StraightLine;
enum { NEW, EDITING, NORMAL } state; /* 0-new object, 1-object
being edited, 2-normal*/
__fastcall Segment(real width, real height, real slope, TRoad* Road);
void __fastcall ComputeWorkVolume(bool recompute = false); bool __fastcall Validate();
void __fastcall RenderScene(int flag); virtual __fastcall ~Segment();
__property real Dag; __property real Fill; __property real MaxSlope;
__property real Width; __property real Height;
Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.
};
friend class Corner; friend class Segment; public:
__fastcall TRoad(TWorld3D* w3D); __fastcall ~TRoad();
bool __fastcall AddPoint(real x, real y, real z, int index=-1); int __fastcall FindPoint(void* corner);
void __fastcall DeletePoint(int index);
bool __fastcall AddPoint(const Point3D& point, int index=-1); void __fastcall DeletePoint(void* corner);
__property int PointCount;
__property Point3D Points[int index]; __property int SegmentCount;
__property TRoad::Segment* Segments[int index]; __property Point3D StartPoint[int index]; __property Point3D EndPoint[int index]; __property HWOBJ WorldTin;
};