def __init__(self, barycenter, location, p1, p2, p3): self.location = location self.position = p2 self.direction = pnormalized(get_bisector(p1, p2, p3, self.up_vector)) preferred_direction = pnormalized(psub(p2, barycenter)) # direction_factor: 0..1 (bigger -> better) direction_factor = (pdot(preferred_direction, self.direction) + 1) / 2 angle = get_angle_pi(p1, p2, p3, self.up_vector, pi_factor=True) # angle_factor: 0..1 (bigger -> better) if angle > 0.5: # use only angles > 90 degree angle_factor = angle / 2.0 else: angle_factor = 0 # priority: 0..1 (bigger -> better) self.priority = angle_factor * direction_factor
def get_bisector(self, index): p1 = self._points[index - 1] p2 = self._points[index] p3 = self._points[(index + 1) % len(self._points)] return get_bisector(p1, p2, p3, self.plane.n)