def _round_corners(pts, round_at_distance): if len(pts) > 2: calc_with_distance = round_at_distance while calc_with_distance > 0.5: new_lst = [pts[0]] for i, curr in enumerate(pts[1:-1]): i += 1 p1 = pts[i - 1] p2 = curr p3 = pts[i + 1] if len(pts) > 3: # i.e.: at least 4 points if sqrt((p3[0] - p2[0])**2 + (p3[1] - p2[1])**2) < (2 * calc_with_distance): # prevent from crossing over. new_lst.append(p2) continue generated = _gen_smoother_middle_points_from_3_points( [p1, p2, p3], calc_with_distance) for j in generated: new_lst.append(j) new_lst.append(pts[-1]) pts = new_lst calc_with_distance /= 2.0 return pts
def _gen_smoother_middle_points_from_3_points(pts, initial): p1 = pts[0] p2 = pts[1] p3 = pts[2] distance1 = sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2) distance2 = sqrt((p3[0] - p1[0]) ** 2 + (p3[1] - p1[1]) ** 2) if distance1 < 1e-10 or distance2 < 1e-10: yield p2 else: if distance1 < initial or distance2 < initial: yield p2 else: p2a = _gen_point(p1, p2, initial) p2b = _gen_point(p3, p2, initial) if p2a is None or p2b is None: yield p2 else: yield p2a yield p2b
def _gen_smoother_middle_points_from_3_points(pts, initial): p1 = pts[0] p2 = pts[1] p3 = pts[2] distance1 = sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) distance2 = sqrt((p3[0] - p1[0])**2 + (p3[1] - p1[1])**2) if distance1 < 1e-10 or distance2 < 1e-10: yield p2 else: if distance1 < initial or distance2 < initial: yield p2 else: p2a = _gen_point(p1, p2, initial) p2b = _gen_point(p3, p2, initial) if p2a is None or p2b is None: yield p2 else: yield p2a yield p2b
def _gen_point(p1, p2, new_distance): from grandalf.utils.geometry import new_point_at_distance initial_distance = distance = sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2) if initial_distance < 1e-10: return None if distance > new_distance: distance = distance - new_distance else: return None angle = getangle(p1, p2) new = new_point_at_distance(p1, distance, angle) return new
def _gen_point(p1, p2, new_distance): from grandalf.utils.geometry import new_point_at_distance initial_distance = distance = sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) if initial_distance < 1e-10: return None if distance > new_distance: distance = distance - new_distance else: return None angle = getangle(p1, p2) new = new_point_at_distance(p1, distance, angle) return new
def _round_corners(pts, round_at_distance): if len(pts) > 2: calc_with_distance = round_at_distance while calc_with_distance > 0.5: new_lst = [pts[0]] for i, curr in enumerate(pts[1:-1]): i += 1 p1 = pts[i-1] p2 = curr p3 = pts[i+1] if len(pts) > 3: # i.e.: at least 4 points if sqrt((p3[0] - p2[0]) ** 2 + (p3[1] - p2[1]) ** 2) < (2 * calc_with_distance): # prevent from crossing over. new_lst.append(p2) continue generated = _gen_smoother_middle_points_from_3_points( [p1, p2, p3], calc_with_distance) for i in generated: new_lst.append(i) new_lst.append(pts[-1]) pts = new_lst calc_with_distance /= 2. return pts