Python图形复刻——绘制母亲节花束

news2024/12/25 1:26:28

各位小伙伴,好久不见,今天学习用Python绘制花束。

有一种爱,不求回报,有一种情,无私奉献,这就是母爱。祝天下妈妈节日快乐,幸福永远!


图形展示:

代码展示:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap as lsc
from scipy.spatial.transform import Rotation as R
# @author : slandarer

# 生成花朵数据
t1 = np.array(range(25))/24
t2 = np.arange(0, 575.5, 0.5)/575*20*np.pi + 4*np.pi
[xr, tr] = np.meshgrid(t1, t2)
pr = (np.pi/2)*np.exp(-tr/(8*np.pi))
ur = 1 - (1 - np.mod(3.6*tr, 2*np.pi)/np.pi)**4/2 + np.sin(15*tr)/150 + np.sin(15*tr)/150
yr = 2*(xr**2 - xr)**2*np.sin(pr)
rr = ur*(xr*np.sin(pr) + yr*np.cos(pr))
hr = ur*(xr*np.cos(pr) - yr*np.sin(pr))

tb = np.resize(np.linspace(0, 2, 151), (1,151))
rb = np.resize(np.linspace(0, 1, 101), (101,1)) @ ((abs((1-np.mod(tb*5,2))))/2 + .3)/2.5
xb = rb*np.cos(tb*np.pi)
yb = rb*np.sin(tb*np.pi)
hb = np.power(-np.cos(rb*1.2*np.pi)+1, .2)

cL = np.array([[.33,.33,.69], [.68,.42,.63], [.78,.42,.57], [.96,.73,.44]])
cL = np.array([[.02,.04,.39], [.02,.06,.69], [.01,.26,.99], [.17,.69,1]])
cMpr = lsc.from_list('slandarer', cL)
cMpb = lsc.from_list('slandarer', cL*.4 + .6)

# 绕轴旋转数据点
def rT(X, Y, Z, T):
    SZ = X.shape
    XYZ = np.hstack((X.reshape(-1, 1), Y.reshape(-1, 1), Z.reshape(-1, 1)))
    RMat = R.from_euler('xyz', T, degrees = True); XYZ = RMat.apply(XYZ)
    return XYZ[:,0].reshape(SZ), XYZ[:,1].reshape(SZ), XYZ[:,2].reshape(SZ)

# 贝塞尔函数插值生成花杆并绘制
def dS(X, Y, Z):
    MN = np.where(Z == np.min(Z)); M = MN[0][0]; N = MN[1][0]
    x1 = X[M, N]; y1 = Y[M, N]; z1 = Z[M, N] + .03
    x = np.array([x1, 0, (x1*np.cos(np.pi/3) - y1*np.sin(np.pi/3))/3]).reshape((3,1))
    y = np.array([y1, 0, (y1*np.cos(np.pi/3) + x1*np.sin(np.pi/3))/3]).reshape((3,1))
    z = np.array([z1, -.7, -1.5]).reshape((3,1))
    P = np.hstack((x,y,z)).T
    t = (np.array(range(50)) + 1)/50
    c1 = np.array([1, 2, 1]).reshape(3,1)
    c2 = np.power(t, np.array(range(3)).reshape(3,1))
    c3 = np.power(1 - t, np.array(range(2, -1, -1)).reshape(3,1))
    P = (P @ (c1*c2*c3))
    ax.plot(P[0], P[1], P[2], color = '#800080')


# 创建figure窗口及axis坐标区域
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制花束
ax.plot_surface(rr*np.cos(tr), rr*np.sin(tr), hr + .35, rstride = 1, cstride = 1,
                    facecolors = cMpr(hr), antialiased = True, shade = False)
U, V, W = rT(rr*np.cos(tr), rr*np.sin(tr), hr + .35, [180/8, 0, 0]); V = V - .4
for i in range(5):
    U, V, W = rT(U, V, W, [0, 0, 72])
    ax.plot_surface(U, V, W - .1, rstride = 1, cstride = 1,
                        facecolors = cMpr(hr), antialiased = True, shade = False)
    dS(U, V, W - .1)

u1, v1, w1=rT(xb, yb, hb/2.5 + .32, [180/9, 0, 0])
v1 = v1 - 1.35
u2, v2, w2 = rT(u1, v1, w1, [0, 0, 36])
u3, v3, w3 = rT(u1, v1, w1, [0, 0, 24])
u4, v4, w4 = rT(u3, v3, w3, [0, 0, 24])
for i in range(5):
    u1, v1, w1 = rT(u1, v1, w1, [0, 0, 72])
    u2, v2, w2 = rT(u2, v2, w2, [0, 0, 72])
    u3, v3, w3 = rT(u3, v3, w3, [0, 0, 72])
    u4, v4, w4 = rT(u4, v4, w4, [0, 0, 72])
    ax.plot_surface(u1, v1, w1, rstride = 1, cstride = 1,
                        facecolors = cMpb(hb), antialiased = True, shade = False)
    ax.plot_surface(u2, v2, w2, rstride = 1, cstride = 1,
                        facecolors = cMpb(hb), antialiased = True, shade = False)
    ax.plot_surface(u3, v3, w3, rstride = 1, cstride = 1,
                        facecolors = cMpb(hb), antialiased = True, shade = False)
    ax.plot_surface(u4, v4, w4, rstride = 1, cstride = 1,
                        facecolors = cMpb(hb), antialiased = True, shade = False)
    dS(u1, v1, w1)
    dS(u2, v2, w2)
    dS(u3, v3, w3)
    dS(u4, v4, w4)

ax.set_position((-.215, -.3, 1.43, 1.43))
ax.set_box_aspect((1, 1, .8))
ax.view_init(elev = 50, azim = 2)
ax.axis('off')
plt.show()

参考文献:

作者slandarer

网址:https://mp.weixin.qq.com/s/a3QukoBQhoK46aY8ZinBrQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1660849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一定行:从零起步进入Java世界

郑重声明:本篇博客唯一目的就是带你从零起步,成功编写并运行你的第一个Java应用。 零:先给祖师爷来上柱香 Java之父简介 英文名:James Gosling中文名:詹姆斯高斯林祖籍:加拿大出生年:1955照片…

INS 论文分享:一种用于交通流预测的多通道时空Transformer模型

本文主要介绍了我们在长期交通流预测方面的最新研究成果,该成果已发表在信息学领域的顶级期刊《Information Sciences》上,论文题目为《A Multi-Channel Spatial-Temporal Transformer Model for Traffic Flow Forecasting》。该论文的第一作者及通讯作者…

Android项目转为鸿蒙,真就这么简单?

最近做了一个有关Android转换成鸿蒙的项目。经不少开发者的反馈;许多公司的业务都增加了鸿蒙板块。 对此想分享一下这个项目转换的流程结构,希望能够给大家在工作中带来一些帮助。转换流程示意图如下: 下面我就给大家介绍,Android…

Android 屏幕适配全攻略(上)-掌握屏幕单位,应对千变万化的设备

本文从 Android 开发中常见的长度单位 px、dp、sp 入手,详细介绍了它们的特点及转换关系。 接着深入探讨了屏幕尺寸、分辨率、像素密度等重要的屏幕指标,帮助读者全面理解它们之间的联系。最后,通过实例代码演示了如何在代码中进行单位转换&…

UE4\UE5 调试源代码流程(重点讲不去Github装源代码情况)

UE4\UE5 调试源代码流程 前言: 很多写UE C代码的小伙伴,肯定发现了,在虚幻源代码里面是没办法打断点进行调试的,就算走Debug调试流程,也依旧不能正常打断点调试,今天我们来分享一下不装Github源代码情况下…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数(小数)float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释(或者多行注释) …

五金建材微信小程序商城系统开发搭建指南

如今,随着移动互联网的发展,小程序成为了商家们开拓新市场、增加收益的重要途径。特别是对于五金店这类实体店铺来说,通过小程序开设线上商城,不仅可以提升品牌影响力,还能够实现线上线下的无缝对接,为店家…

二、SPI协议

文章目录 总述1.SPI接口2. SPI工作模式3. SPI通信时序4. SPI协议 对比 UART协议(上一篇文章刚介绍过uart协议,这里来对比一下) 总述 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串行通信总线&…

2024智能投影仪怎么选?大眼橙C1D,高清高亮高性价比

在这个科技飞速发展的时代,家庭智能化已经成为一种趋势。大眼橙C1D,2024年最新上市的一款智能投影仪,正以其独特的魅力,引领着智能家居的新潮流。 一、外观设计:简约而不简单 大眼橙C1D的外观设计采用了简约风格&…

pdffactory pro8.0虚拟打印机(附注册码)

PdfFactory pro是一款非常受欢迎的PDF虚拟打印机,可以帮助用户将你的其他文档保存为PDF格式。请为用户提供打印/发送/加密等多种实用功能,以及一套完善的PDF打印方案。 使用说明 下载pdfFactory Pro压缩包,解压后,双击exe文件&am…

2024数维杯A题可运行思路代码文章成品

为了能够精确地确定飞行器在三维空间中的位置,理论上至少需要从三个不同位置的发射源接收TOA数据。下面是使用TOA数据确定位置所需的计算基础和原理: 单个TOA数据: 单个TOA测量可以确定接收器与发射源之间的距离,这在三维空间中形…

error C2039: “NotifySeverity“: 不是 “osg“ 的成员 问题分析

程序从osg3.6.5Qt5.9osgearth2.10环境中移植到osg3.7.0Qt5.15.2osgearth3.3环境中,出现了无尽的错误。 有些错误很莫名奇妙,比如下述错误: D:\OsgEarth3.3\include\osgEarth\Notify(34,53): error C2039: "NotifySeverity": 不是 &…

Vue3专栏项目 -- 二、自定义From组件(下)

需求分析: 现在我们还需要一个整体的表单在单击某个按钮的时候可以循环的验证每个input的值,最后我们还需要有一个事件可以得到最后验证的结果,从而进行下一步的操作 如下,我们应该有一个form表单包裹着全部的input表单&#xf…

分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章🔥:探索设计模式的魅力:分布式模…

ICode国际青少年编程竞赛- Python-4级训练场-while语句入门

ICode国际青少年编程竞赛- Python-4级训练场-while语句入门 1、 while Flyer.disappear():wait() Dev.step(2)2、 Dev.step(1) while Flyer.disappear():wait() Dev.step(5)3、 while Flyer[0].disappear():wait() Dev.step(3) Dev.step(-1) while Flyer[0].disappear():…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络(名称随便一个) 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关,等下要用; 5.打开虚拟机,右上角,下标点…

万物生长大会 | 创邻科技再登杭州准独角兽榜单

近日,由民建中央、中国科协指导,民建浙江省委会、中国投资发展促进会联合办的第八届万物生长大会在杭州举办。 在这场创新创业领域一年一度的盛会上,杭州市创业投资协会联合微链共同发布《2024杭州独角兽&准独角兽企业榜单》。榜单显示&…

怎么用照片制作gif动图?一个网站在线做

在数字图像处理中,动态图片是我们日常生活中不可缺少的一部分。Gif动图以为器画面展示的形式,文件的体积以及兼容性而备受喜爱。通过使用多张照片制作gif动画的操作,可以让我们制作出生地有趣的gif动态效果,能够更好更快的传达信息…

谈基于ATTCK框架的攻击链溯源

引言 网络安全在当今数字化时代变得尤为关键,而MITRE公司开发的ATT&CK框架则成为了安全专业人员的重要工具。ATT&CK是一种广泛使用的攻击行为分类和描述框架。其目的在于提供一个共同的语言,使安全专业人员能够更好地理解攻击者的行为和目标&…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…