CLASS:: Complex
summary:: complex number
categories:: Math
related::Classes/Polar, Classes/SimpleNumber, Classes/Float, Classes/Integer

DESCRIPTION::
A class representing complex numbers.
Note that this is a simplified representation of a complex number, which does not implement the full mathematical notion of a complex number.

CLASSMETHODS::
method:: new
Create a new complex number with the given real and imaginary parts.
argument:: real
the real part
argument:: imag
the imaginary part

returns:: a new instance of Complex.
discussion::
code::
a = Complex(2, 5);
a.real;
a.imag;
::

INSTANCEMETHODS::

subsection:: math support
method:: real
The real part of the number.

method:: imag
The imaginary part of the number.

method:: conjugate
the complex conjugate.
discussion::
code::
Complex(2, 9).conjugate
::

method:: +
Complex addition.
discussion::
code::
Complex(2, 9) + Complex(-6, 2)
::

method:: -
Complex subtraction
discussion::
code::
Complex(2, 9) - Complex(-6, 2)
::

method:: *
Complex multiplication
discussion::
code::
Complex(2, 9) * Complex(-6, 2)
::

method:: /
Complex division.
discussion::
code::
Complex(2, 9) / Complex(-6, 2)
::

method:: exp
Complex exponentiation with base e.
discussion::
code::
exp(Complex(2, 9))
::
code::
exp(Complex(0, pi)) == -1 // Euler's formula: true
::

method:: squared
Complex self multiplication.
discussion::
code::
squared(Complex(2, 1))
::

method:: cubed
complex triple self multiplication.
discussion::
code::
cubed(Complex(2, 1))
::

method:: sqrt
Complex square root
discussion::
returns the principal root
code::
Complex(4, 1.neg).sqrt

// compare...
Complex(4, 1.neg).pow(2.reciprocal)
::

method:: **
method:: pow
Complex exponentiation
discussion::
not implemented for all combinations - some are mathematically ambiguous.
code::
Complex(0, 2) ** 6
::
code::
2.3 ** Complex(0, 2)
::
code::
Complex(2, 9) ** 1.2 // not defined
::


method:: <
the comparison of just the real parts.
discussion::
code::
Complex(2, 9) < Complex(5, 1);
::

method:: ==
the comparison assuming that the reals (floats) are fully embedded in the complex numbers
discussion::
code::
Complex(1, 0) == 1;
Complex(1, 5) == Complex(1, 5);
::

method:: neg
negation of both parts
discussion::
code::
Complex(2, 9).neg
::

method:: reciprocal
the reciprocal of a complex number
discussion::
code::
Complex(3, 4).reciprocal
1 / Complex(3, 4) // same, but less efficient
::

method:: abs
the absolute value of a complex number is its magnitude.
discussion::
code::
Complex(3, 4).abs
::

method:: magnitude
distance to the origin.

method:: magnitudeApx

method:: rho
the distance to the origin.

method:: angle, phase, theta
the angle in radians.


subsection:: conversion
method:: asPoint
Convert to a link::Classes/Point::.

method:: asPolar
Convert to a Polar

method:: asInteger
real part as link::Classes/Integer::.

method:: asFloat
real part as link::Classes/Float::.

method:: asComplex
returns this


subsection:: misc
method:: coerce
method:: hash
a hash value
method:: printOn
print this on given stream
method:: performBinaryOpOnSignal
method:: performBinaryOpOnComplex
method:: performBinaryOpOnSimpleNumber
method:: performBinaryOpOnUGen




EXAMPLES::

Basic example:
code::
a = Complex(0, 1);
a * a; // returns Complex(-1, 0);
::

Julia set approximation:
code::
f = { |z| z * z + Complex(0.70176, 0.3842) };

(
var n = 80, xs = 400, ys = 400, dx = xs / n, dy = ys / n, zoom = 3, offset = -0.5;
var field = { |x| { |y| Complex(x / n + offset * zoom, y / n + offset * zoom) } ! n } ! n;

w = Window("Julia set", bounds:Rect(200, 200, xs, ys)).front;
w.view.background_(Color.black);
w.drawFunc = {
	n.do { |x|
		n.do { |y|
			var z = field[x][y];
			z = f.(z);
			field[x][y] = z;
			Pen.color = Color.gray(z.rho.linlin(-100, 100, 1, 0));
 			Pen.addRect(
				Rect(x * dx, y * dy, dx, dy)
			);
			Pen.fill
		}
	}
};

fork({ 6.do { w.refresh; 2.wait } }, AppClock)
)
::
