mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2026-03-13 08:51:02 +08:00
Fix bug with converting complex number into polar form.
This commit is contained in:
@@ -14,51 +14,63 @@ export default class ComplexNumber {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ComplexNumber} addend
|
||||
* @param {ComplexNumber|number} addend
|
||||
* @return {ComplexNumber}
|
||||
*/
|
||||
add(addend) {
|
||||
// Make sure we're dealing with complex number.
|
||||
const complexAddend = this.toComplexNumber(addend);
|
||||
|
||||
return new ComplexNumber({
|
||||
re: this.re + addend.re,
|
||||
im: this.im + addend.im,
|
||||
re: this.re + complexAddend.re,
|
||||
im: this.im + complexAddend.im,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ComplexNumber} subtrahend
|
||||
* @param {ComplexNumber|number} subtrahend
|
||||
* @return {ComplexNumber}
|
||||
*/
|
||||
subtract(subtrahend) {
|
||||
// Make sure we're dealing with complex number.
|
||||
const complexSubtrahend = this.toComplexNumber(subtrahend);
|
||||
|
||||
return new ComplexNumber({
|
||||
re: this.re - subtrahend.re,
|
||||
im: this.im - subtrahend.im,
|
||||
re: this.re - complexSubtrahend.re,
|
||||
im: this.im - complexSubtrahend.im,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ComplexNumber} multiplicand
|
||||
* @param {ComplexNumber|number} multiplicand
|
||||
* @return {ComplexNumber}
|
||||
*/
|
||||
multiply(multiplicand) {
|
||||
// Make sure we're dealing with complex number.
|
||||
const complexMultiplicand = this.toComplexNumber(multiplicand);
|
||||
|
||||
return new ComplexNumber({
|
||||
re: this.re * multiplicand.re - this.im * multiplicand.im,
|
||||
im: this.re * multiplicand.im + this.im * multiplicand.re,
|
||||
re: this.re * complexMultiplicand.re - this.im * complexMultiplicand.im,
|
||||
im: this.re * complexMultiplicand.im + this.im * complexMultiplicand.re,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ComplexNumber} divider
|
||||
* @param {ComplexNumber|number} divider
|
||||
* @return {ComplexNumber}
|
||||
*/
|
||||
divide(divider) {
|
||||
// Make sure we're dealing with complex number.
|
||||
const complexDivider = this.toComplexNumber(divider);
|
||||
|
||||
// Get divider conjugate.
|
||||
const dividerConjugate = this.conjugate(divider);
|
||||
const dividerConjugate = this.conjugate(complexDivider);
|
||||
|
||||
// Multiply dividend by divider's conjugate.
|
||||
const finalDivident = this.multiply(dividerConjugate);
|
||||
|
||||
// Calculating final divider using formula (a + bi)(a − bi) = a^2 + b^2
|
||||
const finalDivider = (divider.re ** 2) + (divider.im ** 2);
|
||||
const finalDivider = (complexDivider.re ** 2) + (complexDivider.im ** 2);
|
||||
|
||||
return new ComplexNumber({
|
||||
re: finalDivident.re / finalDivider,
|
||||
@@ -67,9 +79,12 @@ export default class ComplexNumber {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ComplexNumber} complexNumber
|
||||
* @param {ComplexNumber|number} number
|
||||
*/
|
||||
conjugate(complexNumber) {
|
||||
conjugate(number) {
|
||||
// Make sure we're dealing with complex number.
|
||||
const complexNumber = this.toComplexNumber(number);
|
||||
|
||||
return new ComplexNumber({
|
||||
re: complexNumber.re,
|
||||
im: -1 * complexNumber.im,
|
||||
@@ -96,6 +111,18 @@ export default class ComplexNumber {
|
||||
phase = -(Math.PI - phase);
|
||||
} else if (this.re > 0 && this.im < 0) {
|
||||
phase = -phase;
|
||||
} else if (this.re === 0 && this.im > 0) {
|
||||
phase = Math.PI / 2;
|
||||
} else if (this.re === 0 && this.im < 0) {
|
||||
phase = -Math.PI / 2;
|
||||
} else if (this.re < 0 && this.im === 0) {
|
||||
phase = Math.PI;
|
||||
} else if (this.re > 0 && this.im === 0) {
|
||||
phase = 0;
|
||||
} else if (this.re === 0 && this.im === 0) {
|
||||
// More correctly would be to set 'indeterminate'.
|
||||
// But just for simplicity reasons let's set zero.
|
||||
phase = 0;
|
||||
}
|
||||
|
||||
if (!inRadians) {
|
||||
@@ -115,4 +142,19 @@ export default class ComplexNumber {
|
||||
phase: this.getPhase(inRadians),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert real numbers to complex number.
|
||||
* In case if complex number is provided then lefts it as is.
|
||||
*
|
||||
* @param {ComplexNumber|number} number
|
||||
* @return {ComplexNumber}
|
||||
*/
|
||||
toComplexNumber(number) {
|
||||
if (number instanceof ComplexNumber) {
|
||||
return number;
|
||||
}
|
||||
|
||||
return new ComplexNumber({ re: number });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user