Skip to content

Instantly share code, notes, and snippets.

@Ephraim-Bryski
Last active June 29, 2018 16:37
Show Gist options
  • Save Ephraim-Bryski/f6601305b2137b83ae9aff894eca4ffc to your computer and use it in GitHub Desktop.
Save Ephraim-Bryski/f6601305b2137b83ae9aff894eca4ffc to your computer and use it in GitHub Desktop.
import numpy as np
import math
from tkinter import *
tk=Tk()
WIDTH=5000
HEIGHT=4000
canvas=Canvas(tk,width=WIDTH,height=HEIGHT)
tk.title('mesh')
canvas.pack()
ITER=30000
LENGTH=50
DIMEN=50
ROWS=4
COLUMNS=4
SHEAR_MOD=50000
YOUNG_MOD=100
dt=.0005
def unit_vector(vector):
return vector / np.linalg.norm(vector)
def perpendicular( a ) :
b = np.empty_like(a)
b[0] = -a[1]
b[1] = a[0]
return (b)
class Particles:
def __init__(self,pos):
self.shape=canvas.create_rectangle(DIMEN*pos[0],DIMEN*pos[1],DIMEN*pos[0]+10,DIMEN*pos[1]+10,fill='blue')
self.pos=canvas.coords(self.shape)
if x==0:
self.vel=[0,200]
else:
self.vel=[0,0]
def move(self,parts):
for x in range(4):
p1=parts[x]
try:
p2=parts[x+1]
except:
p2=parts[0]
if p1=='none' or p2=='none':
pass
else:
vec1=(p1.pos[0]-self.pos[0],p1.pos[1]-self.pos[1])
vec2=(p2.pos[0]-self.pos[0],p2.pos[1]-self.pos[1])
vec1_u = unit_vector(vec1)
vec2_u = unit_vector(vec2)
angle= np.arccos(np.clip(np.dot(vec1_u, vec2_u), -1.0, 1.0))
torque=SHEAR_MOD*(angle-math.pi/2)
perp1=-perpendicular(vec1_u)
perp2=perpendicular(vec2_u)
torque1=torque*np.array(perp1)
torque2=torque*np.array(perp2)
dist1=(self.pos[0]-p1.pos[0],self.pos[1]-p1.pos[1])
force1=YOUNG_MOD*np.dot(((np.linalg.norm(dist1)-LENGTH)/np.linalg.norm(dist1)),(np.dot(dist1,(1,0)),np.dot(dist1,(0,1))))
dist2=(self.pos[0]-p2.pos[0],self.pos[1]-p2.pos[1])
force2=YOUNG_MOD*np.dot(((np.linalg.norm(dist2)-LENGTH)/np.linalg.norm(dist2)),(np.dot(dist2,(1,0)),np.dot(dist2,(0,1))))
p1.vel+=(force1+torque1)*dt
p2.vel+=(force2+torque2)*dt
self.vel-=(force1+force2+torque1+torque2)*dt
parts[x].vel=p1.vel
try:
parts[x+1].vel=p2.vel
except:
parts[0].vel=p2.vel
canvas.move(p1.shape,p1.vel[0]*dt,p1.vel[1]*dt)
canvas.move(p2.shape,p2.vel[0]*dt,p2.vel[1]*dt)
canvas.move(self.shape,self.vel[0]*dt,self.vel[1]*dt)
self.pos=canvas.coords(self.shape)
p1.pos=canvas.coords(p1.shape)
p2.pos=canvas.coords(p2.shape)
particles=[]
for x in range(COLUMNS):
particles.append([])
for y in range(ROWS):
particles[x].append(Particles([x,y]))
for t in range(ITER):
for column in range (COLUMNS):
for particle in range (ROWS):
if particle==0:
partT='none'
else:
partT=particles[column][particle-1]
if particle==ROWS-1:
partB='none'
else:
partB=particles[column][particle+1]
if column==0:
partL='none'
else:
partL=particles[column-1][particle]
if column==COLUMNS-1:
partR='none'
else:
partR=particles[column+1][particle]
pos=canvas.coords(particles[column][particle].shape)
pos=[pos[0],pos[1]]
particles[column][particle].move([partR,partT,partL,partB])
tk.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment