dla生长模型模拟 | 寒山烟雨
现在的位置: 首页 > 滴水穿石 > 正文

dla生长模型模拟

2014年07月19日 滴水穿石 ⁄ 共 1235字 ⁄ 字号 评论 4 条 ⁄ 阅读 3,762 views 次

依旧是采用python和Qt写的,依赖的库有Vpython和numpy,分点生长和线生长两种。151*151的点阵,4000个点,1/3用红色点,1/3用黄色点,1/3用绿色点。

先上两个图,第一个是点生长,第二个是线生长的。point

line

 Python | 
 
 copy code |
?

001
#coding=utf-8
002
import sys
003
from PyQt4 import QtGui, QtCore
004
from visual import *
005
import numpy as np
006
 
007
class Window( QtGui.QWidget ):
008
    def __init__( self ):
009
        super( Window, self ).__init__()
010
        self.setWindowTitle( "DLA" )
011
        self.resize( 250, 250 )
012
        gridlayout = QtGui.QGridLayout()
013
 
014
        self.lines = QtGui.QPushButton( u"线生长" )
015
        gridlayout.addWidget( self.lines, 0, 0, 1, 3 )
016
        self.points = QtGui.QPushButton( "点生长" )
017
        gridlayout.addWidget( self.points, 1, 0, 1, 3 )
018
        self.quit = QtGui.QPushButton("退出")
019
        gridlayout.addWidget( self.quit, 2, 0, 1, 3 )
020
        self.setLayout( gridlayout )
021
        self.connect(self.lines, QtCore.SIGNAL("clicked()"),self.Lines)
022
        self.connect(self.points, QtCore.SIGNAL("clicked()"),self.Points)
023
        self.connect(self.quit, QtCore.SIGNAL("clicked()"),self.Close)
024
 
025
    def Lines(self):
026
        a=np.zeros([n,n])
027
        a[n/2,]=1
028
        plot(a)
029
        return
030
    def Points(self):
031
        a=np.zeros([n,n])
032
        a[n/2,n/2]=1
033
        plot(a)
034
        return
035
    def Close(self):
036
        self.close()
037
 
038
def plot(a):
039
    p=0
040
    while True:
041
        x=int(np.random.random()*(n-1)+1)
042
        y=int(np.random.random()*(n-1)+1)
043
        while True:
044
            k=int(4*np.random.random())+1
045
            if x<0 or x>n-1 or y<0 or y>n-1:
046
                break
047
            if (x-1)<0 or (x+1)>n-1 or (y-1)<0 or (y+1)>n-1:
048
                break
049
 
050
            if k==1:
051
                if a[x+1,y]!=1:
052
                    x=x+1
053
                else:
054
                    a[x,y]=1    
055
                if x>n:
056
                    break
057
 
058
            if k==2:
059
                if a[x,y+1]!=1:
060
                    y=y+1
061
                else:
062
                    a[x,y]=1
063
                if y>n:
064
                    break
065
 
066
            if k==3:
067
               if a[x-1,y]!=1:
068
                   x=x-1
069
               else:
070
                   a[x,y]=1
071
               if x<0:
072
                   break
073
 
074
            if k==4:
075
               if a[x,y-1]!=1:
076
                   y=y-1
077
               else:
078
                   a[x,y]=1
079
               if y<0:
080
                   break
081
            if a[x,y]==1:
082
                p=p+1
083
                if p<numbers/3:
084
                    sphere(pos=(x-n/2,y-n/2,0),radius=0.5,color=color.red)
085
                elif p>2*numbers/3:
086
                    sphere(pos=(x-n/2,y-n/2,0),radius=0.5,color=color.green)
087
                else:
088
                    sphere(pos=(x-n/2,y-n/2,0),radius=0.5,color=color.orange)
089
                break
090
        if p>numbers:
091
            break
092
    return
093
 
094
n=151
095
numbers=4000
096
a=np.zeros([n,n])
097
 
098
app = QtGui.QApplication( sys.argv )
099
demo = Window()
100
demo.show()
101
app.exec_()

0

目前有 4 条留言    访客:3 条, 博主:1 条

  1. 玻璃钢电缆支架 2015年04月28日 下午2:36  @回复  Δ-49楼 回复

    很有趣呀

  2. LovelornPig 2014年08月04日 下午1:12  @回复  Δ-48楼 回复

    完全看不懂啊?我是学生物信息的


    • 管理员
      hsyyf 2014年08月12日 下午12:18  @回复  ∇地下1层 回复

      简单的撒点而已

  3. seo 2014年07月20日 下午3:05  @回复  Δ-47楼 回复

    留言是种美德,写点什么...

给我留言

留言无头像?


×