-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHeader.h
More file actions
82 lines (69 loc) · 2.66 KB
/
Copy pathHeader.h
File metadata and controls
82 lines (69 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#ifndef HEADER_H
#define HEADER_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stddef.h>
#include <cstring>
#include <string>
#include <list>
#include <map>
#include <iterator>
#define LEAF 20
#define NODE 10
#define OBJECT 30
#define XAXIS 100
#define YAXIS 200
#define MAX 80
#define MIN 90
using namespace std;
struct MBR {
int x1, y1; // Êîîðäèíàòû âåðõíåé ëåâîé òî÷êè
int x2, y2; // Êîîðäèíàòû íèæíåé ïðàâîé òî÷êè
};
struct Node {
MBR covering; // ïîêðûòèå âåðøèíû
Node** childs; // ìàññèâ ïîòîìêîâ
Node* parent; // ðîäèòåëü
int type; // òèï âåðøèíû - ëèñò, óçåë èëè îáúåêò - LEAF NODE OBJECT
int objCount; // ÷èñëî ïîòîìêîâ
int data; // äàííûå (äëÿ îáúåêòà)
};
class OperationsWithObjects {
public:
Node* ChooseNodeWithMinMBR(Node* curNode, Node* newNode); // íàõîæäåíèå ïîòîìêà ñ ìèíèìàëüíûì óâåëè÷åíèåì MBR ïðè äîáàâëåíèè íîâîé âåðøèíû
long Area(MBR mbr); // íàõîæäåíèå ïëîùàäè
int FindMaxBottomBorder(Node** nodes, int nodesCount, int axis); // ïîèñê ìàêñèìàëüíî óäàëåííîãî ýëåìåíòà ïî îñè
void CalculateMBR(Node* node); // îáíîâëåíèå MBR âåðøèíû
bool IsIntersect(MBR mbr1, MBR mbr2); // ïðîâåðêà íà ïåðåñå÷åíèå äâóõ MBR
bool IsFullyContains(MBR container, MBR content); // ïðîâåðêà íà ïîëíîå âõîæäåíèå îäíîé MBR â äðóãóþ
bool IsEqual(MBR mbr1, MBR mbr2); // ïðîâåðêà íà ðàâåíñòâî äâóõ MBR
};
class Rtree:OperationsWithObjects {
public:
Rtree();
~Rtree();
void InsertObject(Node* neObject); // âñòàâêà îáúåêòà â äåðåâî (èíòåðôåéñ)
bool DeleteObject(MBR covering, int data); // óäàëåíèå îáúåêòà
void SearchByArea(MBR area, list<Node*>* res); // ïîèñê ïî ïëîùàäè (èíòåðôåéñ)
Node* SearchObject(MBR covering, int data); // ïîèñê îáúåêòà (èíòåðôåéñ)
Node* FindExtremumByArea(int borderType); // ïîèñê ìàêñèìàëüíîãî/ìèíèìàëüíîãî ïî ïëîùàäè îáúåêòà (èíòåðôåéñ)
void PrintRtree(ofstream &outputStream); // âûâîä ñòðóêòóðû äåðåâà (èíòåðôåéñ)
int m; // ìèíèìàëüíîå ÷èñëî ïîòîìêîâ ó âåðøèíû
int M; // ìàêñèìàëüíîå ÷èñëî ïîòîìêîâ ó âåðøèíû
private:
Node* root;
Node* curExtremum;
void MemFree(Node* nodeToDelete); // îñâîáîæäåíèå ïàìÿòè
void InsertNode(Node* neObject, int level);
void _PrintRtree(Node* curNode, int level, ofstream &outputStream);
Node* _FindExtremumByArea(Node* curNode, int borderType);
Node* _SearchObject(Node* curNode, MBR covering, int data);
void _SearchByArea(Node* curNode, MBR area, list<Node*>* res);
Node* ChooseNode(Node* newObject, int level); // ïîèñê óçëà äëÿ âñòàâêè
void CorrectTree(Node* leaf, Node* splitLeaf); // ïðîöåäóðà êîððåêòèðîâêè äåðåâà
Node* SplitNode(Node* curNode, Node* newNode); // ïðîöåäóðà äåëåíèÿ óçëà
int TreeLevel(); // îïðåäåëåíèå òåêóùåé âûñîòû äåðåâà
};
#endif HEADER_H