在 C++ 中使用复数 <std::complex> 进行几何运算 集合 1(Geometry using Complex Numbers <std::complex> in C++ | Set1)

下面文章中有些公式无法文字表示,在公式文字描述后会有截图,请看截图部分。

        在解决几何问题时,定义点类来指定二维平面或欧几里得平面上的点非常耗时。因此,本文介绍了一种更快、更巧妙的方法,使用 C++ 中 STL 中的复杂类来实现该点。
在实现之前,必须了解什么是复数以及它们如何帮助表示二维平面上的点。

什么是复数?

复数的形式为

a + bi
其中,a 是实部,
b 是虚部 

    从图中可以看出,复数可以在 2D 平面上表示。因此,对于点 (a, b),我们可以得到复数 a + bi,其中 a 是 X 坐标,b 是 Y 坐标。

重要提示: i 2 = -1 

    复数的极坐标形式:可视化和表示复数的另一种方法是极坐标形式。极坐标形式使用复数的幅值(形式为“r”)和复数的方向(形式为“θ”)。

具有这些参数的复数为 r(cosθ + isinθ)。

注意:θ 被视为弧度。
re iθ = r(cosθ + isinθ)

 

复数的共轭:
如果 z = a + bi,则 z 的共轭为 z' = a – bi。

如果 z = (r, θ),则 z 的共轭为 z' = (r, -θ)

复数的共轭可用于实现某些特殊属性,如下所示:

z + z' = (a + bi) + (a – bi) = 2a

实部 = (复数 + 共轭)/2

z – z' = (a + bi) – (a – bi) = 2b

虚部 = (复数 – 共轭)/2

z*z' = (a + bi) * (a – bi) = a2 – b2i2 + 2abi – 2abi = a2 + b2

量级2 = 复数 * 共轭

如何使用复数?

让我们考虑欧几里得平面上的点 P (a, b)。现在我们设复数 z = a + bi,并得出两者之间的等价性。与 P 相关的一些属性是:

P 的 X 坐标:我们可以简单地说 X 坐标 = a。因此,返回 z 的实部。

P 的 Y 坐标:我们可以简单地说 Y 坐标 = b。因此,返回 z 的虚部。

P 距离原点 (0, 0) 的距离: P 距离原点的距离 = sqrt((a-0) 2 + (b-0) 2 ) = sqrt(a 2 + b 2 )

z 的大小 = sqrt(a 2 + b 2 )

从而返回 z 的大小。

OP 与 X 轴所成的角度,其中 O 是原点: OP 与 X 轴所成的角度 = tan -1 (b/a)

参数,即 z 的参数 theta 可按如下方式推导出来:
rcosθ = a ..... (i)
rsinθ = b ..... (ii)

将 (ii) 除以 (i)
tanθ = (b/a)

θ = tan -1 (b/a)

从而返回 z 的参数。

P 绕原点旋转:点绕原点旋转不会改变其与原点的距离,而只会改变 PO 与 X 轴的角度。

因此,如果我们以极坐标形式考虑复数,则可以更好地理解旋转等价性。
z = re iθ

让该点沿逆时针方向旋转“α”。

该点现在变为 re i(θ + α) = re iθ * 1e iα = z * 1e iα

因此,返回 z * polar(1, α)。

其中,polar(r, θ) 是一般表示。

让我们考虑欧几里得平面上的点 P (a, b) 和 Q (c, d)。这些点基本上可以被视为向量,其长度等于与原点的距离和与 X 轴的方向。(如果将点视为向量,则可以更好地理解许多属性,这是各种几何算法中的关键思想之一)。

现在让我们考虑 z1 = a + bi 和 z2 = c + di。

与 P 和 Q 相关的一些属性是:

1、向量加法:
(a, b) + (c, d) = (a + c, b + d) 

z1 + z2 = (a + bi) + (c + di) = (a + c) + (b + d)i

因此返回 z1 + z2。

2、向量减法:简单返回

z1 – z2

3、直线 PQ 的斜率:

z2 – z1 给出仰角

因此,直线 PQ 的斜率由仰角的正切给出。

因此,返回 z2 – z1 的参数的正切。

4、欧几里得距离:
P 与 Q 的距离 = sqrt((ac) 2 + (bd) 2 ) 

z1 – z2 的大小 = sqrt((ac) 2 + (bd) 2 )

因此,返回 z1 – z2 的大小。

几何问题中经常用到的一个重要构造是 z1'z2。

让我们计算一下:
z1' = a – bi 

z1'z2 = (a – bi)*(c + di) = ac + adi – bci + bd = (ac + bd) + (ad – bc)i

5、点积:向量 P 和 Q 的点积是
(ac + bd)
这与上面构造的实部相同。因此,返回 z1'z2 的实部。

6、叉积:向量 P 和 Q 的叉积的大小为

(ad – bc)

这与上面构造的虚部相同。因此,返回 z1'z2 的虚部。

复杂类的实现部分在第 2 集 :https://blog.csdn.net/hefeng_aspnet/article/details/141318546

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值