merge with upstream master
This commit is contained in:
@@ -234,24 +234,43 @@ class DXFHelper(object):
|
||||
|
||||
node_store.add_node(node)
|
||||
|
||||
# Optimization: avoid creating thousands of replicated objects
|
||||
graph_directions_cache = {}
|
||||
for x in (0, 1, -1):
|
||||
for y in (0, 1, -1):
|
||||
if x == y == 0:
|
||||
continue
|
||||
graph_directions_cache[(x, y)] = GraphDirection((x, y))
|
||||
|
||||
for node in nodes:
|
||||
if len(node.neighboring_nodes()) == 8:
|
||||
continue
|
||||
|
||||
rotation = math.radians(node.coordinate.rotation)
|
||||
# Optimization: Avoid replicate calculations thousands of times
|
||||
x_spacing_cos_rotation = (node.x_spacing * math.cos(rotation))
|
||||
y_spacing_sin_rotation = (node.y_spacing * math.sin(rotation))
|
||||
x_spacing_sin_rotation = (node.x_spacing * math.sin(rotation))
|
||||
y_spacing_cos_rotation = (node.y_spacing * math.cos(rotation))
|
||||
|
||||
for x in (0, 1, -1):
|
||||
for y in (0, 1, -1):
|
||||
if x == y == 0:
|
||||
continue
|
||||
rotation = math.radians(node.coordinate.rotation)
|
||||
x_spacing = (x * node.x_spacing * math.cos(rotation)) - (y * node.y_spacing * math.sin(rotation))
|
||||
y_spacing = (x * node.x_spacing * math.sin(rotation)) + (y * node.y_spacing * math.cos(rotation))
|
||||
x_spacing = (x * x_spacing_cos_rotation) - (y * y_spacing_sin_rotation)
|
||||
y_spacing = (x * x_spacing_sin_rotation) + (y * y_spacing_cos_rotation)
|
||||
|
||||
coordinate = Coordinate(node.coordinate.x + x_spacing, node.coordinate.y + y_spacing, node.coordinate.rotation)
|
||||
if coordinate.x < 0 or coordinate.y < 0:
|
||||
continue
|
||||
direction = GraphDirection((x, y))
|
||||
|
||||
# Optimization for `direction = GraphDirection((x, y))`
|
||||
direction = graph_directions_cache[(x, y)]
|
||||
if node.has_existing_neighbor(direction):
|
||||
continue
|
||||
|
||||
# FIXME: This is the bottleneck of the loop
|
||||
# Calling this ~10000 times needs ~20 seconds
|
||||
neighbor = node_store.find_coordinate(coordinate)
|
||||
if neighbor:
|
||||
node.add_neighbor(neighbor, direction)
|
||||
@@ -417,7 +436,7 @@ class DXFHelper(object):
|
||||
def __compute_segment_direction(p1, p2):
|
||||
"""
|
||||
Computes direction of a segment. Points taken from building outline are assumed to be in counterclockwise order.
|
||||
|
||||
|
||||
:param p1: first point
|
||||
:param p2: second point
|
||||
:return: tuple representing orientation ('north', 'south', 'east', 'west') and variation in degrees from ideally
|
||||
@@ -438,7 +457,7 @@ class DXFHelper(object):
|
||||
def compute_corner_directions(vertex, prev, next, angle_correction):
|
||||
"""
|
||||
Determines if point is located in north/east corner
|
||||
|
||||
|
||||
:param vertex: point located in the corner
|
||||
:param prev: point previous to vertex, assuming counterclockwise order
|
||||
:param next: point next to vertex, assuming counterclockwise order
|
||||
@@ -510,7 +529,7 @@ class DXFHelper(object):
|
||||
@staticmethod
|
||||
def __generate_wind_zone__(buildings, scaling_factor, points_callback, panel_orientation):
|
||||
"""
|
||||
Important: polygons representing buildings are expected to have points in counterclockwise order
|
||||
Important: polygons representing buildings are expected to have points in counterclockwise order
|
||||
"""
|
||||
|
||||
wind_zones = []
|
||||
|
||||
Reference in New Issue
Block a user