"""Физически согласованные последовательности и перенос момента."""
import math


def sequence_currents(theta,positive,negative,positive_phase=0.,negative_phase=0.):
    """Пиковые токи, рад. Обе последовательности имеют одну временную частоту."""
    return [positive*math.cos(theta-2*math.pi*k/3+positive_phase)+
            negative*math.cos(theta+2*math.pi*k/3+negative_phase) for k in range(3)]


def torque_about_rotor(torque_origin,fx,fy,offset_x_m,offset_y_m=0.):
    return torque_origin-offset_x_m*fy+offset_y_m*fx


def spatial_components(bx,by,angle):
    return [bx*math.cos(angle)+by*math.sin(angle),-bx*math.sin(angle)+by*math.cos(angle)]


def cycle_summary(rows):
    n=len(rows)
    if n<4 or any(abs(row['theta_deg']-360*k/n)>1e-8 for k,row in enumerate(rows)):
        raise ValueError('Нужен полный равномерный цикл без повторённой конечной точки')
    result={}
    for key in ('Fx_N','Fy_N','torque_rotor_Nm'):
        values=[r[key] for r in rows]
        result[key]={'mean':sum(values)/n,'peak_to_peak':max(values)-min(values),
                     'rms_ripple':math.sqrt(sum((v-sum(values)/n)**2 for v in values)/n)}
    return result
