使用python画3D立体爱心
原理
1.使用python中的matplotlib库。
2.立体爱心面公式
\]
点画法(实心)
代码
import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块
#start generating points
x_lim=np.linspace(-10,10,150)
y_lim=np.linspace(-10,10,150)
z_lim=np.linspace(-10,10,150)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_points=[] #用来存放绘图点Z坐标
for x in x_lim:
for y in y_lim:
for z in z_lim:
if (x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3<=0:
X_points.append(x)
Y_points.append(y)
Z_points.append(z)
plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.scatter(X_points,Y_points,Z_points,color="red")
plt.show()
运行效果
这个画法侧面看起来很无语。
点画法(空心)
代码
import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块
#start generating points
x_lim=np.linspace(-10,10,200)
y_lim=np.linspace(-10,10,200)
z_lim=np.linspace(-10,10,200)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_tmp=[]
Z_points=[] #用来存放绘图点Z坐标
for y in y_lim:
for x in x_lim:
for z in z_lim:
k=(x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3
if k<=0 :
Z_tmp.append(z)
if y<=-0.55 or y>=0.55:
X_points.append(x)
Y_points.append(y)
Z_points.append(z)
if Z_tmp:
X_points.append(x)
Y_points.append(y)
Z_points.append(max(Z_tmp))
X_points.append(x)
Y_points.append(y)
Z_points.append(min(Z_tmp))
Z_tmp.clear()
plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.set_zlim(-1, 1)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.scatter(X_points,Y_points,Z_points)
plt.show()
运行效果
折线画法 (线团)
代码
import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块
#start generating points
x_lim=np.linspace(-10,10,150)
y_lim=np.linspace(-10,10,150)
z_lim=np.linspace(-10,10,150)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_tmp=[]
Z_points=[] #用来存放绘图点Z坐标
for y in y_lim:
for x in x_lim:
for z in z_lim:
k=(x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3
if k<=0 :
Z_tmp.append(z)
if y<=-0.55 or y>=0.55:
X_points.append(x)
Y_points.append(y)
Z_points.append(z)
if Z_tmp:
X_points.append(x)
Y_points.append(y)
Z_points.append(max(Z_tmp))
X_points.append(x)
Y_points.append(y)
Z_points.append(min(Z_tmp))
Z_tmp.clear()
plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.set_zlim(-1, 1)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.plot(X_points,Y_points,Z_points)
plt.show()
运行效果
等高线画法(线框)
代码
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
def heart_3d(x, y, z):
return (x**2+(9/4)*y**2+z**2-1)**3-x**2*z**3-(9/80)*y**2*z**3
def plot_implicit(fn, bbox=(-1.5, 1.5)):
xmin, xmax, ymin, ymax, zmin, zmax = bbox*3
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
A = np.linspace(xmin, xmax, 100) # resolution of the contour
B = np.linspace(xmin, xmax, 10) # number of slices
A1, A2 = np.meshgrid(A, A) # grid on which the contour is plotted
for z in B: # plot contours in the XY plane
X, Y = A1, A2
Z = fn(X, Y, z)
cset = ax.contour(X, Y, Z+z, [z], zdir='z', colors=('r',))
for y in B: # plot contours in the XZ plane
X, Z = A1, A2
Y = fn(X, y, Z)
cset = ax.contour(X, Y+y, Z, [y], zdir='y', colors=('red',))
for x in B: # plot contours in the YZ plane
Y, Z = A1, A2
X = fn(x, Y, Z)
cset = ax.contour(X+x, Y, Z, [x], zdir='x', colors=('red',))
# must set plot limits because the contour will likely extend
# way beyond the displayed level. Otherwise matplotlib extends the plot limits
# to encompass all values in the contour.
ax.set_zlim3d(zmin, zmax)
ax.set_xlim3d(xmin, xmax)
ax.set_ylim3d(ymin, ymax)
plt.show()
if __name__ == '__main__':
plot_implicit(heart_3d)
运行效果
这么好看所以并不是我自己写的代码。
抄的网上,出处懒得找了(自我保护)。
使用python画3D立体爱心的更多相关文章
- python 画3D的高斯曲线
用python画3D的高斯曲线,我想如果有多个峰怎么画? import numpy as npimport matplotlib.pyplot as pltimport mathimport mpl_ ...
- Python 画3D图像
绘制一副3D图像 draw3D(X,Y,Z, angle) import numpy as np from matplotlib import pyplot as plt from mpl_toolk ...
- 使用python画3D线条
"""用于验证整体趋势正确性""" #!python3 #-*- coding:utf-8 -*- import matplotlib as ...
- WPF用SkewTransform画3D柱状图
WPF用SkewTransform画3D柱状图 SkewTransform主要是对控件实现一种2-D扭曲,具体内容可以查看以下链接: http://msdn.microsoft.com/zh-cn/l ...
- 沉淀再出发:用python画各种图表
沉淀再出发:用python画各种图表 一.前言 最近需要用python来做一些统计和画图,因此做一些笔记. 二.python画各种图表 2.1.使用turtle来画图 import turtle as ...
- 用ChemDraw画3D图的方法
在绘制化学图形的时候,很多的用户都会发现很多的图形都是三维的,这个时候就需要找一款能够绘制3D图形的化学绘图软件.ChemOffice 15.1是最新的化学绘图工具套件,总共有三个组件,其中ChemD ...
- Css3动画(一) 如何画3D旋转效果或者卫星围绕旋转效果
如何画3D旋转效果或者卫星围绕旋转效果,当然这个也是工作中的一个任务,我在网上翻了一下,并没有找到类似的东西,所以写下来还是费了一番功夫,因此我把它拿出来记录一下,当然替换了一部分内容.好了,话不多说 ...
- 用python画 pareto front
用python画 pareto front 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2D pf import os import matplotlib.pyplot as plt im ...
- 用Python画如此漂亮的专业插图 ?简直So easy!
本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系我删文处理.多多转发,多多学习! 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plottin ...
- css3实现3D立体翻转效果
1.在IE下无法显示翻转效果,火狐和谷歌可以 /*样式css*/ .nav-menu li { display: inline; } .nav-menu li a { color: #fff; dis ...
随机推荐
- 89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流.RAG ...
- NOIP集训 P4137 Rmq Problem / mex 题解
前置指使:可持久化线段树 题解:P4137 Rmq Problem / mex 有一个长度为 \(n\) 的数组 \(\{ a_1,a_2,...,a_n \}\) . \(m\) 次询问,每次询问一 ...
- ORA-24247:网络访问被访问控制列表(ACL)拒绝器
我在oracle 存储过程中发送http请求, 报错如下: ORA-29273:HTTP请求失败 ORA-06512:在"SYS.UTL HTTP",line 1527 ORA-2 ...
- Stream.findFirst()代替get(0)和数组[0]获取集合中的第一个值
一.介绍 语法 集合.stream().findFirst() 使用 // 我们的工具类(切割SKU字符串relatedSkuJoin,转为集合).stream.第一个数(): CommonUtils ...
- Seata源码—6.Seata AT模式的数据源代理
大纲 1.Seata的Resource资源接口源码 2.Seata数据源连接池代理的实现源码 3.Client向Server发起注册RM的源码 4.Client向Server注册RM时的交互源码 5. ...
- Axios,fetch,ajax的区别
axios1.是一个常用的http库,可用于浏览器和nodejs的客户端:2.同时处理并发请求:3.拦截器(请求拦截器interceptors.request.响应拦截器interceptors.re ...
- 统计SqlServer数据库的表大小
create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_ ...
- java如何启动时定义并初始化一个全局变量(内存中)
前言 java如何启动时定义并初始化一个全局变量(内存中),项目启动时,通过读取配置文件来构建一个实体类对象,然后在之后可以直接使用,而不是每次使用都要进行构建 前置准备 实体类结构 package ...
- .net 实现 CQRS 的的一个设想
一.先总结一下以前的经验 本人前公司项目开发基本算是CQRS的 后台和数据接口用.net(后大部分转java),前台nodejs 数据统计用hive 但是涉及列表含模糊搜索基本都是交给站内搜索团队,他 ...
- 数栈产品分享:Kafka—实时离不开的那个TA
一.前言 随着技术不断的成熟及市场需求的日益旺盛,实时开发已经成为当前大数据开发不可或缺的一部分.在整个实时开发的链路中,数据采集需要写入到Kafka,数据处理也需要使用到Kafka.今天我们就针对K ...