使用go实现复数集合图形

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
EMR Serverless StarRocks,5000CU*H 48000GB*H
可观测监控 Prometheus 版,每月50GB免费额度
简介: 【6月更文挑战第26天】本文介绍如何使用go绘制复数面曼德博集合图。提供的Go代码片段展示了判断点是否属于集合的算法,生成自相似图形。复数的接受与应用扩展到物理学等领域,成为重要工具。

简介

17世纪的瓦里士到19世纪的高斯,复数的几何表示逐渐发展,高斯在1831年详细阐述了复平面。曼德博集合,以分形特征著称,是复平面上点的集合,通过迭代( f_c(z) = z^2 + c )计算。

17世纪时,英国数学家瓦里士已经意识到在直线上不能找到虚数的几何表示。

1797年,挪威的测量学家维塞尔向丹麦科学院递交论文《方向的解析表示,特别应用于平面与球面多边形的测定》,首先提出把复数用坐标平面上的点来表示,使全体复数与平面上的点建立了一一对应关系,形成了复平面概念。但当时没有受到人们的重视。

1806年,日内瓦的阿工在巴黎发表的论文《虚量,它的几何解释》,也谈到了复数的几何表示法。他用“模”这个名词来表示向量的长度,模这术语就源出于此。

伟大的德国数学家高斯是近代数学的奠基人之一,在历史上影响之大,可以和阿基米德、牛顿、欧拉并列。
image.png

他在1799年已经知道复数的几何表示,在1799年、1815年、1816年对代数基本定理作出的三个证明中,都假定了复数和直角坐标平面上的点一一对应,到1831年他对复平面作出了详细的说明。
treeoflife6.png

1 复数对称的自相似平面图形

曼德博集合以数学家曼德博命名,它是复数平面组成分形的点的集合。 可以使用复二次多项式进行迭代计算。

    f_c(z) = z^2 + c

它最大的特点就是自相似。 对于大多数分形软件,内部已经有比较成熟的代码。

如下,我们通过判断是否处理绘画区域决定是否绘制。

  func inMandelbrot(x0 float64, y0 float64, n int) bool {
        var (
            x float64 = 0.0
            y float64 = 0.0
        )
        for n > 0 {
            xtemp := x*x - y*y + x0
            y = 2.0*x*y + y0
            x = xtemp
            n = n - 1
            if x*x+y*y > 4.0 {
                return false
            }
        }
        return true
    }

并依据规则生成图形代码

  for y >= ys {
        x := xs
        lineStr := []string{}
        for x < xe {
            n += 1
            if inMandelbrot(x, y, int(threshhold)) {
                lineStr = append(lineStr, "*")
            } else {
                lineStr = append(lineStr, ".")

            }
            x += dx
        }
        if i == 0 {
            lines := fmt.Sprintf("%v", strings.Join(lineStr, ""))
            endStr = append(endStr, lines)

        } else {
            stwo := ChangePlace(lineStr)
            lines := fmt.Sprintf("%v", strings.Join(stwo, ""))
            endStrTwo = append(endStrTwo, lines)

        }
        y -= dy
    }

最后组合成我们期望的对称图形。

image.png

3 小结

其中的算法乐趣很多,有兴趣的可以找资料来看看。

高斯的大白话:

    迄至目前为止,人们对于虚数的考虑,依然在很大的程度上把虚数归结为一个有毛病的概念,
    以致给虚数蒙上一层朦胧而神奇色彩。
  我认为只要不把+1、-1、i 叫做正一、负一和虚一,
  而称之曰向前一,反向一和侧向一,那么这层朦胧而神奇的色彩即可消失。

此后,人们才接受了复平面的思想,有些人还把复平面称为高斯平面。

利用复数的几何表示法,复数又可以用坐标平面上的向量来表示,两个复数相加可以按照向量加法的平行四边形法则来进行,一个复数乘以i(或-i)相当于表示此复数的向量逆(或顺)时针旋转90。

这就使得物理上的许多向量:力、速度、加速度等等,都可以借助于复数来进行计算,使复数成为物理学和其他自然科学的重要工具

代码路径

https://github.com/hahamx/examples/blob/main/alg_practice/0_mandebot/main.go
目录
相关文章
|
2天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1月前
|
测试技术 Go 索引
在Go中过滤范型集合:性能回顾
在Go中过滤范型集合:性能回顾
|
2月前
|
存储 Go 索引
GO 集合 map 使用总结
GO 集合 map 使用总结
30 0
|
3月前
|
Go 定位技术 索引
Go 语言Map(集合)
Go 语言Map(集合)
23 0
|
11月前
|
BI Go
Go语言复数完全攻略 复杂运算不再难!
Go语言复数完全攻略 复杂运算不再难!
214 0
|
11月前
|
存储 Go 开发者
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
46 0
|
4月前
|
存储 缓存 安全
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
|
4月前
|
Go
Go语言中,如何定义和初始化复数
Go语言中,如何定义和初始化复数
44 0
|
11月前
|
程序员 测试技术 Go
提升效率!Go语言开发者不可错过的必备工具集合!
提升效率!Go语言开发者不可错过的必备工具集合!
115 0
|
Go 索引
Go语言切片,范围,集合
1.Go 语言切片(Slice) 概述 Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
102 3