用程序畫出一些函數圖形,這是一件賞心悅目的事情。javascript
玫瑰函數就是一件完美的藝術模型,簡單漂亮,固然還有其餘好比:餛飩圖案、分形圖等等。java
今天就介紹玫瑰函數,其餘的之後再介紹,先看看玫瑰函數的公式:ide
x=(a+b)cosθ-acos[(a+b)θ/b];
y=(a+b)sinθ-asin[(a+b)θ/b];函數
一個高中生就能看得懂的函數公式,極其簡單,X、Y的座標由3個值來決定,θ在0-360度或者0-720度的之間範圍取值,而a,b在必定的區間範圍內取值,就能夠作出各類各樣的圖案。code
UNITY3D具體的代碼是:orm
for (var i=0; i<numberOfPoints; i++) { theta = i * Mathf.PI / 180; linePoints [i] = new Vector3 ((a + b) * Mathf.Cos(1*theta) -a*Mathf.Cos((a +b) * theta / b), (a +b) * Mathf.Sin (1*theta)-a* Mathf.Sin ((a +b) * theta / b), 1.0); }
上面這段代碼就實現了玫圖案函數的表達式。blog
而後經過設置函數物體或者攝像機物體的旋轉來得到物體的運動。ip
var rotateSpeed = 10.0; function Update () { transform.Rotate(Vector3.up * Time.deltaTime * rotateSpeed); }
a、b的值能夠用slider等UI控件來解決。回調函數
btn=gameObject.Find("Canvas/Panel/Button").GetComponent(UI.Button); btn.onClick.AddListener(onClick); sca=gameObject.Find("Canvas/Panel/Slidera").GetComponent(UI.Slider); sca.onValueChanged.AddListener(SliderA); scb=gameObject.Find("Canvas/Panel/Sliderb").GetComponent(UI.Slider); scb.onValueChanged.AddListener(SliderB); scc=gameObject.Find("Canvas/Panel/Sliderc").GetComponent(UI.Slider); scc.onValueChanged.AddListener(SliderC);
相應的回調函數是:it
function Slidera (temp:float) { a= temp/100; LineSetup (true); } function Sliderb (temp:float) { b= temp/1000; LineSetup (true); }
下面有用到C的值,這是由於爲了更好顯示在攝像機中,由於函數畫出來的圖像可能有大有小,須要經過一個C值來來調節,C值=攝像機到函數的距離,這樣就能夠調節C值把函數圖案完美的顯示在手機屏幕中央了,這樣就大功告成了。
function Sliderc (temp:float) { var gb= GameObject.Find("Main Camera"); gb.transform.position=new Vector3( gb.transform.position.x, gb.transform.position.y, temp); }
進而使得程序大致完成。
其實還能夠加上粒子系統、背景圖案、顏色、座標系統等等來控制得到更好的效果。
畢竟是很短的時間內作出來的,之前這個程序寫過,可是代碼丟了,因而今晚再次完成下。
如下是效果圖: