We all know @GoToLoop is such a wonderful and generous mega-blast of a fellow at the forums, so I always look at his postings, then today I was looking at an example shown at LinkedList vs ArrayList and decided to port it to Python mode
On Python we can use deque
as a queue.
I hope I have got this right, enjoy!
"""
Brownian Motion (v3.00)
by Ammon.Owed (2013/Aug)
mod: GoToLoop
port to Python: Villares (2020)
https://discourse.processing.org/t/linkedlist-vs-arraylist/19946/14
Forum.Processing.org/two/discussion/2829/fifo-queue-problem-with-code#Item_1
OpenProcessing.org/sketch/878458
Bl.ocks.org/GoToLoop/145418d1dfb062c7c41a630bce5b8374
"""
from __future__ import division
from collections import deque
TITLE1, TITLE2 = "Brownian Motion FPS: ", " Size: "
HAS_MAX_LIMIT = False
DIM, LIMIT, DETAIL, DEPTH = 100, 03000, 1000, 2000
HUE = 1 << 10
HUE_M1 = HUE - 1
FPS, MIN_FPS, SMOOTH = 60, 40, 2
BOLD, AMP = 1.5, 10
points = deque(maxlen=LIMIT)
cam = PVector()
lp = PVector()
paused = False
def setup():
global canvasRatio, zNear, zFar, frame_rate
size(950, 600, P3D)
smooth(SMOOTH)
frameRate(FPS)
colorMode(HSB, HUE, 1, 1)
strokeWeight(BOLD)
noFill()
canvasRatio = float(width / height)
camZ = .5 * height / tan(PI * FPS / 360)
zNear = camZ / AMP
zFar = camZ * AMP
frame_rate = LIMIT << 1
def draw():
global cam, lp
# Local-cached & short-named variables:
fr = round(frame_rate)
len_p = len(points)
fc = frameCount
this.surface.setTitle(TITLE1 + str(fr) + TITLE2 + str(len_p))
# Recycled or new vector point:
if len_p != 0 and (not HAS_MAX_LIMIT and fr <= MIN_FPS
or HAS_MAX_LIMIT and len_p >= LIMIT):
np = points.popleft()
else:
np = PVector()
# Interpolated rotating camera aimed at latest added point (tail):
cam *= .99
cam.add(PVector.mult(lp, .01, np))
camera(
cam.x + sin(.01 * fc) * DETAIL,
cam.y + cos(8e-3 * fc + 10) * DETAIL,
cam.z - DEPTH,
cam.x, cam.y, cam.z,
0, 1, 0
)
# perspective()
perspective(THIRD_PI, canvasRatio, zNear, zFar)
# Draw colored curved lines:
background(0)
beginShape()
for p in points:
fc += 1
stroke(fc & HUE_M1, 1, 1)
curveVertex(p.x, p.y, p.z)
endShape()
# Generate a new point at specified range:
np = PVector.random3D(np).mult(DIM) # pick a new random direction.
# add that up from latest point.
np.add(lp)
# this is now the latest point too.
lp.set(np)
# add new point to queue's tail.
points.append(np)
def mousePressed():
global paused
if mouseButton == RIGHT:
points.clear()
elif not paused:
paused = True
noLoop()
else:
paused = False
loop()