3.1.问题描述

  在数学世界中有一些美丽的曲线图形,有螺旋线、摆线、双纽线、蔓叶线且、心脏线、渐开线、玫瑰曲线、蝴蝶曲线…… 这些形状各异、简有繁别的数学曲线图形为看似枯燥的数学公式披上精彩纷呈的美丽衣裳。

  在数学曲线的百花园中,玫瑰曲线算得上个中翘楚,它的数学方程简单,曲线变化众多,根据参数的变化能展现出姿态万千的优美形状。玫瑰曲线可用极坐标方程表示为

图一、三叶玫瑰曲线

ρ=a∗sinθ
  也可以用参数方方程表示为
{x=a∗sinnθ∗cosθy=a∗sinnθ∗sinθ
  其中,参数a控制叶子的长度;参数n控制叶子的数量,并影响曲线闭合周期。 当n为奇数时,玫瑰曲线的叶子数为n,闭合周期为 π,即参数 的取值范围为0~π ,才能使玫瑰曲线闭合为完整形图。当n为偶数时,玫瑰曲线的叶子数为2n,,闭合周期为 2π ,即参数 的取值范围为0~2π,如图所示,这是方程 ρ=a∗sinθ对应的三叶玫瑰曲线图形。
  请编写程序,在海龟绘图窗口 中绘制一幅三叶玫瑰曲线的图形。
  

3.2.问题描述

  在数学世界中,像玫瑰曲线这样美丽的曲线图形实际上是由简单的函数关系生成的。通过利用曲线函数的参数方程,可以在平面直角坐标系中方便地绘制出它们的图形。

  假如要利用玫瑰曲线的参数方程绘制三叶玫瑰曲线,则参数n的值可以设定为3,参数a的值可以设定叶子的长度(如 100)。因为参数 n=3 是奇数,所以三叶玫瑰曲线的闭合周期为π。 只要将参数 θ从0变化到 π,就能利用玫瑰曲线的参数方程求出平面内的一系列连续的点的坐标(x,y),由此可构成三叶玫瑰曲线的图形。

  绘制玫瑰曲线的编程思路: 在一个循环结构中让参数 θ从 0 变化到π,再利用玫瑰曲线的参数方程求出点坐标x和y的值,并通过海龟绘图库绘制一系列连续的点,最终绘制出一个完整的玫瑰曲线图。

3.3.编程解题

  根据上述算法分析中给出的编程思路,编程绘制玫瑰曲线的图形。这个案例需要用到海龟绘图的知识.,请回顾上一节介绍的海龟绘图方法。

  首先我们来看Python的代码:

 1 '''
2 程序:绘制玫瑰曲线
3 作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 '''
6 from turtle import *
7 from math import *
8
9 def draw(a, n, end):
10 '''绘制玫瑰曲线'''
11 t = 0
12 while t <= end:
13 x = a * sin(n * t) * cos(t)
14 y = a * sin(n * t) * sin(t)
15 goto(x, y)
16 t = t + 0.01
17
18 if __name__ == '__main__':
19 '''三叶玫瑰'''
20 draw(100, 3, 3.14)
21 '''六叶玫瑰'''
22 #draw(100, 1.5, 12.56)

  在上面的代码中可以看出,Python除了要导入海龟绘图库外,还要导入数学库,因为玫瑰曲线函数中涉及三角函数,需要用到 Python 内置的数学库。

  用于绘制玫瑰曲线的 draw()函数有3个参数,其中参数变量 a 表示叶子的长度,参数变量 n 表示叶子的数量,参数变量 end 表示曲线闭合周期。

  在函数体中,通过 while 循环结构画出一系列连续的点,循环变量为t,循环控制条件为 t <= end,即在从 0 到 end 的范围内绘制一个闭合的玫瑰曲线。

  在循环体中,使用玫瑰曲线的参数方程求出点坐标 x 和 y 的值,再利用海龟绘图库提供的 goto(x,y)函数定位画笔就能绘制出相应的图形。 为了绘制出平滑的曲线,循环变量t每次以0.01 的幅度增加。

  上面代码中的main函数中“三页玫瑰”的代码调用 draw()绘制出一个叶子长度为 100 的三叶玫瑰曲线。由于叶子数3是奇数,所以闭合周期为π ,这里选取 3.14 即可。它绘出的图形如下:

  然而“六叶玫瑰”的参数n=1.5,end=12.56,这又是怎么得来的呢?下面我们来讨论玫瑰线参数的特性。

  当在整数范围内讨论参数n时,玫瑰曲线的参数特性:若n为奇数,则玫瑰曲线n个叶子数,闭合周期为π,即θ取值为0~ π;若n为偶数,玫瑰曲线2n个叶子数,闭合周期为2π ,即θ取值为 0~2π。

  当在有理数范围内讨论参数n时,可利用公式  确定玫瑰曲线的叶子数和闭合周期。n为非整数的有理数,L/W为简约分数,参数L控制叶子数,参数W控制闭合周期。玫瑰曲线的参数特性:当参数L和W仅有一个是偶数时,则闭合周期为2Wπ,叶子数为2L;当参数L和W都是奇数时,则闭合周期为Wπ ,叶子数为L。

在下图中展示的是玫瑰曲线 7 代图谱,位于顶端的数字表示参数 L 的值,位于左端的数字表示参数W 的值,通过选择 L 和W 的值,就能确定玫瑰曲线的图形。

  所以,当 L=3、W=2 时,则n=1.5,闭合周期为 2Wπ  =12.56。 根据这两个参数就可以绘制出六叶玫瑰曲线图形。如下图:

  好了,我们已经知道了绘制玫瑰曲线的原理,转换为Julia语言来实现相比也不困难。

  当然还是要请出Julia的海龟绘图库Luxor,在上一节中已有介绍。不过,笔者在Luxor中没有找到类似Python海龟绘图库turtle中的goto()函数,所以只能自主实现了自定义函数Goto()。

  完整代码如下:

 1 """
2 程序:Julia绘制玫瑰曲线
3 Python原作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 """
6
7 using Luxor
8
9 #实现海龟画线,从原坐标点到目标坐标点
10 function Goto(t::Turtle,p::Point)
11 oldx, oldy = t.xpos, t.ypos
12 t.xpos=p.x
13 t.ypos=p.y
14 if t.pendown
15 gsave()
16 sethue(t.pencolor...)
17 line(Point(oldx, oldy), Point(t.xpos, t.ypos), :stroke)
18 grestore()
19 end
20 end
21
22 #绘制玫瑰曲线'''
23 function draw(t::Turtle,a, n, stop)
24 s = 0
25 while s <= stop
26 x = a * sin(n * s) * cos(s)
27 y = a * sin(n * s) * sin(s)
28 Goto(t,Point(x,y))
29 s = s + 0.01
30 end
31 end
32 function main()
33 Drawing(300, 300, "mgqx.svg")
34 origin()
35 turtle=Turtle()
36 #三叶玫瑰曲线
37 draw(turtle,100, 3, 3.14)
38 finish()
39 end
40 main()

绘制的三叶玫瑰图如下:

  可以发现,上图与Python绘制的三叶玫瑰曲线上下颠倒了,当然这关系不大,只能说明Luxor的海龟与Python的turtle移动方向是相反的。

  • 扩展阅读

在用海龟绘图库实现绘制玫瑰曲线之后,我们并不打算就此停步。因为原书作者是用参数方方程作为编程的数学模型:

{x=a∗sinnθ∗cosθy=a∗sinnθ∗sinθ

而我们打算回归玫瑰曲线的极坐标方程:

ρ=a∗sinθ

  而且,无论是Python还是Julia都有丰富的科学计算和数据可视化绘图库,相比于海龟绘图库更加高效。因此我们用极坐标方程作为数学模型,并采用其它可视化库来看看如何绘制玫瑰曲线。

  经过这么些年的发展,Julia的绘图库也日渐丰富,比较常用的有Gadfly, Plots, PyPlot库等,大家可以在下面的网址查看这些库的说明:https://juliapackages.com/c/graphics

  本文选用PyPlot.jl库来实现绘制玫瑰曲线。PyPlot库实际上是一个经典的Python绘图库Matplotlib的一个模块,PyPlot.jl提供了一个接口用于调用Matplotlib.PyPlot模块,所以在使用它之前需要先安装matplotlib:

  方法一,使用pip安装matplotlib

  pip install matplotlib

  方法二,使用pip安装光速安装matplotlib如果安装太慢,可替换国内的下载源

  pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

  然后我们用之前介绍的Julia的库安装方法来安装PyPlot.jl库,或者直接在Julia终端环境输入using PyPlot,然后根据提示操作即可。

所谓玫瑰曲线就是在平面内,围绕某一中心点平均分布整数个正弦花瓣的曲线,在极坐标下可表示为ρ=a*sin(nθ),a为定长,n为整数,来看完整代码:

 1 using PyPlot
2 function draw()
3 theta=0:0.01:2*pi
4 #上面返回一个array对象,其元素从0-2*pi,步长0.01
5 subplot(111,polar=true) #设置为极坐标模式
6 #6瓣花瓣
7 plot(theta,sin.(6*theta),linewidth=2.0, linestyle="-")
8 #5瓣花瓣
9 plot(theta,sin.(5*theta),linewidth=2.0, linestyle="--")
10 #4瓣花瓣
11 plot(theta,2*sin.(4*theta),linewidth=2)
12 rgrids((0.5:0.5:2),angle=45) #网格线
13 thetagrids([0,45,90])#角度值
14 show()
15 end
16 draw()

运行后,会打开一个图形窗口,显示所画的图形:

怎么样,是不是很漂亮!

对比python学julia(第二章)--(第三节)玫瑰曲线—数学之美的更多相关文章

  1. 《零压力学Python》 之 第二章知识点归纳

    第二章(数字)知识点归纳 要生成非常大的数字,最简单的办法是使用幂运算符,它由两个星号( ** )组成. 如: 在Python中,整数是绝对精确的,这意味着不管它多大,加上1后都将得到一个新的值.你将 ...

  2. 路飞学城-Python爬虫集训-第二章

    本次爬虫集训的第二次作业是web微信. 先贴一下任务: 作业中使用到了Flask. Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模 ...

  3. 《python可以这样学》第二章

    Python序列 列表与列表推导式 列表创建与删除 创建列表对象 >>> a_list = list((3, 5, 7, 9, 11)) >>> a_list = ...

  4. Python开发【第二章】:Python模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

  5. python基础教程-第二章-列表和元组

    本章将引入一个新的概念,:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在 一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在python中,最基本的数据结构 ...

  6. Python开发【第二章】:模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

  7. python学习心得第二章

    python基础 1.关于python编码的问题. python的编码现在主要是两种版本python2.7和python3.5 python2.7默认的是ascii码进行编译,我们可以采用 # -*- ...

  8. Python开发【第二章】:Python深浅拷贝剖析

    Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...

  9. Python开发【第二章】:Python的数据类型

    基本数据类型 一.整型 如: 18.73.84 整型具备如下功能: class int(object): """ int(x=0) -> int or long i ...

  10. Python之旅.第二章数据类型 3.19/3.20/3.21/3.22/3.23

    一.数字类型 1.int类型: 基本使用: 用途:用于年龄,手机号,身份证号: 定义: age=18: 常用操作+内置方法: 正常的运算赋值: 进制转换: print(bin(3)); 把十进制3转换 ...

随机推荐

  1. jquery的绑定和删除

            // 基本语法形式 $().on( 事件类型 , 事件处理函数 )         // 删除事件处理函数         // 必须绑定的是 函数名称 才能删除 绑定的事件处理函数 ...

  2. Manim使用心得

    Manim 使用心得 manim 做视频还是挺方便的. 当然,如果你每一次都从 0 开始写,那么你会崩溃. 所以需要找到自己做视频的风格,以此总结出一套通用的 python 模板代码,然后调用. 例如 ...

  3. Kettle调优教程(推荐收藏)

    1.调整JVM大小 linux文件路径:data-integration/spoon.sh windows路径: -Xms1024m:设置JVM初始内存为1024m.此值可以设置与-Xmx相同,以避免 ...

  4. WPS WORD EXCEL 不合并显示

    WPS WORD EXCEL 不合并显示 版本:WPS 12 , 下载时间约是2023 年. 1.在开始菜单里找到 WPS OFFICE - 配置工具 2.点击"高级(A)". 3 ...

  5. Docker入门系列之四:Docker镜像

    在本文中,您将学习如何加快Docker构建周期并创建轻量级镜像.遵循之前的文章中的食物隐喻,我们将沙拉隐喻为Docker镜像,同时减少Docker镜像的数量. 在本系列的第3部分中,我们介绍了十几个D ...

  6. restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法

    restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法 1.JSONObject可以通用数据的灵活性,类似Map数据,数据字段不清晰.具体返 ...

  7. iOS:长图切割并转为动画gif——精灵表单sprite Sheet的转化

    iOS:长图切割并转为动画gif--精灵表单sprite Sheet的转化 通常的,iOS显示gif可以将文件转为NSData后再对其进行解析,通过CADisplayLink逐帧进行提取.播放,判断N ...

  8. python基础-入门必备知识

    1 标识符 标识符是编程时使用的名字,用于给变量.函数.语句块等命名,Python 中标识符由字母.数字.下划线组成,不能以数字开头,区分大小写. 以下划线开头的标识符有特殊含义,单下划线开头的标识符 ...

  9. Linux系统基本介绍

    一.Linux系统基本介绍 [1].Linux操作系统特点 多任务的操作系统 多任务操作系统 严格区分大小写 Linux一切皆文件 所有文件的起点都是"/"根目录 对于Linux操 ...

  10. 从零开始带你上手体验Sermant自定义插件开发

    本文分享自华为云社区<Sermant自定义插件开发上手体验>,作者:华为云开源. 一.研究缘由 由于目前我们所处的行业是汽车行业,项目上进行云服务的迁移时使用到了Sermant中的相关插件 ...