1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
Polar : Number {
var <>rho, <>theta;
*new { arg rho, theta;
^super.newCopyArgs(rho, theta)
}
magnitude { ^rho }
angle { ^theta }
phase { ^theta }
real { ^rho * cos(theta) }
imag { ^rho * sin(theta) }
asPolar { ^this }
asComplex { ^Complex.new(this.real, this.imag) }
asPoint { ^Point.new(this.real, this.imag) }
scale { arg scale;
^Polar.new(rho * scale, theta)
}
rotate { arg angle; // in radians
^Polar.new(rho, theta + angle)
}
// do math as Complex
+ { arg aNumber; ^this.asComplex + aNumber }
- { arg aNumber; ^this.asComplex - aNumber }
* { arg aNumber; ^this.asComplex * aNumber }
/ { arg aNumber; ^this.asComplex / aNumber }
== { arg aPolar;
^aPolar respondsTo: #[\rho, \theta] and: {
rho == aPolar.rho and: { theta == aPolar.theta }
}
}
hash {
^rho.hash bitXor: theta.hash
}
neg { ^Polar.new(rho, theta + pi) }
performBinaryOpOnSomething { |aSelector, thing, adverb|
^thing.asComplex.perform(aSelector, this, adverb)
}
performBinaryOpOnUGen { arg aSelector, aUGen;
^Complex.new(
BinaryOpUGen.new(aSelector, aUGen, this.real),
BinaryOpUGen.new(aSelector, aUGen, this.imag)
);
}
printOn { arg stream;
stream << "Polar( " << rho << ", " << theta << " )";
}
storeArgs { ^[rho,theta] }
}
|