python的真实感图形生成(含源码)

python的真实感图形生成(含源码),第1张

概述基于python生成真实感图形简介一、运行结果图二、python源码三、实现思路简介  本文是利用python生成一颗行星以及它周围的环带,它是由线、点构造而成的二维平面图形。一、运行结果图  源代码运行结果如下:  去掉坐标轴结果如下:二、python源码  实现以上

基于python生成真实感图形简介一、运行结果图二、python源码三、实现思路

简介

  本文是利用python生成一颗行星以及它周围的环带,它是由线、点构造而成的二维平面图形。

一、运行结果图

  源代码运行结果如下:


  去掉坐标轴结果如下:

二、python源码

  实现以上结果源码如下:

"""  本代码绘制了小行星以及它周围的环带"""import numpy as npimport matplotlib.pyplot as pltfrom math import sin, cos, radians, sqrtdef rotx(xc, yc, zc, xp, yp, zp, Rx):    g[0] = xp + xc    g[1] = yp * cos(Rx) - zp * sin(Rx) + yc    g[2] = yp * sin(Rx) + zp * cos(Rx) + zc    return gdef roty(xc, yc, zc, xp, yp, zp, Ry):    g[0] = xp * cos(Ry) + zp * sin(Ry) + xc    g[1] = yp + yc    g[2] = -xp * sin(Ry) + zp * cos(Ry) + zc    return gdef rotz(xc, yc, zc, xp, yp, zp, Rz):    g[0] = xp * cos(Rz) - yp * sin(Rz) + xc    g[1] = xp * sin(Rz) + yp * cos(Rz) + yc    g[2] = zp + zc    return gplt.axis([0,150,100,0])plt.axis('off')plt.grID(False)print('冲冲冲!!!!!')#定义参数g=[0]*3xc=80 #圆心yc=50zc=0rs=25 #球面半径lx=-1 #光线单位矢量分量ly=0lz=0IA=0 # 定义曲线IB=.8n=2Rx=radians(-20)Ry=radians(0)Rz=radians(30)# 添加背景色for x in np.arange(0,150,1):     for y in np.arange(0,100,1):          plt.scatter(x,y,color = 'mIDnightblue')#绘制球体## 横向phi1 = radians(-90)phi2 = radians(90)dhpi = radians(2)Alpha1 = radians(0)Alpha2 = radians(360)dAlpha = radians(2)for Alpha in np.arange(Alpha1,Alpha2+dAlpha,dAlpha):    for phi in np.arange(phi1,phi2+dhpi,dhpi):        xp = rs * cos(phi) * cos(Alpha)        yp = rs * sin(phi)        zp = -rs * cos(phi) * sin(Alpha)        rotx(xc, yc, zc, xp, yp, zp, Rx)        xp = g[0] - xc        yp = g[1] - yc        zp = g[2] - zc        roty(xc, yc, zc, xp, yp, zp, Ry)        xp = g[0] - xc        yp = g[1] - yc        zp = g[2] - zc        rotz(xc, yc, zc, xp, yp, zp, Rz)        xpg = g[0]        ypg = g[1]        zpg = g[2]        a = xpg - xc        b = ypg - yc        c = zpg - zc        qp = sqrt(a*a+b*b+c*c)        nx = a/qp        ny = b/qp        nz = c/qp        ndotl = nx * lx + ny * ly + nz * lz        I = IA + (IB-IA)*((1+ndotl)/2)**n        if phi == phi1:            xpglast = xpg            ypglast = ypg        if nz < 0:            plt.plot([xpglast,xpg],[ypglast,ypg],linewidth = 4,                     color = ((1-I),.8*(1-I),.45*(1-I)))            xpglast = xpg            ypglast = ypg## 纵向for phi in np.arange(phi1,phi2+dhpi,dhpi):    r = rs * cos(phi)    for Alpha in np.arange(Alpha1, Alpha2 + dAlpha, dAlpha):        xp = r * cos(Alpha)        yp = rs * sin(phi)        zp = -rs * cos(phi) * sin(Alpha)        rotx(xc, yc, zc, xp, yp, zp, Rx)        xp = g[0] - xc        yp = g[1] - yc        zp = g[2] - zc        roty(xc, yc, zc, xp, yp, zp, Ry)        xp = g[0] - xc        yp = g[1] - yc        zp = g[2] - zc        rotz(xc, yc, zc, xp, yp, zp, Rz)        xpg = g[0]        ypg = g[1]        zpg = g[2]        a = xpg - xc        b = ypg - yc        c = zpg - zc        qp = sqrt(a*a+b*b+c*c)        nx = a/qp        ny = b/qp        nz = c/qp        ndotl = nx * lx + ny * ly + nz * lz        textbfI = IA + (IB-IA)*((1+ndotl)/2)**n        if Alpha == Alpha1:            xpglast = xpg            ypglast = ypg        if nz < 0:            plt.plot([xpglast,xpg],[ypglast,ypg],linewidth = 4,                     color = ((1-I),.8*(1-I),.45*(1-I)))            xpglast = xpg            ypglast = ypg#绘制外围环形带Alpha1=radians(-10)Alpha2=radians(370)dAlpha=radians(.5)r1=rs*1.5r2=rs*2.2dr=rs*.02deltar=(r2-r1)/7 #环形带宽#旋转位于rα的环点pfor r in np.arange(r1,r2,dr):    for Alpha in np.arange(Alpha1,Alpha2,dAlpha):        xp=r*cos(Alpha)        yp=0        zp=-r*sin(Alpha)        rotx(xc,yc,zc,xp,yp,zp,Rx)        xp=g[0]-xc        yp=g[1]-yc        zp=g[2]-zc        roty(xc,yc,zc,xp,yp,zp,Ry)        xp=g[0]-xc        yp=g[1]-yc        zp=g[2]-zc        rotz(xc,yc,zc,xp,yp,zp,Rz)        xpg=g[0]        ypg=g[1]        zpg=g[2]#选择环带颜色        if r1 <= r < r1+1*deltar:            clr=(.63,.54,.18)        if r1+1*deltar <= r <= r1+2*deltar:            clr=(.78,.7,.1)        if r1+2*deltar <= r <= r1+3*deltar:            clr=(.95,.85,.1)        if r1+3*deltar <= r <= r1+4*deltar:            clr=(.87,.8,.1)        if r1+5*deltar <= r <= r1+7*deltar:            clr=(.7,.6,.2)#阴影        magu=sqrt(lx*lx+ly*ly+lz*lz)        ux=-lx/magu        uy=-ly/magu        uz=-lz/magu        vx=xc-xpg        vy=yc-ypg        vz=zc-zpg        Bx=uy*vz-uz*vy        By=uz*vx-ux*vz        Bz=ux*vy-uy*vx        magB=sqrt(Bx*Bx+By*By+Bz*Bz)        if magB < rs: #在阴影区域            if vx*lx+vy*ly+vz*lz <= 0:                clr=(.5,.5,.2)        if r1+4*deltar <= r <= r1+5*deltar:            clr='mIDnightblue'#绘制线段        if Alpha == Alpha1:            xstart=xpg            ystart=ypg        if zpg <= zc:            plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr)        if zpg >= zc:            a=xpg-xc            b=ypg-yc            c=sqrt(a*a+b*b)            if c > rs*1.075: #仅绘制环的可见部分                plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr)            xstart=xpg            ystart=ypgplt.show()
三、实现思路

  本绘制总共分为三部分:首先是定义参数,其次是绘制中心的球体,最后是绘制外围环带。
  定义参数是通过建立数学模型,借了书中的示例,对数学感兴趣可参考《python图形编程2D和3D图像的创建》这本书。
  绘制球体和外围环带有遮挡和阴影,需要消隐之类的 *** 作,这些在实现的过程中有一定难度。
  本图绘制是用线、点构成的,其中背景是用点来构成,而图形是采用线构成,前文效果展示时看不出来,但是将局部放大展示使可以很清楚的看到。这也让我更深刻的理解了“点动成线、线动成面”这句话。很棒!希望本文对学习中的您有帮助。
  局部展示图:点为背景,线为图像。

总结

以上是内存溢出为你收集整理的python的真实感图形生成(含源码)全部内容,希望文章能够帮你解决python的真实感图形生成(含源码)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1186274.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存