#
# Copyright (C) 2010-2017 PyTRiP98 Developers.
#
# This file is part of PyTRiP98.
#
# PyTRiP98 is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# PyTRiP98 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PyTRiP98. If not, see <http://www.gnu.org/licenses/>.
#
"""
TODO: documentation here.
"""
import numpy as np
from math import pi, sin, cos, acos, asin
[docs]def get_basis_from_angles(gantry, couch):
gantry /= 180.0 / pi
couch /= -180.0 / pi
a = -np.array([sin(gantry) * cos(couch), -cos(gantry), sin(couch) * sin(gantry)])
c = -np.array([sin(gantry + pi / 2) * cos(couch), -cos(gantry + pi / 2), sin(couch) * sin(gantry + pi / 2)])
b = np.cross(a, c)
return [a, b, c]
[docs]def angles_from_trip(gantry, couch):
gantry += 90
couch = -(couch + 90)
return gantry, couch
[docs]def angles_to_trip(gantry, couch):
gantry -= 90
couch = -couch - 90
return gantry, couch
[docs]def vector_to_angles(vec):
gantry = acos(vec[1])
couch = asin(vec[2] / sin(gantry))
return gantry / pi * 180, couch / pi * 180
[docs]def point_in_polygon(x, y, polygon):
intersects = 0
n = len(polygon)
x1 = polygon[0][0]
y1 = polygon[0][1]
for i in range(n + 1):
x2 = polygon[i % n][0]
y2 = polygon[i % n][1]
if y > min(y1, y2):
if y <= max(y1, y2):
if x <= max(x1, x2):
if y1 != y2:
xinters = (y - y1) * (x2 - x1) / (y2 - y1) + x1
if x1 == x2 or x <= xinters:
intersects += 1
x1 = x2
y1 = y2
if intersects % 2 != 0:
return True
else:
return False
[docs]def get_nearest_point(point, contour):
length = 100000000.0
p_out = None
p2 = np.array(point)
for p in contour:
temp_len = sum((p2 - np.array(p))**2)
if temp_len < length:
length = temp_len
p_out = p
return p_out
[docs]def max_list(a, b):
return [max(x, y) for x, y in zip(a, b)]
[docs]def min_list(a, b):
return [min(x, y) for x, y in zip(a, b)]
[docs]def array_to_point_array(points, offset):
point = [[points[3 * i] - offset[0], points[3 * i + 1] - offset[1], points[3 * i + 2] - offset[2]]
for i in range(int(len(points) / 3))]
return point
[docs]def get_area_contour(polygon):
points = np.zeros((len(polygon), 2))
points[0:len(polygon)] = np.array(polygon)[:, 0:2]
points[-1] = np.array(polygon[0])
dx_dy = np.array([points[i + 1] - points[i] for i in range(len(points) - 1)])
points = np.array([(points[i + 1] + points[i]) / 2 for i in range(len(points) - 1)])
area = -sum(points[:, 1] * dx_dy[:, 0])
return area
[docs]def get_x_intersection(y, polygon):
intersections = []
x1 = polygon[0][0]
y1 = polygon[0][1]
n = len(polygon)
for i in range(n + 1):
x2 = polygon[i % n][0]
y2 = polygon[i % n][1]
if y > min(y1, y2):
if y <= max(y1, y2):
x = (x2 - x1) / (y2 - y1) * (y - y1) + x1
intersections.append(x)
x1 = x2
y1 = y2
return intersections
# find a short distance probably not the shortest
[docs]def short_distance_polygon_idx(poly1, poly2):
d = 10000000
n1 = len(poly1)
n2 = len(poly2)
i1 = 0
i2 = 0
for i in range(n2):
d1 = (poly2[i][0] - poly1[i1][0])**2 + (poly2[i][1] - poly1[i1][1])**2
if d1 < d:
i2 = i
d = d1
for i in range(n1):
d2 = (poly2[i2][0] - poly1[i][0])**2 + (poly2[i2][1] - poly1[i][1])**2
if d2 < d:
i1 = i
d = d2
for i in range(n2):
d1 = (poly2[i][0] - poly1[i1][0])**2 + (poly2[i][1] - poly1[i1][1])**2
if d1 < d:
i2 = i
d = d1
for i in range(n1):
d2 = (poly2[i2][0] - poly1[i][0])**2 + (poly2[i2][1] - poly1[i][1])**2
if d2 < d:
i1 = i
d = d2
return i1, i2, float(d)**0.5