kopia lustrzana https://github.com/villares/sketch-a-day
				
				
				
			
			
			
			
				main
			
			
		
		
							rodzic
							
								
									160cc71764
								
							
						
					
					
						commit
						7f220d7e2e
					
				|  | @ -0,0 +1,18 @@ | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |   <meta charset="UTF-8"> | ||||||
|  |   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  | 
 | ||||||
|  |   <!-- PLEASE NO CHANGES BELOW THIS LINE (UNTIL I SAY SO) --> | ||||||
|  |   <script language="javascript" type="text/javascript" src="libraries/p5.min.js"></script> | ||||||
|  |   <script language="javascript" type="text/javascript" src="sketch_2020_07_17a.js"></script> | ||||||
|  |   <!-- OK, YOU CAN MAKE CHANGES BELOW THIS LINE AGAIN --> | ||||||
|  | 
 | ||||||
|  |   <!-- This line removes any default padding and style. | ||||||
|  |        You might only need one of these values set. --> | ||||||
|  |   <style> body { padding: 0; margin: 0; } </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
|  | <body> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -0,0 +1,136 @@ | ||||||
|  | // adapted from Khan Academy that adapts Dan Shiffman, natureofcode.com
 | ||||||
|  | // https://pt.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-particle-systems/a/particle-systems-with-forces
 | ||||||
|  | 
 | ||||||
|  | var gravity; | ||||||
|  | var particleSystem; | ||||||
|  | var repeller; | ||||||
|  | 
 | ||||||
|  | function setup() { | ||||||
|  |   createCanvas(400, 400); | ||||||
|  |   gravity = createVector(0, 0.2); | ||||||
|  |   particleSystem = new ParticleSystem(createVector(width / 2, 50)); | ||||||
|  |   repeller = new Repeller(width / 2, 280); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function draw() { | ||||||
|  |   background(214, 255, 171); | ||||||
|  |   particleSystem.applyGravity(); | ||||||
|  |   particleSystem.applyRepeller(repeller); | ||||||
|  |   repeller.display(); | ||||||
|  |   particleSystem.addParticle(); | ||||||
|  |   particleSystem.run(); | ||||||
|  |   fill(0); | ||||||
|  |   text(particleSystem.particles.length, 20, 380); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | var Repeller = function(x, y) { | ||||||
|  |   this.power = 398; | ||||||
|  |   this.position = createVector(x, y); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Repeller.prototype.display = function() { | ||||||
|  |   stroke(255); | ||||||
|  |   strokeWeight(2); | ||||||
|  |   fill(127); | ||||||
|  |   ellipse(this.position.x, this.position.y, 32, 32); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Repeller.prototype.calculateRepelForce = function(p) { | ||||||
|  |   // Calculate direction of force
 | ||||||
|  |   var dir = p5.Vector.sub(this.position, p.position); | ||||||
|  |   // Distance between objects
 | ||||||
|  |   var d = dir.mag(); | ||||||
|  |   // Normalize direction vector 
 | ||||||
|  |   dir.normalize(); | ||||||
|  |   // Keep distance within a reasonable range
 | ||||||
|  |   d = constrain(d, 1, 100); | ||||||
|  |   // Repelling force is inversely proportional to distance
 | ||||||
|  |   var force = -1 * this.power / (d * d); | ||||||
|  |   // Get force vector --> magnitude * direction
 | ||||||
|  |   dir.mult(force); | ||||||
|  |   return dir; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | var Particle = function(position) { | ||||||
|  |   this.acceleration = createVector(0, 0); | ||||||
|  |   this.velocity = createVector(random(-1, 1) / 5, 0); | ||||||
|  |   this.position = position.copy(); | ||||||
|  |   this.timeToLive = 255.0; | ||||||
|  |   this.mass = random(5, 20); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Particle.prototype.run = function() { | ||||||
|  |   this.update(); | ||||||
|  |   this.display(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Particle.prototype.applyForce = function(force) { | ||||||
|  |   var f = force.copy(); | ||||||
|  |   f.div(this.mass); | ||||||
|  |   this.acceleration.add(f); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Particle.prototype.update = function() { | ||||||
|  |   this.velocity.add(this.acceleration); | ||||||
|  |   this.position.add(this.velocity); | ||||||
|  |   this.acceleration.mult(0); | ||||||
|  |   this.timeToLive -= 1; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Particle.prototype.display = function() { | ||||||
|  |   stroke(0, 0, 0, this.timeToLive); | ||||||
|  |   strokeWeight(2); | ||||||
|  |   fill(255, 0, 0, this.timeToLive); | ||||||
|  |   ellipse(this.position.x, this.position.y, this.mass, this.mass); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Particle.prototype.isDead = function() { | ||||||
|  |   if (this.timeToLive < 0.0 || this.position.y > 410) { | ||||||
|  |     return true; | ||||||
|  |   } else { | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | var ParticleSystem = function(position) { | ||||||
|  |   this.origin = position.copy(); | ||||||
|  |   this.particles = []; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ParticleSystem.prototype.addParticle = function() { | ||||||
|  |   this.particles.push(new Particle(this.origin)); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ParticleSystem.prototype.applyForce = function(f) { | ||||||
|  |   for (var i = 0; i < this.particles.length; i++) { | ||||||
|  |     this.particles[i].applyForce(f); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ParticleSystem.prototype.applyGravity = function() { | ||||||
|  |   for (var i = 0; i < this.particles.length; i++) { | ||||||
|  |     var particleG = gravity.copy(); | ||||||
|  |     particleG.mult(this.particles[i].mass); | ||||||
|  |     this.particles[i].applyForce(particleG); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ParticleSystem.prototype.applyRepeller = function(r) { | ||||||
|  |   for (var i = 0; i < this.particles.length; i++) { | ||||||
|  |     var p = this.particles[i]; | ||||||
|  |     var force = r.calculateRepelForce(p); | ||||||
|  |     p.applyForce(force); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ParticleSystem.prototype.run = function() { | ||||||
|  |   for (var i = this.particles.length - 1; i >= 0; i--) { | ||||||
|  |     var p = this.particles[i]; | ||||||
|  |     p.run(); | ||||||
|  |     if (p.isDead()) { | ||||||
|  |       this.particles.splice(i, 1); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,122 @@ | ||||||
|  | # adapted from Khan Academy that adapts Dan Shiffman, natureofcode.com | ||||||
|  | # https://pt.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-particle-systems/a/particle-systems-with-forces | ||||||
|  | # now ported to Processing Python mode | ||||||
|  | 
 | ||||||
|  | def setup(): | ||||||
|  |     global gravity, particleSystem, repeller | ||||||
|  |     size(400, 400) | ||||||
|  |     gravity = PVector(0, 0.2) | ||||||
|  |     particleSystem = ParticleSystem(PVector(width / 2, 50)) | ||||||
|  |     repeller = Repeller(width / 2, 280) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def draw(): | ||||||
|  |     background(214, 255, 171) | ||||||
|  |     particleSystem.applyGravity() | ||||||
|  |     particleSystem.applyRepeller(repeller) | ||||||
|  |     repeller.display() | ||||||
|  |     particleSystem.addParticle() | ||||||
|  |     particleSystem.run() | ||||||
|  |     fill(0) | ||||||
|  |     # text(len(particleSystem.particles), 20, 380) | ||||||
|  |     text(frameRate, 20, 380) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Repeller: | ||||||
|  | 
 | ||||||
|  |     def __init__(self, x, y): | ||||||
|  |         self.power = 398.0 | ||||||
|  |         self.position = PVector(x, y) | ||||||
|  | 
 | ||||||
|  |     def display(self): | ||||||
|  |         stroke(255) | ||||||
|  |         strokeWeight(2) | ||||||
|  |         fill(127) | ||||||
|  |         ellipse(self.position.x, self.position.y, 32, 32) | ||||||
|  | 
 | ||||||
|  |     def calculateRepelForce(self, p): | ||||||
|  |         # Calculate direction of force | ||||||
|  |         dir = self.position - p.position | ||||||
|  |         # Distance between objects | ||||||
|  |         d = dir.mag() | ||||||
|  |         # Normalize direction vector | ||||||
|  |         dir.normalize() | ||||||
|  |         # Keep distance within a reasonable range | ||||||
|  |         d = constrain(d, 1, 100) | ||||||
|  |         # Repelling force is inversely proportional to distance | ||||||
|  |         force = -1 * self.power / (d * d) | ||||||
|  |         # Get force vector -= 1> magnitude * direction | ||||||
|  |         dir.mult(force) | ||||||
|  |         return dir | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Particle: | ||||||
|  | 
 | ||||||
|  |     def __init__(self, position): | ||||||
|  |         self.acceleration = PVector(0, 0) | ||||||
|  |         self.velocity = PVector(random(-1, 1) / 5, 0) | ||||||
|  |         self.position = position.copy() | ||||||
|  |         self.timeToLive = 255.0 | ||||||
|  |         self.mass = random(5, 20) | ||||||
|  | 
 | ||||||
|  |     def run(self): | ||||||
|  |         self.update() | ||||||
|  |         self.display() | ||||||
|  | 
 | ||||||
|  |     def applyForce(self, force): | ||||||
|  |         f = force.copy() | ||||||
|  |         f.div(self.mass) | ||||||
|  |         self.acceleration.add(f) | ||||||
|  | 
 | ||||||
|  |     def update(self): | ||||||
|  |         self.velocity.add(self.acceleration) | ||||||
|  |         self.position.add(self.velocity) | ||||||
|  |         self.acceleration.mult(0) | ||||||
|  |         self.timeToLive -= 1 | ||||||
|  | 
 | ||||||
|  |     def display(self): | ||||||
|  |         stroke(0, 0, 0, self.timeToLive) | ||||||
|  |         strokeWeight(2) | ||||||
|  |         fill(255, 0, 0, self.timeToLive) | ||||||
|  |         ellipse(self.position.x, self.position.y, self.mass, self.mass) | ||||||
|  | 
 | ||||||
|  |     def isDead(self): | ||||||
|  |         if (self.timeToLive < 0.0 or self.position.y > 410): | ||||||
|  |             return True | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  | class ParticleSystem(): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, position): | ||||||
|  |         self.origin = position.copy() | ||||||
|  |         self.particles = [] | ||||||
|  | 
 | ||||||
|  |     def addParticle(self): | ||||||
|  |         self.particles.append(Particle(self.origin)) | ||||||
|  | 
 | ||||||
|  |     def applyForce(self, f): | ||||||
|  |         for p in self.particles: | ||||||
|  |             p.applyForce(f) | ||||||
|  | 
 | ||||||
|  |     def applyGravity(self): | ||||||
|  |         for p in self.particles: | ||||||
|  |             particleG = gravity.copy() | ||||||
|  |             particleG.mult(p.mass) | ||||||
|  |             p.applyForce(particleG) | ||||||
|  | 
 | ||||||
|  |     def applyRepeller(self, r): | ||||||
|  |         for p in self.particles: | ||||||
|  |             force = r.calculateRepelForce(p) | ||||||
|  |             p.applyForce(force) | ||||||
|  | 
 | ||||||
|  |     def run(self): | ||||||
|  |         for p in reversed(self.particles): | ||||||
|  |             p.run() | ||||||
|  |             if p.isDead(): | ||||||
|  |                 self.particles.remove(p) | ||||||
|  |         # for i in reversed(range(len(self.particles))): | ||||||
|  |         #     p = self.particles[i] | ||||||
|  |         #     p.run() | ||||||
|  |         #     if p.isDead(): | ||||||
|  |         #         del self.particles[i] | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 Alexandre B A Villares
						Alexandre B A Villares