Matlab画足球
轉載自:http://blog.sina.com.cn/s/blog_6f83fdb401018k9s.html
因為要準備數模,所以要備一些Matlab的干貨
Matlab畫足球
科普:足球表面是由12個正五邊形和20個正六邊形構成,每個正五邊形相鄰的是5個正六邊形,共有60個頂點,90條棱,這些數據可以根據歐拉定理計算得出,不是這里要說明的重點。
思路:先計算出60個頂點的三維坐標,然后調用matlab的繪圖函數畫圖。
至于頂點坐標的計算屬于數學問題,通過空間對稱和旋轉,可以計算得出。不是這里要說明的重點,也可以參考鏈接文檔《空間多面體》說明的方法計算:這里不再贅述。
在matlab中有一個得到足球頂點坐標的函數:bucky(),參看matlab幫助關于該函數的說明如下:
bucky? Connectivity graph ofthe Buckminster Fuller geodesic dome.
???B = bucky is the 60-by-60 sparse adjacency matrix ofthe
???????connectivity graph of the geodesic dome, the soccerball,
???????and the carbon-60 molecule.
???[B,V] = bucky also returns xyz coordinates of thevertices.
有了頂點坐標,接下來就是繪制足球面的問題了,由于每條棱長都相等,因此可以先計算出一條棱長,然后把所有距離等于棱長的兩點連線,就畫出了每個面的正多邊形。這步可能還有其他更簡單的方法,留待后續有時間再思考。
還有最后一步,就是給五邊形和六邊形涂色,五邊形是黑色,六邊形是白色,由于受每個面的外接球的那一部分影響,至于涂色的方法暫未想好,先上代碼吧:僅供參考
?
clearclc%計算各頂點坐標[B,football_pos] = bucky();%繪半透明球體[x,y,z]=sphere(30);surf(x,y,z,'facecolor',[1 10],'edgecolor','none','facealpha',0.7);axis equalview(3,3)hold on%繪各頂點plot3(football_pos(:,1),football_pos(:,2),football_pos(:,3),'*');%計算棱長Edge_Vector =football_pos(1,:)-football_pos(2,:);Edge_Length = Edge_Vector * Edge_Vector';Error = 0.0005;%距離等于棱長的兩點顯然是棱,將兩點連線for i=1:length(football_pos)-1for j=i+1:min(j+15,length(football_pos))Vector = football_pos(i,:)-football_pos(j,:);Length = Vector*Vector';if abs(Length-Edge_Length)x = [football_pos(i,1),football_pos(j,1)];y = [football_pos(i,2),football_pos(j,2)];z = [football_pos(i,3),football_pos(j,3)];line(x,y,z)endendend?
效果圖:
總結
- 上一篇: 短视频的素材在哪里找呢?推荐给你一个好办
- 下一篇: 高德地图安卓 拖拽选点_不止微信支付宝