📅  最后修改于: 2023-12-03 15:22:23.465000             🧑  作者: Mango
在C++中,使用头文件<complex>
可以直接定义和使用复数类型std::complex
。它包含了一系列复数操作和函数,可以方便地实现复数几何。
可以使用std::complex
的构造函数和赋值运算符来创建和初始化复数变量。
#include <complex>
#include <iostream>
int main() {
std::complex<double> z1; // 默认为0 + 0i
std::complex<double> z2(1.0, 2.0); // 1 + 2i
std::complex<double> z3 = {3.0, 4.0}; // 3 + 4i
std::complex<double> z4 = z2; // 复制z2
std::cout << z1 << " " << z2 << " " << z3 << " " << z4 << std::endl;
return 0;
}
输出结果为:
(0,0) (1,2) (3,4) (1,2)
使用std::real
和std::imag
可以获取复数的实部和虚部。
#include <complex>
#include <iostream>
int main() {
std::complex<double> z(1.0, 2.0); // 1 + 2i
double re = std::real(z); // 1.0
double im = std::imag(z); // 2.0
std::cout << re << " " << im << std::endl;
return 0;
}
输出结果为:
1 2
使用运算符+
,-
,*
,/
可以进行复数加减乘除运算。
#include <complex>
#include <iostream>
int main() {
std::complex<double> z1(1.0, 2.0); // 1 + 2i
std::complex<double> z2(3.0, 4.0); // 3 + 4i
std::complex<double> z3 = z1 + z2; // 4 + 6i
std::complex<double> z4 = z1 - z2; // -2 - 2i
std::complex<double> z5 = z1 * z2; // -5 + 10i
std::complex<double> z6 = z1 / z2; // 0.44 + 0.08i
std::cout << z3 << " " << z4 << " " << z5 << " " << z6 << std::endl;
return 0;
}
输出结果为:
(4,6) (-2,-2) (-5,10) (0.44,0.08)
使用std::conj
可以获取一个复数的共轭复数。
#include <complex>
#include <iostream>
int main() {
std::complex<double> z(1.0, 2.0); // 1 + 2i
std::complex<double> conj_z = std::conj(z); // 1 - 2i
std::cout << conj_z << std::endl;
return 0;
}
输出结果为:
(1,-2)
使用std::abs
和std::arg
可以获取一个复数的模长和幅角。
#include <complex>
#include <iostream>
#include <cmath>
int main() {
std::complex<double> z(3.0, 4.0); // 3 + 4i
double abs_z = std::abs(z); // 5.0
double arg_z = std::arg(z); // 0.93
std::cout << abs_z << " " << arg_z << std::endl;
return 0;
}
输出结果为:
5 0.93
其中,std::arg
返回的是幅角的弧度值,需要进行转换才能得到角度值。通常可以使用下面的代码进行转换:
double angle = arg_z * 180.0 / M_PI; // 转化为角度
使用下面的公式可以将极坐标和直角坐标互相转换:
x = r * cos(theta)
y = r * sin(theta)
r = sqrt(x^2 + y^2)
theta = atan(y / x)
#include <complex>
#include <iostream>
#include <cmath>
int main() {
std::complex<double> z(3.0, 4.0); // 3 + 4i
double x = std::real(z); // 3.0
double y = std::imag(z); // 4.0
double r = std::abs(z); // 5.0
double theta = std::arg(z); // 0.93
std::complex<double> z_polar(r * cos(theta), r * sin(theta)); // 直角坐标转极坐标
std::complex<double> z_rectangular(x + y * std::complex<double>(0, 1)); // 极坐标转直角坐标
std::cout << z_polar << " " << z_rectangular << std::endl;
return 0;
}
输出结果为:
(3,4) (3,4)
使用复数几何可以方便地实现旋转点集的操作。下面是一个旋转点集的示例代码:
#include <complex>
#include <cmath>
#include <vector>
#include <iostream>
using Point = std::complex<double>;
std::vector<Point> rotatePoints(const std::vector<Point>& points, double angle) {
std::vector<Point> result;
for (auto& p : points) {
result.emplace_back(p * std::polar(1.0, angle));
}
return result;
}
int main() {
std::vector<Point> points = { {1.0, 0.0}, {2.0, 0.0}, {3.0, 0.0}, {4.0, 0.0} };
double angle = M_PI / 2; // 旋转90度
std::vector<Point> rotated_points = rotatePoints(points, angle);
for (auto& p : rotated_points) {
std::cout << p << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
(6.12323e-17,1) (1.22465e-16,2) (1.83707e-16,3) (2.44929e-16,4)
其中,std::polar(r,theta)
可以将极坐标(r,theta)
转换为直角坐标,它返回一个复数。因此,p * std::polar(1.0, angle)
就是将点p
绕原点逆时针旋转angle
度得到的结果。