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