📜  C++中使用复数的几何套装2(1)

📅  最后修改于: 2023-12-03 14:39:56.428000             🧑  作者: Mango

C++中使用复数的几何套装2

在计算机图形学和计算几何学中,使用复数可以方便地进行向量和点的表示,从而简化计算。本文将介绍如何在C++中使用复数的几何套装2,包括定义点、向量,计算叉积、点积、向量模长等操作。

定义点和向量

在C++中,我们可以使用std::complex来表示一个复数,从而表示一个点或向量。在定义一个复数时,我们可以将其实部和虚部分别表示点或向量在x轴和y轴上的坐标。

#include <complex>

typedef std::complex<double> point; // 点
typedef std::complex<double> vector; // 向量

std::complex提供了丰富的运算符,可以方便地进行加减乘除、求模、求共轭等操作。此外,它也提供了一些常量,如单位复数1.0i,可以用来表示x轴或y轴方向的单位向量。

point p(1.0, 2.0); // 定义一个点
vector v(3.0, 4.0); // 定义一个向量

p.real(); // 获取点p的x坐标
p.imag(); // 获取点p的y坐标

v.real(); // 获取向量v的x分量
v.imag(); // 获取向量v的y分量

p + v; // 点p加上向量v,得到一个新的点

v * 2.0; // 向量v乘以一个标量2.0,得到一个新的向量

abs(v); // 求向量v的模长

conj(v); // 求向量v的共轭

1.0i; // 单位向量,代表y轴正方向
计算叉积和点积

在计算几何中,我们经常需要计算两个向量的叉积和点积。对于两个向量$a=(a_x,a_y)$和$b=(b_x,b_y)$,它们的叉积定义为: $$ a \times b = a_x \cdot b_y - a_y \cdot b_x $$ 而它们的点积定义为: $$ a \cdot b = a_x \cdot b_x + a_y \cdot b_y $$

我们可以使用std::conjoperator*代替叉积和点积的公式。具体来说,两个向量的叉积和点积分别等于一个向量乘以另一个向量的共轭和实部,即:

double cross_product(const vector& a, const vector& b) {
    return std::imag(std::conj(a) * b);
}

double dot_product(const vector& a, const vector& b) {
    return std::real(std::conj(a) * b);
}
计算向量与直线的关系

在计算几何中,我们经常需要计算向量与直线的关系,包括判断一个点是否在直线上,求点到直线的距离等问题。

对于一条直线$l$,我们可以用一个点$p_0$表示它的位置,用一个向量$v$表示它的方向。一般地,$l$的表示形式为: $$ l={p_0+tv|t \in \mathbb{R}} $$

对于一个点$p$,它在直线上当且仅当向量$\overrightarrow{p_0p}$和$v$共线,即$\overrightarrow{p_0p}$和$v$的叉积为0。

对于一个点$p$到直线$l$的距离,我们可以将$\overrightarrow{p_0p}$投影在$v$上,得到它在$v$方向上的长度$d$,即: $$ d=\frac{\overrightarrow{p_0p} \cdot v}{|v|} $$

最后,我们还可以使用叉积的绝对值求出三角形$|p_0p\overrightarrow{p_0p}|$的面积$S$,从而得到它到直线$l$的距离$d$,即: $$ d=\frac{S}{|v|} $$

double distance_to_line(const point& p, const point& p0, const vector& v) {
    return std::abs(cross_product(p - p0, v)) / abs(v);
}

bool is_on_line(const point& p, const point& p0, const vector& v) {
    return std::abs(cross_product(p - p0, v)) < EPS;
}

const double EPS = 1e-6; // 精度偏差

point p(1.0, 2.0); // 定义一个点
point p0(0.0, 0.0); // 定义直线上的一个点
vector v(1.0, 1.0); // 定义直线的方向

distance_to_line(p, p0, v); // 计算点p到直线的距离
is_on_line(p, p0, v); // 判断点p是否在直线上
总结

本文介绍了在C++中使用复数的几何套装2,包括定义点、向量,计算叉积、点积、向量模长等操作,还讨论了向量与直线的关系,包括点是否在直线上和点到直线的距离计算。这些操作可以方便地使用复数进行坐标和向量的表示和计算,从而简化计算几何和计算机图形学中的问题。