DNA的三維可視化:通過OpenGL實現一個DNA鏈
英文原文:DNA Visualisation in 3D Coding a DNA strand using OpenGL.
我最近在 Coursera 上開始了一門課程(數據庫和算法,順便提一句,這是普林斯頓大學開設的一門很牛的課程)。現在上了幾次課,我發現這些編程課都相當困難,我的(自我緩解編程困難的)方法則是在 OpenGL 上編一些小東西來減壓。
做三維模型編程最棒的一點就是你可以看到你代碼的成果(這也是編程的一個動機)。3D 編程是一個很強大的可視化工具,通過編碼實現 DNA 的結構是一個有趣并且富有挑戰性的任務。其具有挑戰性主要是因為 OpenGl 代碼所帶來的局限性。我相信 DNA 結構在數學方面的實現是很簡單的。
關于代碼和 DNA 結構
1. DNA 是雙螺旋結構,有個帶狀結構從不同的角間距中連接著這兩個螺旋。我用 GL_QUADS 來繪制兩股螺旋和其中的帶子。這些四邊形的坐標可以通過以下方式來獲得:
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 是雙螺旋帶的寬度)——
glVertex3f (x1 , yOld1 , z1); glVertex3f (x1 , yOld1+10 , z1); glVertex3f (x2 , yNew1+10 , z2); glVertex3f (x2 , yNew1 , z2);
而b/w yOld1 和 yNew1 之間的關系表達式如下:
yNew1 = yOld1+3;
2. 對于連接兩個螺旋帶的中間的帶狀,我用了 C++ 中的結構體數組來存儲x,y和z的值,它們相應的點都對應在兩個螺旋帶的連接點上,它們也是通過 GL_QUADS 來連接的。之后通過一個簡單的”for“循環來連接它們。
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
譯文鏈接: http://blog.jobbole.com/67260/