lOMoARcPSD|59149108
Bài tp và lý thuyết : LÝ BÁCH LINH
Cơ sở định v đối tượng không gian là mt khái niệm liên quan đến vic
t chc và quản lý các đối tượng trong không gian để d dàng truy vn v
trí hoc tìm kiếm. Đây là một vấn đề quan trng trong các ng dụng như
h thống thông tin địa lý (GIS), qun lý d liu không gian, và x lý hình
nh.
Các bài tập liên quan đến cơ sở định v đối tượng không gian thưng tp
trung vào cách lưu trữ, qun lý, và truy vấn các đối tượng như điểm,
đoạn thng, hình ch nhật, đa giác trong không gian 2D hoặc 3D. Các cu
trúc d liu không gian, như Quadtree, KD-tree, R-tree, hoc Octree, là
những phương pháp phổ biến để t chc d liu không gian này.
Ví d v bài tập cơ bản:
1. Bài tp Quản lý Đối tượng trong Không gian 2D
Bài toán: Cho mt tp hợp các đối tượng hình ch nht trong không gian
2D i din cho các khu vc), hãy xây dng một cơ sở định v đối tượng
không gian để quản lý chúng. Sau đó, với mt hình ch nht truy vn, hãy
tìm tt c các đối tượng giao vi hình ch nhật đó.
Li gii: Chúng ta có th s dng R-tree để quản lý các đối tượng hình
ch nht này vì R-tree được thiết kế để x lý các đối tượng không gian 2D
và 3D, đặc biệt là các đối tượng có kích thước và hình dng khác nhau.
c 1: Xây dng cu trúc d liu R-tree
Cu trúc R-tree là mt cây tìm kiếm vi mỗi node lưu tr mt vùng
cha (bounding box) bao bọc các đối tượng con. Các node con có
th là các hình ch nht hoc các node khác trong cây.
Mã gi đơn giản:
python Sao chép mã class Rectangle: def __init__(self,
x_min, y_min, x_max, y_max): self.x_min = x_min
self.y_min = y_min self.x_max = x_max self.y_max =
y_max
def intersects(self, other):
lOMoARcPSD|59149108
# Kim tra nếu hai hình ch nht giao nhau return not
(self.x_max < other.x_min or self.x_min > other.x_max or
self.y_max < other.y_min or self.y_min > other.y_max)
class RTreeNode: def __init__(self, bounding_box, children=None):
self.bounding_box = bounding_box # Vùng cha ca node
self.children = children or [] # Các node con hoc hình ch nht
def is_leaf(self):
return isinstance(self.children[0], Rectangle) # Nếu node lá cha các
hình ch nht
ớc 2: Chèn các đối tượng hình ch nht vào R-tree
Mi hình ch nht s được chèn vào node thích hp trong R-tree,
da trên vùng cha ca nó.
Mã gi chèn hình ch nht:
python Sao
chép mã
def insert_rectangle(rtree, rectangle): #
Chèn hình ch nht vào R-tree if
rtree.is_leaf():
rtree.children.append(rectangle)
else:
# Tìm node con có vùng cha phù hp nhất để chèn
best_fit_child = min(rtree.children, key=lambda child:
enlargement(child.bounding_box, rectangle))
insert_rectangle(best_fit_child, rectangle)
c 3: Truy vn giao vi hình ch nht
Để tìm tt c các đối tượng hình ch nht giao vi mt hình ch
nht truy vn, chúng ta duyt qua cây R-tree, kim tra s giao nhau
ca các bounding box và các hình ch nht trong node lá.
Mã gi cho truy vn:
lOMoARcPSD|59149108
python Sao chép mã def search_rtree(node, query_box,
found_rectangles): if not
node.bounding_box.intersects(query_box): return # Không
giao nhau, không cn tìm
if node.is_leaf(): for rectangle in
node.children: if
rectangle.intersects(query_box):
found_rectangles.append(rectangle) else: for child in
node.children: search_rtree(child, query_box, found_rectangles)
Kết qu:
Danh sách các hình ch nht giao vi vùng truy vn s được lưu
trong found_rectangles.
2. Bài tp Quản lý Các Điểm trong Không gian 3D
Bài toán: Cho mt tp hợp các điểm trong không gian 3D. Hãy xây dng
một cơ sở định v đối tượng không gian để quản lý các điểm này. Sau đó,
vi mt hình hp ch nht truy vn (bounding box), hãy tìm tt c các
điểm nm trong hình hộp đó.
Li gii: Chúng ta có th s dng Octree để quản lý các điểm trong không
gian 3D. Octree là mt phiên bn 3D ca Quadtree, chia không gian 3D
thành 8 phn.
c 1: Xây dng cu trúc Octree
Cu trúc Octree s chia không gian thành 8 phn mi node, và
quản lý các điểm trong tng phn.
Mã gi đơn giản cho Octree:
python Sao chép mã class OctreeNode: def
__init__(self, boundary, capacity):
self.boundary = boundary # Vùng không gian 3D chứa các điểm
self.capacity = capacity # S điểm tối đa trước khi chia nh
lOMoARcPSD|59149108
self.points = [] self.divided =
False
def subdivide(self):
# Chia vùng thành 8 phn (8 node con) pass
def insert(self, point): if not
self.boundary.contains(point):
return False # Điểm nm ngoài vùng cha
if len(self.points) < self.capacity:
self.points.append(point)
return True else: if not
self.divided: self.subdivide()
# Chèn vào mt trong các node con
for child in self.children:
if child.insert(point): return
True return False
c 2: Truy vấn đim trong hình hp ch nht
Để tìm các điểm trong vùng truy vn, ta duyt qua cây Octree, kim
tra s giao nhau của bounding box và các điểm trong node lá.
Mã gi truy vn:
python Sao chép mã def query_range(node, query_box,
found_points): if not
node.boundary.intersects(query_box): return # Không
giao nhau, không cn tìm
for point in node.points: if
query_box.contains(point):
found_points.append(point)
if node.divided: for child in node.children:
query_range(child, query_box, found_points) Kết qu:
lOMoARcPSD|59149108
Tt c các điểm nm trong vùng truy vn s được lưu trong danh
sách found_points.
Tng kết:
Cơ sở định v đối tượng không gian là mt khái nim quan trng
trong qun lý d liu không gian. Các cu trúc d liệu như R-tree,
Octree, và Quadtree cung cấp cách lưu trữ hiu qu và truy vn các
đối tượng trong không gian 2D và 3D.
Các bài tập thường tp trung vào vic xây dng cu trúc d liu này
và thc hin các truy vấn như tìm kiếm đối tượng giao nhau, điểm
gn nht, hoc tt c các điểm trong mt vùng.

Preview text:

lOMoARcPSD| 59149108
Bài tập và lý thuyết : LÝ BÁCH LINH
Cơ sở định vị đối tượng không gian là một khái niệm liên quan đến việc
tổ chức và quản lý các đối tượng trong không gian để dễ dàng truy vấn vị
trí hoặc tìm kiếm. Đây là một vấn đề quan trọng trong các ứng dụng như
hệ thống thông tin địa lý (GIS), quản lý dữ liệu không gian, và xử lý hình ảnh.
Các bài tập liên quan đến cơ sở định vị đối tượng không gian thường tập
trung vào cách lưu trữ, quản lý, và truy vấn các đối tượng như điểm,
đoạn thẳng, hình chữ nhật, đa giác trong không gian 2D hoặc 3D. Các cấu
trúc dữ liệu không gian, như Quadtree, KD-tree, R-tree, hoặc Octree, là
những phương pháp phổ biến để tổ chức dữ liệu không gian này.
Ví dụ về bài tập cơ bản:
1. Bài tập Quản lý Đối tượng trong Không gian 2D
Bài toán: Cho một tập hợp các đối tượng hình chữ nhật trong không gian
2D (đại diện cho các khu vực), hãy xây dựng một cơ sở định vị đối tượng
không gian để quản lý chúng. Sau đó, với một hình chữ nhật truy vấn, hãy
tìm tất cả các đối tượng giao với hình chữ nhật đó.
Lời giải: Chúng ta có thể sử dụng R-tree để quản lý các đối tượng hình
chữ nhật này vì R-tree được thiết kế để xử lý các đối tượng không gian 2D
và 3D, đặc biệt là các đối tượng có kích thước và hình dạng khác nhau.
Bước 1: Xây dựng cấu trúc dữ liệu R-tree
Cấu trúc R-tree là một cây tìm kiếm với mỗi node lưu trữ một vùng
chứa (bounding box) bao bọc các đối tượng con. Các node con có
thể là các hình chữ nhật hoặc các node khác trong cây.
Mã giả đơn giản:
python Sao chép mã class Rectangle: def __init__(self,
x_min, y_min, x_max, y_max): self.x_min = x_min
self.y_min = y_min self.x_max = x_max self.y_max = y_max def intersects(self, other): lOMoARcPSD| 59149108
# Kiểm tra nếu hai hình chữ nhật giao nhau return not
(self.x_max < other.x_min or self.x_min > other.x_max or
self.y_max < other.y_min or self.y_min > other.y_max)
class RTreeNode: def __init__(self, bounding_box, children=None):
self.bounding_box = bounding_box # Vùng chứa của node
self.children = children or [] # Các node con hoặc hình chữ nhật def is_leaf(self):
return isinstance(self.children[0], Rectangle) # Nếu node lá chứa các hình chữ nhật
Bước 2: Chèn các đối tượng hình chữ nhật vào R-tree
Mỗi hình chữ nhật sẽ được chèn vào node thích hợp trong R-tree,
dựa trên vùng chứa của nó.
Mã giả chèn hình chữ nhật: python Sao chép mã
def insert_rectangle(rtree, rectangle): #
Chèn hình chữ nhật vào R-tree if rtree.is_leaf():
rtree.children.append(rectangle) else:
# Tìm node con có vùng chứa phù hợp nhất để chèn
best_fit_child = min(rtree.children, key=lambda child:
enlargement(child.bounding_box, rectangle))
insert_rectangle(best_fit_child, rectangle)
Bước 3: Truy vấn giao với hình chữ nhật
Để tìm tất cả các đối tượng hình chữ nhật giao với một hình chữ
nhật truy vấn, chúng ta duyệt qua cây R-tree, kiểm tra sự giao nhau
của các bounding box và các hình chữ nhật trong node lá.
Mã giả cho truy vấn: lOMoARcPSD| 59149108
python Sao chép mã def search_rtree(node, query_box, found_rectangles): if not
node.bounding_box.intersects(query_box): return # Không giao nhau, không cần tìm
if node.is_leaf(): for rectangle in node.children: if
rectangle.intersects(query_box):
found_rectangles.append(rectangle) else: for child in
node.children: search_rtree(child, query_box, found_rectangles) Kết quả:
Danh sách các hình chữ nhật giao với vùng truy vấn sẽ được lưu trong found_rectangles.
2. Bài tập Quản lý Các Điểm trong Không gian 3D
Bài toán: Cho một tập hợp các điểm trong không gian 3D. Hãy xây dựng
một cơ sở định vị đối tượng không gian để quản lý các điểm này. Sau đó,
với một hình hộp chữ nhật truy vấn (bounding box), hãy tìm tất cả các
điểm nằm trong hình hộp đó.
Lời giải: Chúng ta có thể sử dụng Octree để quản lý các điểm trong không
gian 3D. Octree là một phiên bản 3D của Quadtree, chia không gian 3D thành 8 phần.
Bước 1: Xây dựng cấu trúc Octree
Cấu trúc Octree sẽ chia không gian thành 8 phần ở mỗi node, và
quản lý các điểm trong từng phần.
Mã giả đơn giản cho Octree:
python Sao chép mã class OctreeNode: def
__init__(self, boundary, capacity):
self.boundary = boundary # Vùng không gian 3D chứa các điểm
self.capacity = capacity # Số điểm tối đa trước khi chia nhỏ lOMoARcPSD| 59149108
self.points = [] self.divided = False def subdivide(self):
# Chia vùng thành 8 phần (8 node con) pass
def insert(self, point): if not
self.boundary.contains(point):
return False # Điểm nằm ngoài vùng chứa
if len(self.points) < self.capacity: self.points.append(point) return True else: if not
self.divided: self.subdivide()
# Chèn vào một trong các node con for child in self.children:
if child.insert(point): return True return False
Bước 2: Truy vấn điểm trong hình hộp chữ nhật
Để tìm các điểm trong vùng truy vấn, ta duyệt qua cây Octree, kiểm
tra sự giao nhau của bounding box và các điểm trong node lá. Mã giả truy vấn:
python Sao chép mã def query_range(node, query_box, found_points): if not
node.boundary.intersects(query_box): return # Không giao nhau, không cần tìm for point in node.points: if query_box.contains(point): found_points.append(point)
if node.divided: for child in node.children:
query_range(child, query_box, found_points) Kết quả: lOMoARcPSD| 59149108 •
Tất cả các điểm nằm trong vùng truy vấn sẽ được lưu trong danh sách found_points. Tổng kết:
Cơ sở định vị đối tượng không gian là một khái niệm quan trọng
trong quản lý dữ liệu không gian. Các cấu trúc dữ liệu như R-tree,
Octree, và Quadtree cung cấp cách lưu trữ hiệu quả và truy vấn các
đối tượng trong không gian 2D và 3D. •
Các bài tập thường tập trung vào việc xây dựng cấu trúc dữ liệu này
và thực hiện các truy vấn như tìm kiếm đối tượng giao nhau, điểm
gần nhất, hoặc tất cả các điểm trong một vùng.