def draw_line(self, start: Vec3, end: Vec3, properties: Properties): # matplotlib draws nothing for a zero-length line: if start.isclose(end): self.draw_point(start, properties) else: self._line_renderer.draw_line(start, end, properties, self._get_z())
def draw_line(self, start: Vec3, end: Vec3, properties: Properties) -> None: # PyQt draws a long line for a zero-length line: if start.isclose(end): self.draw_point(start, properties) else: item = self._line_renderer.draw_line(start, end, properties) # type: ignore self._set_item_data(item)
def distance_point_line_3d(point: Vec3, start: Vec3, end: Vec3) -> float: """ Returns the normal distance from `point` to 3D line defined by `start-` and `end` point. """ if start.isclose(end): raise ZeroDivisionError('Not a line.') v1 = point - start # point projected onto line start to end: v2 = (end - start).project(v1) # Pythagoras: return math.sqrt(v1.magnitude_square - v2.magnitude_square)
def bulge_to(p1: Vec3, p2: Vec3, bulge: float): if p1.isclose(p2): return center, start_angle, end_angle, radius = bulge_to_arc(p1, p2, bulge) ellipse = ConstructionEllipse.from_arc( center, radius, Z_AXIS, math.degrees(start_angle), math.degrees(end_angle), ) curves = list(cubic_bezier_from_ellipse(ellipse)) if curves[0].control_points[0].isclose(p2): curves = _reverse_bezier_curves(curves) self.add_curves(curves)
def bulge_to(p1: Vec3, p2: Vec3, bulge: float): if p1.isclose(p2, rel_tol=IS_CLOSE_TOL, abs_tol=0): return center, start_angle, end_angle, radius = bulge_to_arc(p1, p2, bulge) ellipse = ConstructionEllipse.from_arc( center, radius, Z_AXIS, math.degrees(start_angle), math.degrees(end_angle), ) curves = list(cubic_bezier_from_ellipse(ellipse)) curve0 = curves[0] cp0 = curve0.control_points[0] if cp0.isclose(p2, rel_tol=IS_CLOSE_TOL, abs_tol=0): curves = reverse_bezier_curves(curves) add_bezier4p(path, curves)
def distance_point_line_3d(point: Vec3, start: Vec3, end: Vec3) -> float: """ Returns the normal distance from `point` to 3D line defined by `start-` and `end` point. """ if start.isclose(end): raise ZeroDivisionError('Not a line.') v1 = point - start # point projected onto line start to end: v2 = (end - start).project(v1) # Pythagoras: diff = v1.magnitude_square - v2.magnitude_square if diff <= 0.0: # This should not happen (abs(v1) > abs(v2)), but floating point # imprecision at very small values makes it possible! return 0.0 else: return math.sqrt(diff)
def is_spatial(v: Vec3) -> bool: return not v.isclose(Z_AXIS) and not v.isclose(NEG_Z_AXIS)