日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

60几行代码绘制丘比特爱情之箭!

發布時間:2024/1/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 60几行代码绘制丘比特爱情之箭! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【CSDN 編者按】七夕是中國民間的傳統節日,不同時代、不同地域的人們給這個節日賦予了不同的含義。在漫長的演變過程中,七夕成了牛郎織女相會的日子。正因為這個美麗的愛情傳說,七夕被視為中國最具浪漫色彩的、象征愛情的節日。在西風東漸的背景下,七夕又成了中國的“情人節”。

作者 | 許向武? ? ? ?責編 | 張紅月

出品 | CSDN(ID:CSDNnews)

既然是情人節,浪漫的程序員總喜歡搞點花樣出來,為緊張且平淡的生活添點色彩。今天給各位帶來的是3D動畫版的丘比特愛情之箭:一只金色的丘比特愛情之箭以慢鏡頭方式緩緩刺中一個脈動的紅心,紅心的主人將會無法控制地愛上TA所看到第一個人。

我猜,當初牛郎和織女一定是被丘比特的愛情之箭射中以后才相愛的,畢竟,他們都生活的天上——西方文化中,木星(Jupiter)就是小愛神丘比特,金星(Venus)則是大愛神維納斯。

在丘比特的出場愛情之箭前,先用matplotlib繪制一個2D的紅心熱熱身。

import numpy as np import matplotlib.pyplot as pltx = np.linspace(-np.pi/2, np.pi/2, 1000) y1 = np.power(np.cos(x),0.5) * np.cos(200*x) + np.power(np.absolute(x),0.5) - 0.7 y2 = np.power(4-np.power(x, 2), 0.01)plt.plot(x, y1*y2, c='r') plt.show()

上下波動的曲線形成的心形

放大一點看的話,就會發現上面這個紅心其實是一條連續上下波動的曲線。下面的紅心,是一個真正封閉的心形,只不過是由四條曲線首尾相連組成的。

import numpy as np import matplotlib.pyplot as pltx1 = np.linspace(0, 2, 300) x2 = np.linspace(0, -2, 300)y11 = (np.power(x1, 2/3) + np.power(np.power(x1, 4/3)-4*np.power(x1, 2)+4, 0.5))/2 - 0.12 y12 = (np.power(x1, 2/3) - np.power(np.power(x1, 4/3)-4*np.power(x1, 2)+4, 0.5))/2 y21 = (np.power(-x2, 2/3) + np.power(np.power(-x2, 4/3)-4*np.power(-x2, 2)+4, 0.5))/2 - 0.12 y22 = (np.power(-x2, 2/3) - np.power(np.power(-x2, 4/3)-4*np.power(-x2, 2)+4, 0.5))/2plt.plot(x1, y11, c='r') plt.plot(x1, y12, c='r') plt.plot(x2, y21, c='r') plt.plot(x2, y22, c='r') plt.show()

四條曲線首尾相連組成的心形

那么,可用用一筆畫一個心形嗎?當然可以,極坐標方程 r = Arccos(sinθ)就是一條心形線,只是形狀不夠完美而已。

import numpy as np import matplotlib.pyplot as plttheta = np.linspace(0, 2*np.pi, 1000) x = np.arccos(np.sin(theta)) * np.cos(theta) y = np.arccos(np.sin(theta)) * np.sin(theta)plt.plot(x, y, c='r') plt.show()

心形線

是時候展示3D版的紅心了。運行下面的代碼,除了需要numpy模塊,還需要安裝wxgl模塊——基于PyOpenGL的三維數據繪圖工具包。

pip install wxgl

關于wxgl模塊的更多詳情,請點擊十分鐘玩轉3D繪圖:WxGL完全手冊,這里是中文文檔。

下面是3D版的紅心的繪制代碼:

import numpy as np import wxgl.glplot as glta = np.linspace(0, 2*np.pi, 500) b = np.linspace(0.5*np.pi, -0.5*np.pi, 500) lons, lats = np.meshgrid(a, b) w = np.sqrt(np.abs(a - np.pi)) * 2 x = 2 * np.cos(lats) * np.sin(lons) * w y = -2 * np.cos(lats) * np.cos(lons) * w z = 2 * np.sin(lats)glt.mesh(x, y, z, color='crimson') # crimson - 緋紅 glt.show()

是不是很簡單?wxgl的使用風格幾乎和matplotlib完全一致。拖動鼠標,就可以看到這個3D版的紅心的前后左右了。

3D紅心

接下來,這段代碼將紅心數據的生成封裝了一個函數,然后調用自定義的模型變換函數,這顆紅心就跳動起來了。

import numpy as np import wxgl.glplot as gltdef red_heart(r, slices=100, thick=2.0, shift=(0,0,0)):"""返回紅心頂點數據"""a = np.linspace(0, 2*np.pi, slices)b = np.linspace(0.5*np.pi, -0.5*np.pi, slices)lons, lats = np.meshgrid(a, b)w = np.sqrt(np.abs(a - np.pi)) * thickx = r * np.cos(lats) * np.sin(lons) * w + shift[0]y = -r * np.cos(lats) * np.cos(lons) * w + shift[1]z = r * np.sin(lats) + shift[2]return x, y, zdef heart_beat(t):"""心跳函數"""t %= 1000if t < 300:scale = 1 + t/3000elif t > 700:scale = 1 + (1000-t)/3000else:scale = 1.1return (scale,)glt.mesh(*red_heart(2), color='crimson', transform=heart_beat) glt.show()

點擊左側工具條上的播放按鈕,這顆紅心就會按照60次/秒的心率跳動起來。熟悉了wxgl的使用,不難讀懂下面這個完整的丘比特愛情之箭的代碼。

import numpy as np import wxgl import wxgl.glplot as gltdef red_heart(r, slices=100, thick=2.0, shift=(0,0,0)):"""返回紅心頂點數據"""a = np.linspace(0, 2*np.pi, slices)b = np.linspace(0.5*np.pi, -0.5*np.pi, slices)lons, lats = np.meshgrid(a, b)w = np.sqrt(np.abs(a - np.pi)) * thickx = r * np.cos(lats) * np.sin(lons) * w + shift[0]y = -r * np.cos(lats) * np.cos(lons) * w + shift[1]z = r * np.sin(lats) + shift[2]return x, y, zdef heart_beat(t):"""心跳函數"""t %= 1000if t < 300:scale = 1 + t/3000elif t > 700:scale = 1 + (1000-t)/3000else:scale = 1.1return (scale,)def arrow_fly(t):"""丘比特之箭飛行函數"""t %= 4000if t > 2000:return ((0,-2,40-t/100),)else:return ((0,-2,0),)def heart_fly(t):"""丘比特之箭飛行函數"""t %= 4000if t > 2000:return ((0,0,1,90), (0,-2,40-t/100))else:return ((0,0,1,90), (0,-2,0))glt.figure(azim=50, elev=16, style='gray') # 設置初始方位角、高度角、背景色 glt.mesh(*red_heart(2), color='crimson', transform=heart_beat) # 繪制跳動的紅心x, y, z = red_heart(0.2, thick=3.0, shift=(0,-8,0)) # 生成心形箭頭頂點數據 glt.mesh(x, -z, y, color='crimson', transform=heart_fly) # 繪制心形箭頭light = wxgl.SunLight(roughness=0, metalness=0, shininess=0.5) # 箭桿燈光 glt.cylinder((0,0,-8), (0,0,9), 0.1, color='goldenrod', transform=arrow_fly, light=light) # 繪制箭桿vs = [(-1,1,11), (1,-1,11), (1,-1,6), (-1,1,6),(-1,-1,11), (1,1,11), (1,1,6), (-1,-1,6)] # 箭尾頂點數據 texture = wxgl.Texture(r'res\feather.png') # 箭尾羽毛紋理 texcoord = [(0,1), (0,0), (1,0), (1,1),(0,1), (0,0), (1,0), (1,1)] # 箭尾紋理坐標 light = wxgl.BaseLight() # 箭尾燈光 glt.quad(vs, texture=texture, texcoord=texcoord, transform=arrow_fly, light=light) # 繪制箭尾glt.show()

wxgl的工具條提供了錄制gif和MP4文件的功能,下面的gif就是使用wxgl自帶的錄制功能生成的。

代碼中用到了羽毛的紋理,請下載這個圖片,并保存到代碼指定的位置。

— 推薦閱讀?—

?獎金池高達 20 萬,RTE 2022 創新編程挑戰賽正式開啟 ?越來越火的圖數據庫到底能做什么? ?“我用 400 行 Swift 代碼給破舊的自行車加了一個動感單車計步器!”

— 活動推薦?—

不止七夕,讓《新程序員》陪伴你每個朝夕!

凡在七夕當日訂閱《新程序員》的朋友

都將獲得CSDN贈送的定制馬克杯一個!

掃描下方二維碼立即訂閱

總結

以上是生活随笔為你收集整理的60几行代码绘制丘比特爱情之箭!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。