📜  使用复数的几何<std::complex>在C++中|套装1(1)

📅  最后修改于: 2023-12-03 15:22:23.465000             🧑  作者: Mango

使用复数的几何std::complex在C++中|套装1

在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::realstd::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::absstd::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度得到的结果。