공학도를 위한 창의적컴퓨팅 - Paraview
공학도를 위한 창의적컴퓨팅에서 진행한 Paraview 실습 내용들
기본적인 makevtu
def makevtu(filename, node, element):
a = open(filename, 'w')
# 기본문장
a.write('# vtk DataFile Version 3.0\n')
a.write('test\n')
a.write('ASCII\n')
a.write('DATASET UNSTRUCTURED_GRID\n')
# 꼭짓점 좌표 입력
a.write('POINTS '+str(len(node))+' float\n')
for i in range(len(node)):
a.write(str(node[i][0])+ ' ' + str(node[i][1])+ ' '+str(node[i][2])+'\n')
# 도형을 정의
a.write('CELLS '+str(len(element))+' '+str(len(element)*4)+'\n')
for i in range(len(element)):
a.write('3 '+str(element[i][0])+' '+str(element[i][1])+ ' '+str(element[i][2])+'\n')
#도형의 형태를 정의
a.write('CELL_TYPES '+str(len(element))+'\n')
for i in range(len(element)):
a.write('5\n')
a.close()
행렬의 곱 - 이게 makevtu보다 위에 가야할 수도
def matrixvec(mat, vec):
# mat: 2차 리스트
# vec: 1차 리스트
# c = mat * vec # 얘는 1차 리스트로 나와야함
c = []
for i in range(len(mat)):
c.append(0)
for j in range(len(vec)):
c[i] += mat[i][j] * vec[j]
return c
txt 파일 읽어와서 node, element 추가
a = open('input.txt', 'r')
node_num = int(a.readline().split(' ')[1])
dummy = a.readline() # 쓸데없지만 다음거 읽으려고 읽어옴
node = []
for i in range(node_num):
b = a.readline().split(',')
node.append([float(b[1]), float(b[2]), 0])
element_num = int(a.readline().split(' ')[1])
dummy = a.readline()
element = []
for i in range(element_num):
b = a.readline().split(',')
element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함
a.close()
도형들
정육면체
node=[[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]]
element=[[4,1,0],[5,1,4],[5,2,1],[5,6,2],[7,6,2],[7,2,3],[4,7,3],[4,3,0],[7,6,5],[7,5,4],[3,2,1],[3,1,0]]
makevtu('cubit.vtu',node,element)
원
div = 100
r =1
theta = (360/div)*math.pi/180
node = [[0,0,0]]
for i in range(div):
node.append([r*math.cos(i*theta),r*math.sin(i*theta),0])
element = []
for i in range(1,div+1):
if(i==div):
element.append([0,i,1])
else:
element.append([0,i,i+1])
makevtu('circle.vtu', node, element)
반구
div = 100
r = 1
div_z = 100
theta = (360/div)*(math.pi/180)
node = []
element = []
for j in range(div_z+1): # node
ri = (r**2-(j*r/div_z)**2)**0.5
for i in range(div):
node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), j*r/div_z])
for j in range(div_z): # element
for i in range(div-1):
element.append([i+div*j, i+div*(j+1), i+div*j+1])
element.append([div*(j+1)-1, div-1+div*(j+1), div*j])
for i in range(div-1):
element.append([i+div*j+1, i+div*(j+1), i+div*(j+1)+1])
element.append([div*j, div-1+div*(j+1), div*(j+1)])
makevtu('bt.vtu',node,element)
구 - 미완성
div = 10
r = 1
div_z = 10
theta = (360/div)*(math.pi/180)
node = []
element = []
for j in range(div_z+1): # node
ri = (r**2-(j*r/div_z)**2)**0.5
for i in range(div):
node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), j*r/div_z])
for j in range(0,div_z): # node -z
ri = (r**2-(j*r/div_z)**2)**0.5
for i in range(div):
node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), -1*j*r/div_z])
for i in range(div):
ri=0
node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), -1*r])
for j in range(div_z*2): # element
for i in range(div-1):
element.append([i+div*j, i+div*(j+1), i+div*j+1])
element.append([div*(j+1)-1, div-1+div*(j+1), div*j])
for i in range(div-1):
element.append([i+div*j+1, i+div*(j+1), i+div*(j+1)+1])
element.append([div*j, div-1+div*(j+1), div*(j+1)])
makevtu('sphere.vtu',node,element)
애니메이션(움직이게)
파일명에 넘버링이 되어있으면 동영상이라고 인식
makevtu('simul0.vtu',points,cell)
makevtu('simul1.vtu',points,cell)
makevtu('simul2.vtu',points,cell)
평행이동
# [점의 좌표 이동, 모양 바뀜]
node[0][0] += 0.1
# [전체가 수평이동, 이건 x축방향으로]
for j in range(20):
for i in range(len(node)):
node[i][0] += 0.1
makevtu('simul'+str(j)+'.vtu',node,element)
회전
# [30도 회전]
theta = 30 * math.pi / 180
# rotate matrix define
rot = [
[math.cos(theta),-1*math.sin(theta),0],
[math.sin(theta),math.cos(theta),0],
[0,0,1]
]
makevtu('rotri0.vtu',node,element)
for i in range(len(node)):
node[i] = matrixvec(rot, node[i])
makevtu('rotri1.vtu',node,element)
# [1도씩 360도 회전]
makevtu('rotri0.vtu',node,element)
for j in range(1,361):
theta = 1 * math.pi / 180
# rotate matrix define
rot = [
[math.cos(theta),-1*math.sin(theta),0],
[math.sin(theta),math.cos(theta),0],
[0,0,1]
]
for i in range(len(node)):
node[i] = matrixvec(rot, node[i])
makevtu('rotri'+str(j)+'.vtu',node,element)
(1, 0, 0)을 축으로 회전
# [1도씩 360도 회전] - 회전 후 x좌표 +1해서 (1,0,0)을 축으로 도는 것 처럼
makevtu('rotri0.vtu',node,element)
for j in range(1,361):
theta = 1 * math.pi / 180
# rotate matrix define
rot = [
[math.cos(theta),-1*math.sin(theta),0],
[math.sin(theta),math.cos(theta),0],
[0,0,1]
]
for i in range(len(node)):
node[i] = matrixvec(rot, node[i])
for i in range(len(node)):
node[i][0] += 1
makevtu('rotri'+str(j)+'.vtu',node,element)
for i in range(len(node)):
node[i][0] -= 1
3차원 회전 - x축을 축으로 회전
# rotate matrix define
theta = 1 * math.pi / 180
rotx = [
[1,0,0],
[0,math.cos(theta),-1*math.sin(theta)],
[0,math.sin(theta),math.cos(theta)]
]
roty = [
[math.cos(theta),0,math.sin(theta)],
[0,1,0],
[-1*math.sin(theta),0,math.cos(theta)]
]
rotz = [
[math.cos(theta),-1*math.sin(theta),0],
[math.sin(theta),math.cos(theta),0],
[0,0,1]
]
makevtu('rotri0.vtu',node,element)
for j in range(1,361):
for i in range(len(node)):
node[i] = matrixvec(rotx, node[i])
makevtu('rotri'+str(j)+'.vtu',node,element)