我最近在Coursera上開始了一門課程(資料庫和演算法,順便提一句,這是普林斯頓大學開設的一門很牛的課程)。現在上了幾次課,我發現這些程式設計課都相當困難,我的(自我緩解程式設計困難的)方法則是在OpenGL上編一些小東西來減壓。
做三維模型程式設計最棒的一點就是你可以看到你程式碼的成果(這也是程式設計的一個動機)。3D程式設計是一個很強大的視覺化工具,通過編碼實現DNA的結構是一個有趣並且富有挑戰性的任務。其具有挑戰性主要是因為OpenGl程式碼所帶來的侷限性。我相信DNA結構在數學方面的實現是很簡單的。
關於程式碼和DNA結構
1. DNA是雙螺旋結構,有個帶狀結構從不同的角間距中連線著這兩個螺旋。我用GL_QUADS來繪製兩股螺旋和其中的帶子。這些四邊形的座標可以通過以下方式來獲得:
1 2 3 4 |
x1 = 40*cos(angle*GL_PI/180); z1 = 40*sin(angle*GL_PI/180); x2 = 40*cos((angle+10)*GL_PI/180); z2 = 40*sin((angle+10)*GL_PI/180); |
頂點的輸入則是(10是雙螺旋帶的寬度)——
1 2 3 4 |
glVertex3f(x1 , yOld1 , z1); glVertex3f(x1 , yOld1+10 , z1); glVertex3f(x2 , yNew1+10 , z2); glVertex3f(x2 , yNew1 , z2); |
而b/w yOld1和yNew1之間的關係表示式如下:
1 |
yNew1 = yOld1+3; |
2. 對於連線兩個螺旋帶的中間的帶狀,我用了C++中的結構體陣列來儲存x,y和z的值,它們相應的點都對應在兩個螺旋帶的連線點上,它們也是通過GL_QUADS來連線的。之後通過一個簡單的”for“迴圈來連線它們。
1 2 3 4 5 6 |
struct strand { float x ; float y; float z; }; |
我已經分別採取了+60和-60,+120和-120度的連線角,因此無論何時,在第一個螺旋上的經過角都為60度或60+360n度,或者第二個角上的120+360n度。我已經將x,y和z的對應值加到結構陣列中去了。
之後一個簡單的for迴圈將連線x,y和z與GL_QUADS來完成工作。
如果你想了解關於DNA鏈的顏色或是照明的資訊,它是用(GL_DIFFUSE)分配給雙螺旋和帶子的一些材質。
下面是一些截圖:
(分別為縮小圖和特寫圖)
條帶數可以通過增加n的值,減小連線角來一直增加,其中的n代表的就是條帶的數目。
與此相關的也有許多很有趣,我想我將會嘗試在某天做一個由球面(表示實際分子)組成的相同的DNA。
完整的程式碼將很快傳到GitHub上!
更新——程式碼已經上傳了,連結是:
https://github.com/soumitrasaxena/DNA