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 );
}
}