Code/ComplexNumber.cs
namespace FractalGen;

/// <summary>
/// Simple complex number implementation
/// </summary>
public struct ComplexNumber
{
    public float Real { get; set; }
    public float Imaginary { get; set; }
    public readonly double Magnitude => MathF.Sqrt( MagnitudeSquared() );
    public readonly double Phase => Math.Atan2( Imaginary, Real );

    public ComplexNumber( float real, float imaginary )
    {
        Real = real;
        Imaginary = imaginary;
    }

    public readonly float MagnitudeSquared()
    {
        return Real * Real + Imaginary * Imaginary;
    }

    public static ComplexNumber Square( ComplexNumber z )
    {
        return new ComplexNumber(
            z.Real * z.Real - z.Imaginary * z.Imaginary,
            2 * z.Real * z.Imaginary
        );
    }

    public static ComplexNumber operator +( ComplexNumber left, ComplexNumber right )
    {
        return new ComplexNumber( left.Real + right.Real, left.Imaginary + right.Imaginary );
    }

    public static ComplexNumber operator -( ComplexNumber left, ComplexNumber right )
    {
        return new ComplexNumber( left.Real - right.Real, left.Imaginary - right.Imaginary );
    }

    public static ComplexNumber operator *( ComplexNumber left, ComplexNumber right )
    {
        float result_realpart = (left.Real * right.Real) - (left.Imaginary * right.Imaginary);
        float result_imaginarypart = (left.Imaginary * right.Real) + (left.Real * right.Imaginary);
        return new ComplexNumber( result_realpart, result_imaginarypart );
    }
}