apply_matrix_dots
函数,用于根据输入的类别,生成对应的坐标矩阵。
def apply_matrix_dots(self, start_x, start_y, end_x, end_y, attri):
'''
Applying Bresenham's line algorithm to find out all the points along the route and updating all the location on matrix as 1.
Args:
start_x:
start_y:
end_x:
end_y:
attri: Utilized for determining which matrix should be modified.
Returns:
'''
# Get the points for the line between start and end
points = self.bresenham_line(start_x, start_y, end_x, end_y)
if attri=='road':
# Update the road_matrix for each point on the line
for x, y in points:
self.road_matrix[x][y] = 1
if attri=='river':
for x, y in points:
self.river_matrix[x][y] = 1
if attri=='wall':
# Question: what's the meaning of wall? It seems that wall and ditch has the same start point and end point.
for x,y in points:
self.wall_matrix[x][y]=1
if attri=='indoor':
# Question: what's the meaning of indoor? The output of inoor matrix contains nothing.
for x,y in points:
self.indoor_matrix[x][y]=1
if attri=='pillar':
# Question: what's the meaning of pillar? The output of pillar matrix contains nothing.
for x,y in points:
self.pillar_matrix[x][y]=1
函数用法:self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'road')
上述语句添加位置:self.roads.append({"start_x": start_x, "end_x": end_x, "start_y": start_y, "end_y": end_y})
原先列表添加点位坐标语句之后。
self.roads.append({"start_x": start_x, "end_x": end_x, "start_y": start_y, "end_y": end_y})
'''
Applying 1 to self.road_matrix along the route
from the start point(star_x,star_y) to end point (end_x,end_x)
'''
self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'road')
# 获得沟渠的每个坐标
self.ditch = self.get_rectangle_coordinates(114, 149, 161, 178)
self.ditch_inside = self.get_coordinates_in_range((110, 145), (165, 180))
'''
Applying 1 to self.ditch_matrix along all the coordinate in list self.ditch_inside
'''
for x, y in self.ditch_inside:
self.ditch_matrix[x][y] = 1
self.stream_pos2.append((start_x, start_y))
if i>0:
'''
Applying 1 to self.river_matrix along the route
from the start point(start0_x,start0_y) to end point (start_x,start_y)
'''
self.apply_matrix_dots(start0_x,start0_y,start_x,start_y,'river')
start0_x,start0_y=start_x,start_y
elif pos_type == 'indoor':
self.indoors.append((start_x, start_y))
if i>0:
'''
Applying 1 to self.indoor_matrix along the route
from the start point(start0_x,start0_y) to end point (start_x,start_y)
'''
self.apply_matrix_dots(start0_x,start0_y,start_x,start_y,'indoor')
start0_x,start0_y=start_x,start_y
elif pos_type == "pillar":
pillar_positions = {"start_x": start_x, "end_x": end_x, "start_y": start_y, "end_y": end_y}
self.pillars.append(pillar_positions)
'''
Applying 1 to self.pillar_matrix along the route
from the start point(start_x,start_y) to end point (end_x,end_y)
'''
self.apply_matrix_dots(start_x,start_y,end_x,end_y,'pillar')
bresenham_line
函数,用于计算两点之间直线上经过的点位坐标。
def bresenham_line(self,x0, y0, x1, y1):
"""Bresenham's Line Algorithm
Produces a list of tuples from start and end points
This is used to determine the points of an n-dimensional
raster that should be selected in order to form a close
approximation to a straight line between two points.
"""
points = []
is_steep = abs(y1 - y0) > abs(x1 - x0)
if is_steep:
x0, y0 = y0, x0
x1, y1 = y1, x1
swapped = False
if x0 > x1:
x0, x1 = x1, x0
y0, y1 = y1, y0
swapped = True
dx = x1 - x0
dy = y1 - y0
error = int(dx / 2.0)
y_step = 1 if y0 < y1 else -1
y = y0
for x in range(x0, x1 + 1):
coord = (y, x) if is_steep else (x, y)
points.append(coord)
error -= abs(dy)
if error < 0:
y += y_step
error += dx
if swapped:
points.reverse()
return points
combine_matrices
函数用于拼接不同物体的matrix
def combine_matrices(self):
'''
Initializing terrain matrix.
Returns:
Adding different object matrix
(self.river_matrix, self.road_matrix, self.wall_matrix, self.indoor_matrix,
self.exits_matrix, self.pillar_matrix and self.ditch_matrix) into self.terrain_matrix.
Different objects have different representation number.
river 1
road 2
wall 3
indoor 4
exits 5
pillar 6
ditch 7
'''
# Initialize the terrain_matrix with zeros
# Assuming all matrices have the same shape
self.terrain_matrix = np.zeros_like(self.river_matrix)
# Add different object matrices into terrain_matrix
# with their respective representation numbers
self.terrain_matrix += self.river_matrix * 1
self.terrain_matrix += self.road_matrix * 2
self.terrain_matrix += self.wall_matrix * 3
# self.terrain_matrix += self.indoor_matrix * 4
# self.terrain_matrix += self.exits_matrix * 5
self.terrain_matrix += self.pillar_matrix * 6
self.terrain_matrix += self.ditch_matrix * 7
# Handle overlapping (if any) by choosing the maximum value
# assuming that in the case of overlap, the higher number takes precedence
self.terrain_matrix = np.maximum.reduce([
self.river_matrix * 1,
self.road_matrix * 2,
self.wall_matrix * 3,
# self.indoor_matrix * 4,
# self.exits_matrix * 5,
self.pillar_matrix * 6,
self.ditch_matrix * 7
])