Last active
June 29, 2018 16:37
-
-
Save Ephraim-Bryski/f6601305b2137b83ae9aff894eca4ffc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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