Beispiel #1
0
    def from_arc(cls,
                 arc: ConstructionArc,
                 start_width: float,
                 end_width: float,
                 segments: int = 64) -> 'CurvedTrace':
        """
        Create curved trace from an arc.

        Args:
            arc: :class:`~ezdxf.math.ConstructionArc` object
            start_width: start width
            end_width: end width
            segments: count of segments for full circle (360 degree) approximation, partial arcs have proportional
                      less segments, but at least 3

        Raises:
            ValueError: if arc.radius <= 0

        """
        if arc.radius <= 0:
            raise ValueError(f'Invalid radius: {arc.radius}.')
        curve_trace = cls()
        count = max(math.ceil(arc.angle_span / 360.0 * segments), 3) + 1
        center = Vec2(arc.center)
        for point, width in zip(arc.vertices(arc.angles(count)),
                                linspace(start_width, end_width, count)):
            curve_trace._append(point, point - center, width)
        return curve_trace
def test_vertices():
    angles = [0, 45, 90, 135, -45, -90, -135, 180]
    arc = ConstructionArc(center=(1, 1))
    vertices = list(arc.vertices(angles))
    for v, a in zip(vertices, angles):
        a = math.radians(a)
        assert v.isclose(Vec2((1 + math.cos(a), 1 + math.sin(a))))