Module curvepy.extension.sin

Expand source code
import math
from .tangent import TangentExtension
from ..sin import Sin

class SinExtension(TangentExtension):

    """
    Extends an end of a function with a sine wave using its edge tangents.
    """

    name = "sin"

    def __init__(self, func, period=0, **kwargs):
        self.period = float(period)
        assert self.period > 0
        super().__init__(func, **kwargs)

    def create_extension_func(self, start=False):
        return Sin(amplitude=0, period=self.period)

    def update_extension_func(self, sin, x, y, dy):
        # angle
        x_coef = 2 * math.pi / self.period
        angle = x_coef * x

        # phase
        num = x_coef * y * math.cos(angle) - dy * math.sin(angle)
        den = x_coef * y * math.sin(angle) + dy * math.cos(angle)
        phase = math.atan2(num, den)

        # amplitude
        if (angle + phase) % math.pi != 0:
            amplitude = y / math.sin(angle + phase)
        else:
            amplitude = dy / (x_coef * math.cos(angle + phase))

        sin.set(amplitude=amplitude, period=self.period, phase=phase)

Classes

class SinExtension (func, period=0, **kwargs)

Extends an end of a function with a sine wave using its edge tangents.

Expand source code
class SinExtension(TangentExtension):

    """
    Extends an end of a function with a sine wave using its edge tangents.
    """

    name = "sin"

    def __init__(self, func, period=0, **kwargs):
        self.period = float(period)
        assert self.period > 0
        super().__init__(func, **kwargs)

    def create_extension_func(self, start=False):
        return Sin(amplitude=0, period=self.period)

    def update_extension_func(self, sin, x, y, dy):
        # angle
        x_coef = 2 * math.pi / self.period
        angle = x_coef * x

        # phase
        num = x_coef * y * math.cos(angle) - dy * math.sin(angle)
        den = x_coef * y * math.sin(angle) + dy * math.cos(angle)
        phase = math.atan2(num, den)

        # amplitude
        if (angle + phase) % math.pi != 0:
            amplitude = y / math.sin(angle + phase)
        else:
            amplitude = dy / (x_coef * math.cos(angle + phase))

        sin.set(amplitude=amplitude, period=self.period, phase=phase)

Ancestors

Class variables

var name

Methods

def create_extension_func(self, start=False)
Expand source code
def create_extension_func(self, start=False):
    return Sin(amplitude=0, period=self.period)
def update_extension_func(self, sin, x, y, dy)
Expand source code
def update_extension_func(self, sin, x, y, dy):
    # angle
    x_coef = 2 * math.pi / self.period
    angle = x_coef * x

    # phase
    num = x_coef * y * math.cos(angle) - dy * math.sin(angle)
    den = x_coef * y * math.sin(angle) + dy * math.cos(angle)
    phase = math.atan2(num, den)

    # amplitude
    if (angle + phase) % math.pi != 0:
        amplitude = y / math.sin(angle + phase)
    else:
        amplitude = dy / (x_coef * math.cos(angle + phase))

    sin.set(amplitude=amplitude, period=self.period, phase=phase)

Inherited members