improved angle calculation method ; introduced difference between inner and outer corners

This commit is contained in:
GotPPay
2018-01-13 05:10:11 +01:00
parent bc646b86c2
commit b09f45f594
2 changed files with 56 additions and 42 deletions

View File

@@ -1,5 +1,5 @@
import sys
from math import sqrt, atan, degrees
from math import sqrt, degrees, acos
from helix.models.corner import Corner
from helix.constants.global_constants import max_corner_angle
@@ -75,41 +75,43 @@ class ProjectPresenter(object):
return result
def get_corners(self, buildings):
def angle(x1, y1, x2, y2):
# Use dotproduct to find angle between vectors
# This always returns an angle between 0, pi
numer = (x1 * x2 + y1 * y2)
denom = sqrt((x1 ** 2 + y1 ** 2) * (x2 ** 2 + y2 ** 2))
return acos(numer / denom)
def cross_sign(x1, y1, x2, y2):
# True if cross is positive
# False if negative or zero
return x1 * y2 > x2 * y1
result = []
for building in buildings:
presentable_building = []
result.append(presentable_building)
previous_corner = building[-1]
for i, corner in enumerate(building):
if (i+1 == len(building)):
next_corner = building[0]
else:
next_corner = building[i+1]
#x coordinate is stored as first element of corner variable
#y coordinate is stored as second element of corner variable
corner_length_ccw = sqrt((next_corner[0] - corner[0])**2 + (next_corner[1] - corner[1])**2)
corner_length_cw = sqrt((previous_corner[0] - corner[0])**2 + (previous_corner[1] - corner[1])**2)
k1 = float('Inf') if (corner[0]==previous_corner[0]) else (corner[1] - previous_corner[1]) / (corner[0] - previous_corner[0])
k2 = float('Inf') if (corner[0]==next_corner[0]) else (next_corner[1] - corner[1]) / (next_corner[0] - corner[0])
for i in range(len(building)):
p1 = building[i]
ref = building[i - 1]
p2 = building[i - 2]
x1, y1 = p1[0] - ref[0], p1[1] - ref[1]
x2, y2 = p2[0] - ref[0], p2[1] - ref[1]
theta2 = degrees(atan(k2))
theta1 = degrees(atan(k1)) - theta2
corner_length_cw = sqrt(x2**2 + y2**2)
corner_length_ccw = sqrt(x1**2 + y1**2)
theta = degrees(angle(x1, y1, x2, y2))
if (theta1 < 0):
if (k1 < 0 and k2 < 0):
theta1 = 360 + theta1
elif (k1 <= 0 and k2 >= 0):
theta1 = 180 + theta1
else:
if (k1 > 0 and k2 > 0):
theta1 = 180 + theta1
if (theta1 < max_corner_angle):
presentable_building.append(Corner(corner[0], corner[1], corner_length_ccw,corner_length_cw, theta1).__dict__)
previous_corner = corner
#print('Points', p1, ref, p2)
#print('Angle', theta)
if (cross_sign(x1, y1, x2, y2)) and (theta < max_corner_angle) :
#print('Inner Angle')
presentable_building.append(Corner(ref[0], ref[1], corner_length_ccw,corner_length_cw, theta).__dict__)
return result