Skip to content

Instantly share code, notes, and snippets.

@Krewn
Last active August 29, 2015 14:10
Show Gist options
  • Select an option

  • Save Krewn/ef525fb5f7592de1a1a1 to your computer and use it in GitHub Desktop.

Select an option

Save Krewn/ef525fb5f7592de1a1a1 to your computer and use it in GitHub Desktop.
A quick doodle, perhaps thought provoking.
import sys
import os
#import and init pygame
import pygame
import numpy
from time import sleep
pygame.init()
scale = 3
def getPos(angle,X,Y,o,i):
a = angle
b = int(float(angle) / numpy.pi)
c = float(angle) % numpy.pi
m = float(c/numpy.pi) if (b%2 == 0) else float((numpy.pi - c)/numpy.pi)
y = (i+(o-i)*m)*numpy.sin(a)
x = (i+(o-i)*m)*numpy.cos(a)
#x = ((o+i)/2)*numpy.sin(a)
#y = ((o+i)/2)*numpy.cos(a)-(o-((i+o)/2))
return((int(x+X),int(y+Y)))
def dist(p1,p2):
l=0.
if len(p1)!=len(p2):
print'you done doing sumtin silly'
else:
for k in range(0,len(p1)):
l+=(p1[k]-p2[k])**2.
l = l ** 0.5
return(l)
class spaceShip():
global scale
def __init__(self,n,window):
self.x = 130*scale
self.y = 75*scale
self.t = 0
self.massts = []
self.w = window
self.i = 10.*scale
self.o = 100.*scale
for k in range(0,n):
self.massts.append(masst(k,n, self))
def update(self):
self.w.fill((0,0,0))
for k in self.massts:
k.update()
pygame.draw.circle(self.w, (0,0,0), (self.x,self.y), 3*scale, 1)
self.t+=1
pygame.display.flip()
sleep(0.01)
class masst():
global scale
def __init__(self,position, of,ship):
self.s=ship
self.angle = (float(position)/float(of))*2.0*numpy.pi+3.0*numpy.pi
self.p = getPos(self.angle+(float(self.s.t)/360.)*2.*numpy.pi,self.s.x,self.s.y,self.s.o,self.s.i)
self.p2 = getPos((self.angle+((float(-1.*self.s.t)/360.)%360)*2.*numpy.pi),self.s.x,self.s.y,self.s.o,self.s.i)
def update(self):
self.p = getPos(self.angle+(float(self.s.t)/360.)*2.*numpy.pi,self.s.x,self.s.y,self.s.o,self.s.i)
self.p2 = getPos((self.angle+((float(-1.*self.s.t)/360.)%360)*2.*numpy.pi),self.s.x,self.s.y,self.s.o,self.s.i)
pygame.draw.circle(self.s.w, (200,200,200), self.p , 2*scale, 1)
pygame.draw.circle(self.s.w, (200,200,200), self.p2 , 2*scale, 1)
r =int((((((self.p[0]-self.s.x)**2+(self.p[1]-self.s.y)**2)**0.5)-(self.s.i))/(self.s.o-self.s.i))*250)
r2 =int((((((self.p2[0]-self.s.x)**2+(self.p2[1]-self.s.y)**2)**0.5)-(self.s.i))/(self.s.o-self.s.i))*250)
pygame.draw.line(self.s.w,(r,0,255-r),(self.s.x,self.s.y),self.p)
pygame.draw.line(self.s.w,(r2,0,255-r2),(self.s.x,self.s.y),self.p2)
#pygame.draw.line(self.s.w,(0,0,0),self.p,self.p2)
dtemp = None
mtemp = None
for k in self.s.massts:
if k != self:
if (( dtemp is None )or( dist(self.p,k.p) < dtemp )):
dtemp = dist(self.p,k.p)
ptemp=k.p
if((dtemp is None )or( dist(self.p,k.p2) < dtemp )):
dtemp = dist(self.p,k.p2)
ptemp=k.p2
if (( dtemp is None )or( dist(self.p,k.p) > mtemp )):
mtemp = dist(self.p,k.p)
mptemp=k.p
if((dtemp is None )or( dist(self.p,k.p2) > mtemp )):
mtemp = dist(self.p,k.p2)
mptemp=k.p2
if(dtemp is None or dist(self.p,self.p2) < dtemp):
dtemp = dist(self.p,self.p2)
ptemp=self.p2
r3 = int(dtemp/self.s.o * 255)
pygame.draw.line(self.s.w,(r3,0,255-r3),self.p,ptemp)
pygame.draw.line(self.s.w,(255-r3,255-r3,255-r3),self.p,mptemp)
w = 180*scale
h = 150*scale
window = pygame.display.set_mode((w, h))
arms = 45
s = spaceShip(arms,window)
k = True
from PIL import Image, ImageSequence
from images2gif import writeGif
if not os.path.exists('frames'):
os.makedirs('frames')
os.chdir('frames')
n = 360 / arms
if 360 % arms == 0 :
print 'Warning : Async gif'
k = 0
while(k<n):
s.update()
pygame.image.save(window,"frame"+str(k)+".png")
k+=1
frames = [Image.open("frame"+str(f)+".png") for f in range(0,n,1) if os.path.isfile("frame"+str(f)+".png")]
writeGif(os.path.basename('op.gif'), frames, duration=0.05, dither=0)
exit()
## Todo --- plot gravitational potential and kenetic energy
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment