mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-07-06 17:44:08 +08:00
Add polar representation of complex numbers.
This commit is contained in:
@ -1,5 +1,10 @@
|
|||||||
|
import radianToDegree from '../radian/radianToDegree';
|
||||||
|
|
||||||
export default class ComplexNumber {
|
export default class ComplexNumber {
|
||||||
/**
|
/**
|
||||||
|
* z = re + im * i
|
||||||
|
* z = radius * e^(i * phase)
|
||||||
|
*
|
||||||
* @param {number} [re]
|
* @param {number} [re]
|
||||||
* @param {number} [im]
|
* @param {number} [im]
|
||||||
*/
|
*/
|
||||||
@ -70,4 +75,44 @@ export default class ComplexNumber {
|
|||||||
im: -1 * complexNumber.im,
|
im: -1 * complexNumber.im,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
getRadius() {
|
||||||
|
return Math.sqrt((this.re ** 2) + (this.im ** 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {boolean} [inRadians]
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
getPhase(inRadians = true) {
|
||||||
|
let phase = Math.atan(Math.abs(this.im) / Math.abs(this.re));
|
||||||
|
|
||||||
|
if (this.re < 0 && this.im > 0) {
|
||||||
|
phase = Math.PI - phase;
|
||||||
|
} else if (this.re < 0 && this.im < 0) {
|
||||||
|
phase = -(Math.PI - phase);
|
||||||
|
} else if (this.re > 0 && this.im < 0) {
|
||||||
|
phase = -phase;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inRadians) {
|
||||||
|
phase = radianToDegree(phase);
|
||||||
|
}
|
||||||
|
|
||||||
|
return phase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {boolean} [inRadians]
|
||||||
|
* @return {{radius: number, phase: number}}
|
||||||
|
*/
|
||||||
|
getPolarForm(inRadians = true) {
|
||||||
|
return {
|
||||||
|
radius: this.getRadius(),
|
||||||
|
phase: this.getPhase(inRadians),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,4 +110,31 @@ describe('ComplexNumber', () => {
|
|||||||
expect(complexNumber3.re).toBe(-7 / 41);
|
expect(complexNumber3.re).toBe(-7 / 41);
|
||||||
expect(complexNumber3.im).toBe(22 / 41);
|
expect(complexNumber3.im).toBe(22 / 41);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return complex number in polar form', () => {
|
||||||
|
const complexNumber1 = new ComplexNumber({ re: 3, im: 3 });
|
||||||
|
expect(complexNumber1.getPolarForm().radius).toBe(Math.sqrt((3 ** 2) + (3 ** 2)));
|
||||||
|
expect(complexNumber1.getPolarForm().phase).toBe(Math.PI / 4);
|
||||||
|
expect(complexNumber1.getPolarForm(false).phase).toBe(45);
|
||||||
|
|
||||||
|
const complexNumber2 = new ComplexNumber({ re: -3, im: 3 });
|
||||||
|
expect(complexNumber2.getPolarForm().radius).toBe(Math.sqrt((3 ** 2) + (3 ** 2)));
|
||||||
|
expect(complexNumber2.getPolarForm().phase).toBe(3 * (Math.PI / 4));
|
||||||
|
expect(complexNumber2.getPolarForm(false).phase).toBe(135);
|
||||||
|
|
||||||
|
const complexNumber3 = new ComplexNumber({ re: -3, im: -3 });
|
||||||
|
expect(complexNumber3.getPolarForm().radius).toBe(Math.sqrt((3 ** 2) + (3 ** 2)));
|
||||||
|
expect(complexNumber3.getPolarForm().phase).toBe(-3 * (Math.PI / 4));
|
||||||
|
expect(complexNumber3.getPolarForm(false).phase).toBe(-135);
|
||||||
|
|
||||||
|
const complexNumber4 = new ComplexNumber({ re: 3, im: -3 });
|
||||||
|
expect(complexNumber4.getPolarForm().radius).toBe(Math.sqrt((3 ** 2) + (3 ** 2)));
|
||||||
|
expect(complexNumber4.getPolarForm().phase).toBe(-1 * (Math.PI / 4));
|
||||||
|
expect(complexNumber4.getPolarForm(false).phase).toBe(-45);
|
||||||
|
|
||||||
|
const complexNumber5 = new ComplexNumber({ re: 5, im: 7 });
|
||||||
|
expect(complexNumber5.getPolarForm().radius).toBeCloseTo(8.60);
|
||||||
|
expect(complexNumber5.getPolarForm().phase).toBeCloseTo(0.95);
|
||||||
|
expect(complexNumber5.getPolarForm(false).phase).toBeCloseTo(54.46);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user