From 4ae60c7aa597d857d456eecfba16cbec49fb4f46 Mon Sep 17 00:00:00 2001 From: REAS Date: Mon, 9 Jun 2014 23:45:49 -0700 Subject: [PATCH] Books removed from Examples --- .../Chapter02/Ex_02_01/Ex_02_01.pde | 4 - .../Chapter02/Ex_02_02/Ex_02_02.pde | 17 - .../Chapter03/Ex_03_01/Ex_03_01.pde | 4 - .../Chapter03/Ex_03_02/Ex_03_02.pde | 5 - .../Chapter03/Ex_03_03/Ex_03_03.pde | 5 - .../Chapter03/Ex_03_04/Ex_03_04.pde | 7 - .../Chapter03/Ex_03_05/Ex_03_05.pde | 5 - .../Chapter03/Ex_03_06/Ex_03_06.pde | 7 - .../Chapter03/Ex_03_07/Ex_03_07.pde | 8 - .../Chapter03/Ex_03_08/Ex_03_08.pde | 8 - .../Chapter03/Ex_03_09/Ex_03_09.pde | 8 - .../Chapter03/Ex_03_10/Ex_03_10.pde | 8 - .../Chapter03/Ex_03_11/Ex_03_11.pde | 8 - .../Chapter03/Ex_03_12/Ex_03_12.pde | 11 - .../Chapter03/Ex_03_13/Ex_03_13.pde | 14 - .../Chapter03/Ex_03_14/Ex_03_14.pde | 12 - .../Chapter03/Ex_03_15/Ex_03_15.pde | 11 - .../Chapter03/Ex_03_16/Ex_03_16.pde | 13 - .../Chapter03/Ex_03_17/Ex_03_17.pde | 13 - .../Chapter03/Ex_03_18/Ex_03_18.pde | 13 - .../Chapter03/Ex_03_19/Ex_03_19.pde | 13 - .../Chapter03/Ex_03_20/Ex_03_20.pde | 38 - .../Chapter04/Ex_04_01/Ex_04_01.pde | 10 - .../Chapter04/Ex_04_02/Ex_04_02.pde | 10 - .../Chapter04/Ex_04_03/Ex_04_03.pde | 8 - .../Chapter04/Ex_04_04/Ex_04_04.pde | 12 - .../Chapter04/Ex_04_05/Ex_04_05.pde | 13 - .../Chapter04/Ex_04_06/Ex_04_06.pde | 10 - .../Chapter04/Ex_04_07/Ex_04_07.pde | 10 - .../Chapter04/Ex_04_08/Ex_04_08.pde | 10 - .../Chapter04/Ex_04_09/Ex_04_09.pde | 11 - .../Chapter04/Ex_04_10/Ex_04_10.pde | 14 - .../Chapter04/Ex_04_11/Ex_04_11.pde | 16 - .../Chapter04/Ex_04_12/Ex_04_12.pde | 16 - .../Chapter04/Ex_04_13/Ex_04_13.pde | 12 - .../Chapter05/Ex_05_01/Ex_05_01.pde | 9 - .../Chapter05/Ex_05_02/Ex_05_02.pde | 11 - .../Chapter05/Ex_05_03/Ex_05_03.pde | 18 - .../Chapter05/Ex_05_04/Ex_05_04.pde | 15 - .../Chapter05/Ex_05_05/Ex_05_05.pde | 15 - .../Chapter05/Ex_05_06/Ex_05_06.pde | 14 - .../Chapter05/Ex_05_07/Ex_05_07.pde | 15 - .../Chapter05/Ex_05_08/Ex_05_08.pde | 18 - .../Chapter05/Ex_05_09/Ex_05_09.pde | 27 - .../Chapter05/Ex_05_10/Ex_05_10.pde | 18 - .../Chapter05/Ex_05_11/Ex_05_11.pde | 18 - .../Chapter05/Ex_05_12/Ex_05_12.pde | 19 - .../Chapter05/Ex_05_13/Ex_05_13.pde | 21 - .../Chapter05/Ex_05_14/Ex_05_14.pde | 23 - .../Chapter05/Ex_05_15/Ex_05_15.pde | 28 - .../Chapter05/Ex_05_16/Ex_05_16.pde | 25 - .../Chapter05/Ex_05_17/Ex_05_17.pde | 24 - .../Chapter05/Ex_05_18/Ex_05_18.pde | 16 - .../Chapter05/Ex_05_19/Ex_05_19.pde | 14 - .../Chapter05/Ex_05_20/Ex_05_20.pde | 22 - .../Chapter05/Ex_05_21/Ex_05_21.pde | 21 - .../Chapter06/Ex_06_01/Ex_06_01.pde | 14 - .../Chapter06/Ex_06_02/Ex_06_02.pde | 18 - .../Chapter06/Ex_06_03/Ex_06_03.pde | 15 - .../Chapter06/Ex_06_04/Ex_06_04.pde | 16 - .../Chapter06/Ex_06_04/data/clouds.gif | Bin 138979 -> 0 bytes .../Chapter06/Ex_06_05/Ex_06_05.pde | 16 - .../Chapter06/Ex_06_06/Ex_06_06.pde | 20 - .../Chapter06/Ex_06_06/data/AndaleMono-36.vlw | Bin 128059 -> 0 bytes .../Chapter06/Ex_06_07/Ex_06_07.pde | 18 - .../Chapter06/Ex_06_07/data/AndaleMono-24.vlw | Bin 66629 -> 0 bytes .../Chapter06/Ex_06_08/Ex_06_08.pde | 17 - .../Chapter06/Ex_06_08/data/AndaleMono-24.vlw | Bin 66629 -> 0 bytes .../Chapter06/Ex_06_09/Ex_06_09.pde | 17 - .../Chapter06/Ex_06_09/data/network.svg | 4056 - .../Chapter06/Ex_06_10/Ex_06_10.pde | 18 - .../Chapter06/Ex_06_10/data/network.svg | 4056 - .../Chapter07/Ex_07_01/Ex_07_01.pde | 7 - .../Chapter07/Ex_07_02/Ex_07_02.pde | 15 - .../Chapter07/Ex_07_03/Ex_07_03.pde | 19 - .../Chapter07/Ex_07_04/Ex_07_04.pde | 22 - .../Chapter07/Ex_07_05/Ex_07_05.pde | 27 - .../Chapter07/Ex_07_06/Ex_07_06.pde | 27 - .../Chapter07/Ex_07_07/Ex_07_07.pde | 8 - .../Chapter07/Ex_07_08/Ex_07_08.pde | 18 - .../Chapter07/Ex_07_09/Ex_07_09.pde | 21 - .../Chapter07/Ex_07_10/Ex_07_10.pde | 8 - .../Chapter07/Ex_07_11/Ex_07_11.pde | 23 - .../Chapter07/Ex_07_12/Ex_07_12.pde | 13 - .../Chapter07/Ex_07_13/Ex_07_13.pde | 24 - .../Chapter07/Ex_07_14/Ex_07_14.pde | 20 - .../Chapter07/Ex_07_15/Ex_07_15.pde | 22 - .../Chapter07/Ex_07_16/Ex_07_16.pde | 12 - .../Chapter07/Ex_07_17/Ex_07_17.pde | 14 - .../Chapter07/Ex_07_18/Ex_07_18.pde | 16 - .../Chapter07/Ex_07_19/Ex_07_19.pde | 17 - .../Chapter07/Ex_07_20/Ex_07_20.pde | 17 - .../Chapter07/Ex_07_21/Ex_07_21.pde | 17 - .../Chapter07/Ex_07_22/Ex_07_22.pde | 19 - .../Chapter07/Ex_07_23/Ex_07_23.pde | 33 - .../Chapter08/Ex_08_01/Ex_08_01.pde | 16 - .../Chapter08/Ex_08_02/Ex_08_02.pde | 14 - .../Chapter08/Ex_08_03/Ex_08_03.pde | 25 - .../Chapter08/Ex_08_04/Ex_08_04.pde | 42 - .../Chapter08/Ex_08_05/Ex_08_05.pde | 32 - .../Chapter08/Ex_08_06/Ex_08_06.pde | 33 - .../Chapter08/Ex_08_07/Ex_08_07.pde | 37 - .../Chapter08/Ex_08_08/Ex_08_08.pde | 14 - .../Chapter09/Ex_09_01/Ex_09_01.pde | 40 - .../Chapter09/Ex_09_02/Ex_09_02.pde | 45 - .../Chapter10/Ex_10_01/Ex_10_01.pde | 20 - .../Chapter10/Ex_10_02/Ex_10_02.pde | 29 - .../Chapter10/Ex_10_03/Ex_10_03.pde | 24 - .../Chapter10/Ex_10_04/Ex_10_04.pde | 12 - .../Chapter10/Ex_10_05/Ex_10_05.pde | 11 - .../Chapter10/Ex_10_06/Ex_10_06.pde | 9 - .../Chapter10/Ex_10_07/Ex_10_07.pde | 19 - .../Chapter10/Ex_10_08/Ex_10_08.pde | 20 - .../Chapter10/Ex_10_09/Ex_10_09.pde | 28 - .../Chapter10/Ex_10_10/Ex_10_10.pde | 47 - .../Chapter10/Ex_10_11/Ex_10_11.pde | 24 - .../Chapter11/Ex_11_01/Ex_11_01.pde | 29 - .../Chapter11/Ex_11_02/Ex_11_02.pde | 36 - .../Chapter11/Ex_11_03/Ex_11_03.pde | 29 - .../Chapter11/Ex_11_04/Ex_11_04.pde | 27 - .../Chapter11/Ex_11_05/Ex_11_05.pde | 25 - .../Chapter11/Ex_11_06/Ex_11_06.pde | 17 - .../Chapter11/Ex_11_07/Ex_11_07.pde | 30 - .../Chapter11/Ex_11_08/Ex_11_08.pde | 44 - .../Chapter11/Ex_11_09/Ex_11_09.pde | 41 - .../Robots/Robot1_Draw/Robot1_Draw.pde | 41 - .../Robot2_Variables/Robot2_Variables.pde | 54 - .../Robot3_Response/Robot3_Response.pde | 59 - .../Robots/Robot4_Media/Robot4_Media.pde | 43 - .../Robots/Robot4_Media/data/robot1.svg | 1033 - .../Robots/Robot4_Media/data/robot2.svg | 92 - .../Robots/Robot4_Media/data/robot3.svg | 78 - .../Robots/Robot5_Motion/Robot5_Motion.pde | 57 - .../Robot6_Functions/Robot6_Functions.pde | 63 - .../Robots/Robot7_Objects/Robot7_Objects.pde | 53 - .../Robots/Robot7_Objects/data/robot1.svg | 1033 - .../Robots/Robot7_Objects/data/robot2.svg | 92 - .../Robots/Robot8_Arrays/Robot8_Arrays.pde | 58 - .../Robots/Robot8_Arrays/data/robot1.svg | 1033 - .../Getting Started/media/AndaleMono-24.vlw | Bin 66629 -> 0 bytes .../Getting Started/media/AndaleMono-36.vlw | Bin 128059 -> 0 bytes .../Books/Getting Started/media/clouds.gif | Bin 138979 -> 0 bytes .../Books/Getting Started/media/network.svg | 4056 - .../Books/Getting Started/media/robot1.svg | 1033 - .../Books/Getting Started/media/robot2.svg | 1033 - .../Connection.pde | 65 - .../Exercise_10_5_LayeredNetworkAnimation.pde | 49 - .../Network.pde | 68 - .../Neuron.pde | 64 - .../chp10_nn/LayeredNetworkViz/Connection.pde | 24 - .../LayeredNetworkViz/LayeredNetworkViz.pde | 16 - .../chp10_nn/LayeredNetworkViz/Network.pde | 47 - .../chp10_nn/LayeredNetworkViz/Neuron.pde | 31 - .../NOC_10_01_SimplePerceptron.pde | 90 - .../NOC_10_01_SimplePerceptron/Perceptron.pde | 60 - .../NOC_10_01_SimplePerceptron/Trainer.pde | 24 - .../NOC_10_02_SeekingNeural.pde | 63 - .../NOC_10_02_SeekingNeural/Perceptron.pde | 45 - .../NOC_10_02_SeekingNeural/Vehicle.pde | 102 - .../NOC_10_03_NetworkViz/Connection.pde | 31 - .../NOC_10_03_NetworkViz.pde | 39 - .../chp10_nn/NOC_10_03_NetworkViz/Network.pde | 39 - .../chp10_nn/NOC_10_03_NetworkViz/Neuron.pde | 38 - .../NOC_10_04_NetworkAnimation/Connection.pde | 65 - .../NOC_10_04_NetworkAnimation.pde | 50 - .../NOC_10_04_NetworkAnimation/Network.pde | 64 - .../NOC_10_04_NetworkAnimation/Neuron.pde | 64 - .../Nature of Code/chp10_nn/xor/Landscape.pde | 75 - .../chp10_nn/xor/code/src/Connection.java | 47 - .../chp10_nn/xor/code/src/HiddenNeuron.java | 20 - .../chp10_nn/xor/code/src/InputNeuron.java | 23 - .../chp10_nn/xor/code/src/Network.java | 143 - .../chp10_nn/xor/code/src/Neuron.java | 81 - .../chp10_nn/xor/code/src/OutputNeuron.java | 7 - .../Books/Nature of Code/chp10_nn/xor/xor.pde | 112 - .../NOC_1_10_motion101_acceleration/Mover.pde | 49 - .../NOC_1_10_motion101_acceleration.pde | 21 - .../Mover.pde | 48 - .../NOC_1_11_motion101_acceleration_array.pde | 28 - .../NOC_1_1_bouncingball_novectors.pde | 38 - .../NOC_1_2_bouncingball_vectors.pde | 37 - .../NOC_1_3_vector_subtraction.pde | 26 - .../NOC_1_4_vector_multiplication.pde | 28 - .../NOC_1_5_vector_magnitude.pde | 31 - .../NOC_1_6_vector_normalize.pde | 37 - .../chp1_vectors/NOC_1_7_motion101/Mover.pde | 43 - .../NOC_1_7_motion101/NOC_1_7_motion101.pde | 19 - .../NOC_1_8_motion101_acceleration/Mover.pde | 49 - .../NOC_1_8_motion101_acceleration.pde | 20 - .../NOC_1_9_motion101_acceleration/Mover.pde | 52 - .../NOC_1_9_motion101_acceleration.pde | 18 - .../Exercise_2_10_attractrepel/Attractor.pde | 75 - .../Exercise_2_10_attractrepel.pde | 55 - .../Exercise_2_10_attractrepel/Mover.pde | 73 - .../Extra_instantforce/Extra_instantforce.pde | 57 - .../chp2_forces/Extra_instantforce/Mover.pde | 69 - .../Attractor.pde | 42 - .../NOC_02forces_many_attraction_3D/Mover.pde | 55 - .../NOC_02forces_many_attraction_3D.pde | 53 - .../Mover.pde | 74 - .../NOC_02forces_many_mutual_boundaries.pde | 47 - .../chp2_forces/NOC_2_1_forces/Mover.pde | 57 - .../NOC_2_1_forces/NOC_2_1_forces.pde | 30 - .../chp2_forces/NOC_2_2_forces_many/Mover.pde | 57 - .../NOC_2_2_forces_many.pde | 39 - .../NOC_2_3_forces_many_realgravity/Mover.pde | 57 - .../NOC_2_3_forces_many_realgravity.pde | 37 - .../NOC_2_4_forces_friction/Mover.pde | 57 - .../NOC_2_4_forces_friction.pde | 45 - .../NOC_2_4_forces_nofriction/Mover.pde | 57 - .../NOC_2_4_forces_nofriction.pde | 45 - .../NOC_2_5_fluidresistance/Liquid.pde | 57 - .../NOC_2_5_fluidresistance/Mover.pde | 58 - .../NOC_2_5_fluidresistance.pde | 72 - .../Liquid.pde | 57 - .../Mover.pde | 58 - .../NOC_2_5_fluidresistance_sequence.pde | 74 - .../NOC_2_6_attraction/Attractor.pde | 78 - .../chp2_forces/NOC_2_6_attraction/Mover.pde | 55 - .../NOC_2_6_attraction/NOC_2_6_attraction.pde | 39 - .../NOC_2_7_attraction_many/Attractor.pde | 78 - .../NOC_2_7_attraction_many/Mover.pde | 37 - .../NOC_2_7_attraction_many.pde | 49 - .../NOC_2_8_mutual_attraction/Mover.pde | 52 - .../NOC_2_8_mutual_attraction.pde | 45 - .../AdditiveWave/AdditiveWave.pde | 69 - .../AttractionArrayWithOscillation.pde | 46 - .../Attractor.pde | 82 - .../Crawler.pde | 58 - .../Oscillator.pde | 37 - .../Exercise_3_01_exercise_baton.pde | 28 - .../Exercise_3_03_cannon/CannonBall.pde | 44 - .../Exercise_3_03_cannon.pde | 54 - .../Exercise_3_04_spiral.pde | 30 - .../Exercise_3_05_asteroids.pde | 41 - .../Exercise_3_05_asteroids/Spaceship.pde | 99 - .../Exercise_3_10_OOPWave.pde | 32 - .../Exercise_3_10_OOPWave/Wave.pde | 49 - .../Exercise_3_11_AdditiveWave.pde | 66 - .../Exercise_3_16_springs.pde | 57 - .../Exercise_3_16_springs/Mover.pde | 78 - .../Exercise_3_16_springs/Spring.pde | 52 - .../Exercise_3_16_springs_array.pde | 50 - .../Exercise_3_16_springs_array/Mover.pde | 78 - .../Exercise_3_16_springs_array/Spring.pde | 52 - .../ExtraOscillatingBody/Attractor.pde | 78 - .../ExtraOscillatingBody.pde | 40 - .../ExtraOscillatingBody/Mover.pde | 64 - .../ExtraOscillatingUpAndDown.pde | 15 - .../MultipleOscillations.pde | 34 - .../NOC_03spring_exercise_sine.pde | 25 - .../NOC_3_01_angular_motion.pde | 34 - .../Attractor.pde | 39 - .../NOC_3_02_forces_angular_motion/Mover.pde | 53 - .../NOC_3_02_forces_angular_motion.pde | 42 - .../NOC_3_03_pointing_velocity/Mover.pde | 69 - .../NOC_3_03_pointing_velocity.pde | 20 - .../NOC_3_04_PolarToCartesian.pde | 48 - .../NOC_3_04_PolarToCartesian_trail.pde | 52 - .../NOC_3_05_simple_harmonic_motion.pde | 22 - .../NOC_3_06_simple_harmonic_motion.pde | 27 - .../NOC_3_07_oscillating_objects.pde | 29 - .../Oscillator.pde | 37 - .../NOC_3_08_static_wave_lines.pde | 21 - .../NOC_3_09_exercise_additive_wave.pde | 69 - .../NOC_3_09_wave/NOC_3_09_wave.pde | 28 - .../NOC_3_09_wave_a/NOC_3_09_wave_a.pde | 31 - .../NOC_3_09_wave_b/NOC_3_09_wave_b.pde | 28 - .../NOC_3_09_wave_c/NOC_3_09_wave_c.pde | 31 - .../NOC_3_10_PendulumExample.pde | 44 - .../NOC_3_10_PendulumExample/Pendulum.pde | 98 - .../NOC_3_10_PendulumExampleSimplified.pde | 35 - .../Pendulum.pde | 64 - .../NOC_3_11_spring/Mover.pde | 78 - .../NOC_3_11_spring/NOC_3_11_spring.pde | 56 - .../NOC_3_11_spring/Spring.pde | 75 - .../OOPWaveParticles/OOPWaveParticles.pde | 32 - .../OOPWaveParticles/Particle.pde | 23 - .../OOPWaveParticles/Wave.pde | 56 - .../CircleVsBlob/CircleVsBlob.pde | 24 - .../chp4_systems/CircleVsBlob/blob.tif | Bin 120768 -> 0 bytes .../chp4_systems/CircleVsBlob/circle.tif | Bin 120768 -> 0 bytes .../CircleVsBlob/data/texture.gif | Bin 1829 -> 0 bytes .../CircleVsBlob/data/texture.psd | Bin 26456 -> 0 bytes .../Exercise_4_03_MovingParticleSystem.pde | 26 - .../Particle.pde | 50 - .../ParticleSystem.pde | 36 - .../Exercise_4_04_asteroids.pde | 41 - .../Exercise_4_04_asteroids/Particle.pde | 49 - .../ParticleSystem.pde | 30 - .../Exercise_4_04_asteroids/Spaceship.pde | 110 - .../Exercise_4_06_Shatter.pde | 21 - .../Exercise_4_06_Shatter/Particle.pde | 54 - .../Exercise_4_06_Shatter/ParticleSystem.pde | 45 - .../Exercise_4_10_particleintersection.pde | 18 - .../Particle.pde | 73 - .../ParticleSystem.pde | 43 - .../Exercise_4_10_particlerepel.pde | 21 - .../Exercise_4_10_particlerepel/Particle.pde | 70 - .../ParticleSystem.pde | 48 - .../Exercise_4_12_ArrayofImages.pde | 39 - .../Exercise_4_12_ArrayofImages/Particle.pde | 59 - .../ParticleSystem.pde | 55 - .../data/texture.psd | Bin 26028 -> 0 bytes .../NOC_4_01_SingleParticle.pde | 25 - .../NOC_4_01_SingleParticle/Particle.pde | 52 - .../NOC_4_01_SingleParticle_trail.pde | 27 - .../Particle.pde | 50 - .../NOC_4_02_ArrayListParticles.pde | 29 - .../NOC_4_02_ArrayListParticles/Particle.pde | 50 - .../NOC_4_03_ParticleSystemClass.pde | 16 - .../NOC_4_03_ParticleSystemClass/Particle.pde | 50 - .../ParticleSystem.pde | 33 - .../NOC_4_04_SystemofSystems.pde | 34 - .../NOC_4_04_SystemofSystems/Particle.pde | 50 - .../ParticleSystem.pde | 48 - .../Confetti.pde | 29 - ..._ParticleSystemInheritancePolymorphism.pde | 16 - .../Particle.pde | 51 - .../ParticleSystem.pde | 36 - .../NOC_4_06_ParticleSystemForces.pde | 21 - .../Particle.pde | 56 - .../ParticleSystem.pde | 35 - .../NOC_4_07_ParticleSystemForcesRepeller.pde | 26 - .../Particle.pde | 56 - .../ParticleSystem.pde | 44 - .../Repeller.pde | 39 - .../NOC_4_08_ParticleSystemSmoke.pde | 54 - .../NOC_4_08_ParticleSystemSmoke/Particle.pde | 61 - .../ParticleSystem.pde | 49 - .../data/texture.psd | Bin 26456 -> 0 bytes .../NOC_4_08_ParticleSystemSmoke_b.pde | 59 - .../Particle.pde | 64 - .../ParticleSystem.pde | 63 - .../data/texture.psd | Bin 26456 -> 0 bytes .../NOC_4_09_AdditiveBlending.pde | 37 - .../NOC_4_09_AdditiveBlending/Particle.pde | 52 - .../ParticleSystem.pde | 52 - .../data/texture.psd | Bin 26028 -> 0 bytes .../Particle.pde | 61 - .../ParticleChild.pde | 24 - .../ParticleSystem.pde | 36 - .../ParticleSystemInheritance_pushpop.pde | 16 - .../flight404_particles_1_simple/NOC_gl.pde | 13 - .../flight404_particles_1_simple/emitter.pde | 89 - .../flight404_particles_1_simple.pde | 158 - .../flight404_particles_1_simple/particle.pde | 208 - .../NOC_gl.pde | 49 - .../cursor.pde | 25 - .../emitter.pde | 182 - .../flight404_particles_2_GLtexture.pde | 210 - .../images.pde | 13 - .../nebula.pde | 56 - .../particle.pde | 171 - .../flight404_particles_2_GLtexture/pov.pde | 62 - .../flight404_particles_2_simple/NOC_gl.pde | 31 - .../flight404_particles_2_simple/cursor.pde | 25 - .../flight404_particles_2_simple/emitter.pde | 149 - .../flight404_particles_2_simple.pde | 177 - .../flight404_particles_2_simple/images.pde | 13 - .../flight404_particles_2_simple/nebula.pde | 56 - .../flight404_particles_2_simple/particle.pde | 172 - .../flight404_particles_2_simple/pov.pde | 64 - .../chp4_systems/simpleInheritance/Circle.pde | 34 - .../chp4_systems/simpleInheritance/Shape.pde | 28 - .../chp4_systems/simpleInheritance/Square.pde | 23 - .../simpleInheritance/simpleInheritance.pde | 25 - .../simplePolymorphism/Circle.pde | 34 - .../chp4_systems/simplePolymorphism/Shape.pde | 26 - .../simplePolymorphism/Square.pde | 23 - .../simplePolymorphism/simplePolymorphism.pde | 28 - .../CollisionsEqualMass.pde | 34 - .../CollisionsEqualMass/Mover.pde | 100 - .../CollisionsEqualMass/drawVector.pde | 25 - .../box2d/BlobSkeleton/Blob.pde | 195 - .../box2d/BlobSkeleton/BlobSkeleton.pde | 109 - .../box2d/BlobSkeleton/Boundary.pde | 53 - .../box2d/BlobSkeleton/Box.pde | 85 - .../box2d/BlobSkeleton/Spring.pde | 75 - .../box2d/Blobby/Blob.pde | 118 - .../box2d/Blobby/Blobby.pde | 63 - .../box2d/Blobby/Boundary.pde | 53 - .../Boundary.pde | 55 - .../CollisionListeningDeletionExercise.pde | 118 - .../Particle.pde | 95 - .../box2d/CollisionsAndControl/Box.pde | 85 - .../CollisionsAndControl.pde | 150 - .../box2d/CollisionsAndControl/Particle.pde | 91 - .../box2d/CollisionsAndControl/Spring.pde | 81 - .../CollisionsAndControlInterface/Box.pde | 85 - .../CollisionsAndControlInterface.pde | 111 - .../ContactListener.pde | 56 - .../Particle.pde | 91 - .../CollisionsAndControlInterface/Spring.pde | 81 - .../Boundary.pde | 53 - .../Box.pde | 96 - .../Exercise_5_10_ApplyForceAttractMouse.pde | 82 - .../Boundary.pde | 53 - .../Box.pde | 87 - .../Exercise_5_10_ApplyForceSimpleWind.pde | 83 - .../Attractor.pde | 69 - .../Exercise_5_10_AttractionApplyForce.pde | 57 - .../Mover.pde | 63 - .../Exercise_5_3_NoiseChain.pde | 69 - .../Exercise_5_3_NoiseChain/Particle.pde | 89 - .../box2d/Exercise_5_3_NoiseChain/Surface.pde | 78 - .../Exercise_5_3_SineChain.pde | 69 - .../box2d/Exercise_5_3_SineChain/Particle.pde | 89 - .../box2d/Exercise_5_3_SineChain/Surface.pde | 69 - .../box2d/Exercise_5_6_Bridge/Box.pde | 88 - .../box2d/Exercise_5_6_Bridge/Bridge.pde | 66 - .../Exercise_5_6_Bridge.pde | 82 - .../box2d/Exercise_5_6_Bridge/Particle.pde | 78 - .../box2d/KinematicTest/Box.pde | 102 - .../box2d/KinematicTest/KinematicTest.pde | 141 - .../box2d/KinematicTest/Particle.pde | 93 - .../box2d/Liquidy/Boundary.pde | 61 - .../box2d/Liquidy/Liquidy.pde | 71 - .../box2d/Liquidy/Particle.pde | 98 - .../box2d/Liquidy/ParticleSystem.pde | 61 - .../box2d/MouseKinematic/Boundary.pde | 61 - .../box2d/MouseKinematic/Box.pde | 105 - .../box2d/MouseKinematic/MouseKinematic.pde | 75 - .../box2d/NOC_5_1_box2d_exercise/Box.pde | 27 - .../NOC_5_1_box2d_exercise.pde | 27 - .../NOC_5_1_box2d_exercise_solved/Box.pde | 59 - .../NOC_5_1_box2d_exercise_solved.pde | 40 - .../box2d/NOC_5_2_Boxes/Boundary.pde | 53 - .../box2d/NOC_5_2_Boxes/Box.pde | 87 - .../box2d/NOC_5_2_Boxes/NOC_5_2_Boxes.pde | 71 - .../NOC_5_3_ChainShape_Simple.pde | 69 - .../NOC_5_3_ChainShape_Simple/Particle.pde | 89 - .../NOC_5_3_ChainShape_Simple/Surface.pde | 52 - .../box2d/NOC_5_4_Polygons/Boundary.pde | 59 - .../box2d/NOC_5_4_Polygons/CustomShape.pde | 90 - .../NOC_5_4_Polygons/NOC_5_4_Polygons.pde | 71 - .../box2d/NOC_5_5_MultiShapes/Boundary.pde | 61 - .../box2d/NOC_5_5_MultiShapes/Lollipop.pde | 88 - .../NOC_5_5_MultiShapes.pde | 71 - .../box2d/NOC_5_6_DistanceJoint/Boundary.pde | 53 - .../NOC_5_6_DistanceJoint.pde | 78 - .../box2d/NOC_5_6_DistanceJoint/Pair.pde | 47 - .../box2d/NOC_5_6_DistanceJoint/Particle.pde | 76 - .../box2d/NOC_5_7_RevoluteJoint/Box.pde | 72 - .../NOC_5_7_RevoluteJoint.pde | 87 - .../box2d/NOC_5_7_RevoluteJoint/Particle.pde | 84 - .../box2d/NOC_5_7_RevoluteJoint/Windmill.pde | 61 - .../box2d/NOC_5_8_MouseJoint/Boundary.pde | 62 - .../box2d/NOC_5_8_MouseJoint/Box.pde | 88 - .../NOC_5_8_MouseJoint/NOC_5_8_MouseJoint.pde | 83 - .../box2d/NOC_5_8_MouseJoint/Spring.pde | 77 - .../NOC_5_9_CollisionListening/Boundary.pde | 55 - .../NOC_5_9_CollisionListening.pde | 108 - .../NOC_5_9_CollisionListening/Particle.pde | 90 - .../box2d/VectorStuff/VectorStuff.pde | 56 - .../chp5_physicslibraries/readme.txt | 3 - .../Blanket.pde | 55 - .../Connection.pde | 15 - .../Exercise_5_13_SoftBodySquareAdapted.pde | 64 - .../Particle.pde | 21 - .../Cluster.pde | 98 - .../Exercise_5_15_ForceDirectedGraph.pde | 133 - .../Exercise_5_15_ForceDirectedGraph/Node.pde | 26 - .../NOC_5_10_SimpleSpring.pde | 68 - .../NOC_5_10_SimpleSpring/Particle.pde | 22 - .../NOC_5_11_SoftStringPendulum/Chain.pde | 103 - .../NOC_5_11_SoftStringPendulum.pde | 68 - .../NOC_5_11_SoftStringPendulum/Particle.pde | 24 - .../NOC_5_12_SimpleCluster/Cluster.pde | 64 - .../NOC_5_12_SimpleCluster.pde | 74 - .../toxiclibs/NOC_5_12_SimpleCluster/Node.pde | 27 - .../NOC_5_13_AttractRepel/Attractor.pde | 21 - .../NOC_5_13_AttractRepel.pde | 40 - .../NOC_5_13_AttractRepel/Particle.pde | 24 - .../chp6_agents/Alignment/Alignment.pde | 44 - .../chp6_agents/Alignment/Vehicle.pde | 89 - .../Exercise_6_04_Wander.pde | 28 - .../Exercise_6_04_Wander/Vehicle.pde | 123 - .../Exercise_6_08_FlowField3DNoise.pde | 52 - .../FlowField.pde | 81 - .../Vehicle.pde | 87 - .../Exercise_6_09_AngleBetween.pde | 54 - .../Exercise_6_13_CrowdPathFollowing.pde | 77 - .../Exercise_6_13_CrowdPathFollowing/Path.pde | 52 - .../Vehicle.pde | 240 - .../chp6_agents/Exercise_6_17_View/Boid.pde | 242 - .../Exercise_6_17_View/Exercise_6_17_View.pde | 31 - .../chp6_agents/Exercise_6_17_View/Flock.pde | 37 - .../chp6_agents/FlowfieldImage/FlowField.pde | 85 - .../FlowfieldImage/FlowfieldImage.pde | 59 - .../chp6_agents/FlowfieldImage/Vehicle.pde | 87 - .../NOC_6_01_Seek/NOC_6_01_Seek.pde | 35 - .../chp6_agents/NOC_6_01_Seek/Vehicle.pde | 77 - .../NOC_6_01_Seek_trail.pde | 33 - .../NOC_6_01_Seek_trail/Vehicle.pde | 91 - .../NOC_6_02_Arrive/NOC_6_02_Arrive.pde | 30 - .../chp6_agents/NOC_6_02_Arrive/Vehicle.pde | 80 - .../NOC_6_03_StayWithinWalls.pde | 36 - .../NOC_6_03_StayWithinWalls/Vehicle.pde | 92 - .../NOC_6_03_StayWithinWalls_trail.pde | 37 - .../Vehicle.pde | 108 - .../NOC_6_04_Flow_Figures/FlowField.pde | 94 - .../NOC_6_04_Flow_Figures.pde | 35 - .../NOC_6_04_Flow_Figures/Vehicle.pde | 87 - .../NOC_6_04_Flow_Figures/data/arrow.svg | 5149 - .../NOC_6_04_Flowfield/FlowField.pde | 79 - .../NOC_6_04_Flowfield/NOC_6_04_Flowfield.pde | 55 - .../NOC_6_04_Flowfield/Vehicle.pde | 87 - .../NOC_6_05_PathFollowingSimple.pde | 55 - .../NOC_6_05_PathFollowingSimple/Path.pde | 44 - .../NOC_6_05_PathFollowingSimple/Vehicle.pde | 160 - .../NOC_6_06_PathFollowing.pde | 67 - .../NOC_6_06_PathFollowing/Path.pde | 59 - .../NOC_6_06_PathFollowing/Vehicle.pde | 192 - .../NOC_6_07_Separation.pde | 44 - .../NOC_6_07_Separation/Vehicle.pde | 99 - .../NOC_6_08_SeparationAndSeek.pde | 39 - .../NOC_6_08_SeparationAndSeek/Vehicle.pde | 113 - .../chp6_agents/NOC_6_09_Flocking/Boid.pde | 182 - .../chp6_agents/NOC_6_09_Flocking/Flock.pde | 25 - .../NOC_6_09_Flocking/NOC_6_09_Flocking.pde | 38 - .../SimpleScalarProjection.pde | 41 - .../StayWithinCircle/StayWithinCircle.pde | 41 - .../chp6_agents/StayWithinCircle/Vehicle.pde | 93 - .../intersection/intersection/Thing.pde | 33 - .../intersection/intersection.pde | 105 - .../intersection/intersection_slow/Thing.pde | 33 - .../intersection_slow/intersection_slow.pde | 57 - .../chp6_agents/box2d/Flocking_box2d/Boid.pde | 257 - .../box2d/Flocking_box2d/Flock.pde | 27 - .../box2d/Flocking_box2d/Flocking_box2d.pde | 54 - .../chp6_agents/flocking_sliders/Boid.pde | 185 - .../chp6_agents/flocking_sliders/Flock.pde | 25 - .../flocking_sliders/flocking_sliders.pde | 57 - .../flocking_sliders/keyPressed.pde | 3 - .../flocking_sliders/scrollbar.pde | 137 - .../CA.pde | 98 - ...xercise_7_01_WolframCA_randomizedrules.pde | 45 - .../Exercise_7_04_WolframCA_scrolling/CA.pde | 97 - .../Exercise_7_04_WolframCA_scrolling.pde | 31 - .../CA.pde | 107 - .../Exercise_7_04_WolframCA_scrolling_110.pde | 29 - .../CA.pde | 107 - .../Exercise_7_04_WolframCA_scrolling_190.pde | 30 - .../CA.pde | 107 - .../Exercise_7_04_WolframCA_scrolling_222.pde | 30 - .../CA.pde | 106 - .../Exercise_7_04_WolframCA_scrolling_30.pde | 30 - .../Exercise_7_09_HexagonCells/Cell.pde | 42 - .../Exercise_7_09_HexagonCells.pde | 24 - .../Exercise_7_09_HexagonCells/GOL.pde | 44 - .../Figure_7_17_cells/Figure_7_17_cells.pde | 31 - .../chp7_CA/Figure_7_17_cells/cells.tif | Bin 486768 -> 0 bytes .../chp7_CA/GameOfLifeWrapAround/GOL.pde | 77 - .../GameOfLifeWrapAround.pde | 33 - .../chp7_CA/HexagonCells/Cell.pde | 42 - .../chp7_CA/HexagonCells/GOL.pde | 44 - .../chp7_CA/HexagonCells/HexagonCells.pde | 24 - .../chp7_CA/NOC_7_01_WolframCA_figures/CA.pde | 95 - .../NOC_7_01_WolframCA_figures.pde | 38 - .../chp7_CA/NOC_7_01_WolframCA_simple/CA.pde | 70 - .../NOC_7_01_WolframCA_simple.pde | 24 - .../chp7_CA/NOC_7_02_GameOfLifeSimple/GOL.pde | 77 - .../NOC_7_02_GameOfLifeSimple.pde | 30 - .../chp7_CA/NOC_7_03_GameOfLifeOOP/Cell.pde | 40 - .../chp7_CA/NOC_7_03_GameOfLifeOOP/GOL.pde | 73 - .../NOC_7_03_GameOfLifeOOP.pde | 27 - .../CantorSetArrayList/CantorSetArrayList.pde | 48 - .../chp8_fractals/CantorSetArrayList/Line.pde | 23 - .../Exercise_8_01_RecursionLines.pde | 36 - .../Exercise_8_02_KochSnowFlake.pde | 55 - .../Exercise_8_02_KochSnowFlake/KochLine.pde | 75 - .../Exercise_8_06_Tree/Exercise_8_06_Tree.pde | 58 - .../Exercise_8_07_Tree/Exercise_8_07_Tree.pde | 51 - .../Branch.pde | 68 - .../Exercise_8_08_09_TreeArrayListLeaves.pde | 59 - .../Leaf.pde | 23 - .../Exercise_8_10_TreeStochasticNoise.pde | 74 - .../Figure_8_02_Mandelbrot.pde | 80 - .../Figure_8_14_Koch/Figure_8_14_Koch.pde | 67 - .../Figure_8_14_Koch/KochLine.pde | 74 - .../Figure_8_20_Tree/Figure_8_20_Tree.pde | 55 - .../Figure_8_CantorLine.pde | 23 - .../NOC_8_01_Recursion/NOC_8_01_Recursion.pde | 27 - .../NOC_8_02_Recursion/NOC_8_02_Recursion.pde | 28 - .../NOC_8_03_Recursion/NOC_8_03_Recursion.pde | 29 - .../NOC_8_04_CantorSet/NOC_8_04_CantorSet.pde | 39 - .../NOC_8_04_Tree/NOC_8_04_Tree.pde | 53 - .../NOC_8_05_Koch/KochFractal.pde | 71 - .../chp8_fractals/NOC_8_05_Koch/KochLine.pde | 74 - .../NOC_8_05_Koch/NOC_8_05_Koch.pde | 30 - .../NOC_8_05_KochSimple/KochLine.pde | 73 - .../NOC_8_05_KochSimple.pde | 51 - .../NOC_8_06_SimpleLSystem.pde | 48 - .../NOC_8_06_Tree/NOC_8_06_Tree.pde | 53 - .../NOC_8_06_Tree_static.pde | 45 - .../NOC_8_07_TreeStochastic.pde | 66 - .../NOC_8_07_TreeStochastic_angleonly.pde | 59 - .../NOC_8_08_SimpleLSystem.pde | 48 - .../NOC_8_09_LSystem/LSystem.pde | 63 - .../NOC_8_09_LSystem/NOC_8_09_LSystem.pde | 63 - .../chp8_fractals/NOC_8_09_LSystem/Rule.pde | 26 - .../chp8_fractals/NOC_8_09_LSystem/Turtle.pde | 54 - .../chp9_ga/EvolveFlowField/DNA.pde | 82 - .../EvolveFlowField/EvolveFlowField.pde | 121 - .../chp9_ga/EvolveFlowField/Obstacle.pde | 39 - .../chp9_ga/EvolveFlowField/Population.pde | 142 - .../chp9_ga/EvolveFlowField/Rocket.pde | 171 - .../GA_Shakespeare_fancyfitness/DNA.pde | 70 - .../GA_Shakespeare_fancyfitness.pde | 89 - .../Population.pde | 127 - .../chp9_ga/NOC_9_01_GA_Shakespeare/DNA.pde | 72 - .../NOC_9_01_GA_Shakespeare.pde | 90 - .../NOC_9_01_GA_Shakespeare/Population.pde | 127 - .../DNA.pde | 70 - .../NOC_9_01_GA_Shakespeare_simplified.pde | 89 - .../NOC_9_02_SmartRockets_superbasic/DNA.pde | 58 - .../NOC_9_02_SmartRockets_superbasic.pde | 74 - .../Population.pde | 103 - .../Rocket.pde | 108 - .../chp9_ga/NOC_9_03_SmartRockets/DNA.pde | 68 - .../NOC_9_03_SmartRockets.pde | 94 - .../NOC_9_03_SmartRockets/Obstacle.pde | 40 - .../NOC_9_03_SmartRockets/Population.pde | 113 - .../chp9_ga/NOC_9_03_SmartRockets/Rocket.pde | 148 - .../Button.pde | 56 - .../DNA.pde | 49 - .../Face.pde | 103 - .../NOC_9_04_Faces_interactiveselection.pde | 48 - .../Population.pde | 102 - .../Rectangle.pde | 25 - .../NOC_9_05_EvolutionEcosystem/Bloop.pde | 108 - .../NOC_9_05_EvolutionEcosystem/DNA.pde | 44 - .../NOC_9_05_EvolutionEcosystem/Food.pde | 44 - .../NOC_9_05_EvolutionEcosystem.pde | 37 - .../NOC_9_05_EvolutionEcosystem/World.pde | 56 - .../chp9_ga/bruteforce/bruteforce.pde | 18 - .../Exercise_I_10_NoiseLandscape.pde | 32 - .../Landscape.pde | 67 - .../Exercise_I_1_WalkerTendsToDownRight.pde | 20 - .../Walker.pde | 39 - .../Exercise_I_9_Noise3D.pde | 47 - .../Figure_I_2_BellCurve.pde | 38 - .../Figure_I_5_Noise1DGraph.pde | 28 - .../Figure_I_6_RandomGraph.pde | 23 - .../introduction/Gaussian2/Gaussian2.pde | 48 - .../MonteCarloDistribution.pde | 65 - .../MultipleProbability.pde | 38 - .../NOC_I_1_RandomWalkTraditional.pde | 20 - .../NOC_I_1_RandomWalkTraditional/Walker.pde | 38 - .../NOC_I_2_RandomDistribution.pde | 30 - .../NOC_I_3_RandomWalkTendsToRight.pde | 20 - .../NOC_I_3_RandomWalkTendsToRight/Walker.pde | 39 - .../NOC_I_4_Gaussian/NOC_I_4_Gaussian.pde | 26 - .../NOC_I_5_NoiseWalk/NOC_I_5_NoiseWalk.pde | 22 - .../introduction/NOC_I_5_NoiseWalk/Walker.pde | 33 - .../introduction/Noise1D/Noise1D.pde | 30 - .../introduction/Noise2D/Noise2D.pde | 41 - .../NoiseDistribution/NoiseDistribution.pde | 35 - .../NoiseWalkAcceleration.pde | 22 - .../NoiseWalkAcceleration/Walker.pde | 65 - .../NoiseWalkVelocity/NoiseWalkVelocity.pde | 24 - .../introduction/NoiseWalkVelocity/Walker.pde | 60 - .../NoiseWalk_Many/NoiseWalk_Many.pde | 35 - .../introduction/NoiseWalk_Many/Walker.pde | 34 - .../introduction/RandomWalk/RandomWalk.pde | 24 - .../introduction/RandomWalk/Walker.pde | 34 - .../RandomWalkLevy/RandomWalkLevy.pde | 20 - .../introduction/RandomWalkLevy/Walker.pde | 54 - .../RandomWalkNoise/RandomWalkNoise.pde | 19 - .../introduction/RandomWalkNoise/Walker.pde | 39 - .../RandomWalkPVector/RandomWalkPVector.pde | 24 - .../introduction/RandomWalkPVector/Walker.pde | 31 - .../RandomWalkTraditional2.pde | 20 - .../RandomWalkTraditional2/Walker.pde | 29 - .../RandomWalkTraditional3.pde | 20 - .../RandomWalkTraditional3/Walker.pde | 30 - .../RandomWalkTrail/RandomWalkTrail.pde | 24 - .../introduction/RandomWalkTrail/Walker.pde | 49 - .../RandomWalkTrailCurve.pde | 20 - .../RandomWalkTrailCurve/Walker.pde | 42 - .../SelfAvoidingWalk/SelfAvoidingWalk.pde | 20 - .../introduction/SelfAvoidingWalk/Walker.pde | 73 - .../introduction/SelfAvoidingWalk/goal.svg | 2353 - .../SimpleProbablility/SimpleProbablility.pde | 34 - .../Appendices/Appendix A/Ex_01/Ex_01.pde | 3 - .../Appendices/Appendix A/Ex_02/Ex_02.pde | 4 - .../Appendices/Appendix A/Ex_03/Ex_03.pde | 4 - .../Appendices/Appendix A/Ex_04/Ex_04.pde | 4 - .../Appendices/Appendix B/Ex_01/Ex_01.pde | 2 - .../Appendices/Appendix B/Ex_02/Ex_02.pde | 2 - .../Appendices/Appendix D/Ex_01/Ex_01.pde | 4 - .../Appendices/Appendix E/Ex_01/Ex_01.pde | 6 - .../Appendices/Appendix E/Ex_02/Ex_02.pde | 5 - .../Appendices/Appendix E/Ex_03/Ex_03.pde | 5 - .../Appendices/Appendix E/Ex_04/Ex_04.pde | 5 - .../Appendices/Appendix E/Ex_05/Ex_05.pde | 8 - .../Appendices/Appendix E/Ex_06/Ex_06.pde | 10 - .../Appendices/Appendix E/Ex_07/Ex_07.pde | 9 - .../Appendices/Appendix E/Ex_08/Ex_08.pde | 7 - .../Appendices/Appendix E/Ex_09/Ex_09.pde | 8 - .../Appendices/Appendix E/Ex_10/Ex_10.pde | 17 - .../Extensions/3D/Ex_01/Ex_01.pde | 16 - .../Extensions/3D/Ex_02/Ex_02.pde | 22 - .../Extensions/3D/Ex_03/Ex_03.pde | 61 - .../Extensions/3D/Ex_04/Ex_04.pde | 41 - .../Extensions/3D/Ex_05/Ex_05.pde | 24 - .../Extensions/3D/Ex_05/data/chair.obj | 418 - .../Extensions/3D/Ex_06/Ex_06.pde | 20 - .../Extensions/3D/Ex_07/Ex_07.pde | 19 - .../Extensions/3D/Ex_08/Ex_08.pde | 27 - .../Extensions/3D/Ex_09/Ex_09.pde | 40 - .../Extensions/Electronics/Ex_01A/Ex_01A.pde | 16 - .../Extensions/Electronics/Ex_01B/Ex_01B.pde | 25 - .../Extensions/Electronics/Ex_02A/Ex_02A.pde | 13 - .../Extensions/Electronics/Ex_02B/Ex_02B.pde | 23 - .../Extensions/Electronics/Ex_03A/Ex_03A.pde | 20 - .../Extensions/Electronics/Ex_03B/Ex_03B.pde | 28 - .../Extensions/Electronics/Ex_04A/Ex_04A.pde | 19 - .../Extensions/Electronics/Ex_04B/Ex_04B.pde | 32 - .../Extensions/Electronics/Ex_05A/Ex_05A.pde | 20 - .../Extensions/Electronics/Ex_05B/Ex_05B.pde | 56 - .../Extensions/Mobile/Ex_01/Ex_01.pde | 10 - .../Extensions/Mobile/Ex_02/Ex_02.pde | 21 - .../Extensions/Mobile/Ex_03/Ex_03.pde | 18 - .../Extensions/Mobile/Ex_04/Ex_04.pde | 80 - .../Extensions/Mobile/Ex_05/Ex_05.pde | 14 - .../Extensions/Mobile/Ex_06/Ex_06.pde | 18 - .../Extensions/Mobile/Ex_07/Ex_07.pde | 18 - .../Extensions/Mobile/Ex_08/Ex_08.pde | 30 - .../Extensions/Network/Ex_01/Ex_01.pde | 21 - .../Extensions/Network/Ex_02A/Ex_02A.pde | 34 - .../Extensions/Network/Ex_02B/Ex_02B.pde | 33 - .../Extensions/Network/Ex_03/Ex_03.pde | 40 - .../Extensions/Network/Ex_04/Ex_04.pde | 68 - .../Network/Ex_04/data/CourierNew-12.vlw | Bin 20170 -> 0 bytes .../Extensions/Print/Ex_01/Ex_01.pde | 7 - .../Extensions/Print/Ex_02/Ex_02.pde | 9 - .../Extensions/Print/Ex_03/Ex_03.pde | 25 - .../Extensions/Print/Ex_04/Ex_04.pde | 22 - .../Extensions/Print/Ex_05/Ex_05.pde | 10 - .../Extensions/Print/Ex_06/Ex_06.pde | 31 - .../Extensions/Sound/Ex_01/Ex_01.pde | 66 - .../Extensions/Sound/Ex_02/Ex_02.pde | 47 - .../Extensions/Sound/Ex_03/Ex_03.pde | 88 - .../Extensions/Sound/Ex_03/data/cela3.aif | Bin 176652 -> 0 bytes .../Extensions/Sound/Ex_04/Ex_04.pde | 51 - .../Extensions/Sound/Ex_04/data/guitar.aif | Bin 3284764 -> 0 bytes .../Extensions/Sound/Ex_05/Ex_05.pde | 43 - .../Extensions/Sound/Ex_05/data/test.aif | Bin 1546294 -> 0 bytes .../Extensions/Vision/Ex_01/Ex_01.pde | 54 - .../Extensions/Vision/Ex_02/Ex_02.pde | 59 - .../Extensions/Vision/Ex_03/Ex_03.pde | 49 - .../Extensions/Vision/Ex_04/Ex_04.pde | 44 - .../Illustrations/page_022/page_022.pde | 32 - .../Illustrations/page_042/page_042.pde | 35 - .../Illustrations/page_060/page_060.pde | 21 - .../Illustrations/page_078/page_078.pde | 28 - .../Illustrations/page_094/page_094.pde | 21 - .../Illustrations/page_100/page_100.pde | 45 - .../Illustrations/page_110/page_110.pde | 32 - .../Illustrations/page_126/page_126.pde | 21 - .../Illustrations/page_136/page_136.pde | 17 - .../Illustrations/page_144/page_144.pde | 23 - .../Illustrations/page_148/data/Thumbs.db | Bin 9728 -> 0 bytes .../Illustrations/page_148/page_148.pde | 304 - .../Illustrations/page_172/page_172.pde | 48 - .../Illustrations/page_216/page_216.pde | 25 - .../Illustrations/page_222/page_222.pde | 52 - .../Illustrations/page_228/page_228.pde | 46 - .../Illustrations/page_250/page_250.pde | 40 - .../Illustrations/page_254/page_254.pde | 108 - .../Illustrations/page_278/page_278.pde | 78 - .../Illustrations/page_290/page_290.pde | 60 - .../Illustrations/page_300/page_300.pde | 76 - .../page_314/data/PT_Shifty_0000.gif | Bin 314 -> 0 bytes .../page_314/data/PT_Shifty_0001.gif | Bin 314 -> 0 bytes .../page_314/data/PT_Shifty_0002.gif | Bin 318 -> 0 bytes .../page_314/data/PT_Shifty_0003.gif | Bin 328 -> 0 bytes .../page_314/data/PT_Shifty_0004.gif | Bin 343 -> 0 bytes .../page_314/data/PT_Shifty_0005.gif | Bin 379 -> 0 bytes .../page_314/data/PT_Shifty_0006.gif | Bin 420 -> 0 bytes .../page_314/data/PT_Shifty_0007.gif | Bin 501 -> 0 bytes .../page_314/data/PT_Shifty_0008.gif | Bin 615 -> 0 bytes .../page_314/data/PT_Shifty_0009.gif | Bin 733 -> 0 bytes .../page_314/data/PT_Shifty_0010.gif | Bin 806 -> 0 bytes .../page_314/data/PT_Shifty_0011.gif | Bin 842 -> 0 bytes .../page_314/data/PT_Shifty_0012.gif | Bin 877 -> 0 bytes .../page_314/data/PT_Shifty_0013.gif | Bin 877 -> 0 bytes .../page_314/data/PT_Shifty_0014.gif | Bin 951 -> 0 bytes .../page_314/data/PT_Shifty_0015.gif | Bin 934 -> 0 bytes .../page_314/data/PT_Shifty_0016.gif | Bin 917 -> 0 bytes .../page_314/data/PT_Shifty_0017.gif | Bin 907 -> 0 bytes .../page_314/data/PT_Shifty_0018.gif | Bin 907 -> 0 bytes .../page_314/data/PT_Shifty_0019.gif | Bin 892 -> 0 bytes .../page_314/data/PT_Shifty_0020.gif | Bin 854 -> 0 bytes .../page_314/data/PT_Shifty_0021.gif | Bin 841 -> 0 bytes .../page_314/data/PT_Shifty_0022.gif | Bin 886 -> 0 bytes .../page_314/data/PT_Shifty_0023.gif | Bin 805 -> 0 bytes .../page_314/data/PT_Shifty_0024.gif | Bin 733 -> 0 bytes .../page_314/data/PT_Shifty_0025.gif | Bin 667 -> 0 bytes .../page_314/data/PT_Shifty_0026.gif | Bin 596 -> 0 bytes .../page_314/data/PT_Shifty_0027.gif | Bin 539 -> 0 bytes .../page_314/data/PT_Shifty_0028.gif | Bin 503 -> 0 bytes .../page_314/data/PT_Shifty_0029.gif | Bin 451 -> 0 bytes .../page_314/data/PT_Shifty_0030.gif | Bin 392 -> 0 bytes .../page_314/data/PT_Shifty_0031.gif | Bin 351 -> 0 bytes .../page_314/data/PT_Shifty_0032.gif | Bin 333 -> 0 bytes .../page_314/data/PT_Shifty_0033.gif | Bin 323 -> 0 bytes .../page_314/data/PT_Shifty_0034.gif | Bin 316 -> 0 bytes .../page_314/data/PT_Shifty_0035.gif | Bin 316 -> 0 bytes .../page_314/data/PT_Shifty_0036.gif | Bin 315 -> 0 bytes .../page_314/data/PT_Shifty_0037.gif | Bin 312 -> 0 bytes .../Illustrations/page_314/page_314.pde | 61 - .../Illustrations/page_326/page_326.pde | 99 - .../Illustrations/page_346/page_346.pde | 19 - .../Illustrations/page_366/page_366.pde | 37 - .../Illustrations/page_394/page_394.pde | 81 - .../Illustrations/page_412/page_412.pde | 29 - .../Illustrations/page_420/page_420.pde | 30 - .../Illustrations/page_476/ArrowParticle.pde | 26 - .../Illustrations/page_476/Particle.pde | 24 - .../Illustrations/page_476/page_476.pde | 45 - .../Illustrations/page_xx/page_xx.pde | 44 - .../Synthesis_01_collage_01.pde | 26 - .../Synthesis_01_collage_02.pde | 313 - .../Synthesis_02_waves_01.pde | 23 - .../Synthesis_02_waves_02.pde | 27 - .../Synthesis_02_waves_03.pde | 70 - .../Synthesis_02_waves_04.pde | 34 - .../Synthesis_02_waves_05.pde | 37 - .../Synthesis_03_grids_01.pde | 20 - .../Synthesis_03_grids_02.pde | 30 - .../Synthesis_03_grids_03.pde | 30 - .../Synthesis_03_grids_04.pde | 36 - .../Synthesis_03_grids_05.pde | 42 - .../Synthesis_04_mandelbrot.pde | 47 - .../Synthesis_05_tennis.pde | 103 - .../Synthesis_06_cursor.pde | 304 - .../data/NewsGothicBT-Bold-48.vlw | Bin 179002 -> 0 bytes .../Synthesis_07_typing.pde | 229 - .../data/TheSerif-Plain-128.vlw | Bin 1131851 -> 0 bytes .../data/TheSerif-Plain-96.vlw | Bin 641509 -> 0 bytes .../Synthesis_08_clock/Synthesis_08_clock.pde | 190 - .../Synthesis_09_centipede.pde | 90 - .../Synthesis_10_chronodraw.pde | 236 - .../Synthesis_11_amoebaAbstract.pde | 175 - .../Synthesis_12_robot/Synthesis_12_robot.pde | 88 - .../Synthesis_12_robot/data/battalpha.gif | Bin 516 -> 0 bytes .../Synthesis_12_robot/data/batteat.gif | Bin 163 -> 0 bytes .../Synthesis_12_robot/data/batteatalpha.gif | Bin 754 -> 0 bytes .../Synthesis_12_robot/data/headalpha.gif | Bin 1616 -> 0 bytes .../Synthesis_13_withoutTitle/Module.pde | 18 - .../Synthesis_13_withoutTitle/ModuleA.pde | 33 - .../Synthesis_13_withoutTitle/ModuleB.pde | 27 - .../Synthesis_13_withoutTitle.pde | 78 - .../Synthesis_13_withoutTitle/data/Thumbs.db | Bin 11776 -> 0 bytes .../data/down_down.gif | Bin 63 -> 0 bytes .../data/down_hi.gif | Bin 63 -> 0 bytes .../data/down_lo.gif | Bin 63 -> 0 bytes .../data/up_down.gif | Bin 62 -> 0 bytes .../Synthesis_13_withoutTitle/data/up_hi.gif | Bin 62 -> 0 bytes .../Synthesis_13_withoutTitle/data/up_lo.gif | Bin 62 -> 0 bytes .../Synthesis_14_pond/Synthesis_14_pond.pde | 671 - .../Synthesis/Synthesis_15_tree/Branch.pde | 69 - .../Synthesis/Synthesis_15_tree/Segment.pde | 156 - .../Synthesis_15_tree/Synthesis_15_tree.pde | 102 - .../Synthesis_15_tree/data/treeData.txt | 391 - .../Synthesis_16_sodaprocessing/Button.pde | 35 - .../Synthesis_16_sodaprocessing/Control.pde | 48 - .../Synthesis_16_sodaprocessing/Mass.pde | 79 - .../Synthesis_16_sodaprocessing/Slider.pde | 48 - .../Synthesis_16_sodaprocessing/Spring.pde | 81 - .../Synthesis_16_sodaprocessing.pde | 329 - .../00 Using Processing/Ex_01/Ex_01.pde | 5 - .../00 Using Processing/Ex_02/Ex_02.pde | 9 - .../00 Using Processing/Ex_03/Ex_03.pde | 7 - .../00 Using Processing/Ex_04/Ex_04.pde | 17 - .../00 Using Processing/Ex_05/Ex_05.pde | 14 - .../00 Using Processing/Ex_06/Ex_06.pde | 16 - .../00 Using Processing/Ex_07/Ex_07.pde | 28 - .../00 Using Processing/Ex_08/Ex_08.pde | 38 - .../01 Structure 1/Ex_01/Ex_01.pde | 18 - .../01 Structure 1/Ex_02/Ex_02.pde | 8 - .../01 Structure 1/Ex_03/Ex_03.pde | 4 - .../01 Structure 1/Ex_04/Ex_04.pde | 2 - .../01 Structure 1/Ex_05/Ex_05.pde | 2 - .../01 Structure 1/Ex_06/Ex_06.pde | 5 - .../01 Structure 1/Ex_07/Ex_07.pde | 19 - .../Units 00-17/02 Shape 1/Ex_01/Ex_01.pde | 3 - .../Units 00-17/02 Shape 1/Ex_02/Ex_02.pde | 3 - .../Units 00-17/02 Shape 1/Ex_03/Ex_03.pde | 3 - .../Units 00-17/02 Shape 1/Ex_04/Ex_04.pde | 8 - .../Units 00-17/02 Shape 1/Ex_05/Ex_05.pde | 8 - .../Units 00-17/02 Shape 1/Ex_06/Ex_06.pde | 8 - .../Units 00-17/02 Shape 1/Ex_07/Ex_07.pde | 12 - .../Units 00-17/02 Shape 1/Ex_08/Ex_08.pde | 7 - .../Units 00-17/02 Shape 1/Ex_09/Ex_09.pde | 5 - .../Units 00-17/02 Shape 1/Ex_10/Ex_10.pde | 5 - .../Units 00-17/02 Shape 1/Ex_11/Ex_11.pde | 5 - .../Units 00-17/02 Shape 1/Ex_12/Ex_12.pde | 3 - .../Units 00-17/02 Shape 1/Ex_13/Ex_13.pde | 4 - .../Units 00-17/02 Shape 1/Ex_14/Ex_14.pde | 4 - .../Units 00-17/02 Shape 1/Ex_15/Ex_15.pde | 1 - .../Units 00-17/02 Shape 1/Ex_16/Ex_16.pde | 2 - .../Units 00-17/02 Shape 1/Ex_17/Ex_17.pde | 2 - .../Units 00-17/02 Shape 1/Ex_18/Ex_18.pde | 6 - .../Units 00-17/02 Shape 1/Ex_19/Ex_19.pde | 2 - .../Units 00-17/02 Shape 1/Ex_20/Ex_20.pde | 3 - .../Units 00-17/02 Shape 1/Ex_21/Ex_21.pde | 6 - .../Units 00-17/02 Shape 1/Ex_22/Ex_22.pde | 6 - .../Units 00-17/02 Shape 1/Ex_23/Ex_23.pde | 2 - .../Units 00-17/02 Shape 1/Ex_24/Ex_24.pde | 2 - .../Units 00-17/02 Shape 1/Ex_25/Ex_25.pde | 1 - .../Units 00-17/02 Shape 1/Ex_26/Ex_26.pde | 1 - .../Units 00-17/02 Shape 1/Ex_27/Ex_27.pde | 1 - .../Units 00-17/02 Shape 1/Ex_28/Ex_28.pde | 7 - .../Units 00-17/02 Shape 1/Ex_29/Ex_29.pde | 8 - .../Units 00-17/02 Shape 1/Ex_30/Ex_30.pde | 6 - .../Units 00-17/02 Shape 1/Ex_31/Ex_31.pde | 4 - .../Units 00-17/02 Shape 1/Ex_32/Ex_32.pde | 8 - .../Units 00-17/02 Shape 1/Ex_33/Ex_33.pde | 4 - .../Units 00-17/02 Shape 1/Ex_34/Ex_34.pde | 4 - .../Units 00-17/02 Shape 1/Ex_35/Ex_35.pde | 3 - .../Units 00-17/02 Shape 1/Ex_36/Ex_36.pde | 4 - .../Units 00-17/02 Shape 1/Ex_37/Ex_37.pde | 6 - .../Units 00-17/02 Shape 1/Ex_38/Ex_38.pde | 8 - .../Units 00-17/02 Shape 1/Ex_39/Ex_39.pde | 8 - .../Units 00-17/02 Shape 1/Ex_40/Ex_40.pde | 11 - .../Units 00-17/02 Shape 1/Ex_41/Ex_41.pde | 10 - .../Units 00-17/03 Data 1/Ex_01/Ex_01.pde | 6 - .../Units 00-17/03 Data 1/Ex_02/Ex_02.pde | 3 - .../Units 00-17/03 Data 1/Ex_03/Ex_03.pde | 4 - .../Units 00-17/03 Data 1/Ex_04/Ex_04.pde | 3 - .../Units 00-17/03 Data 1/Ex_05/Ex_05.pde | 2 - .../Units 00-17/03 Data 1/Ex_06/Ex_06.pde | 2 - .../Units 00-17/03 Data 1/Ex_07/Ex_07.pde | 3 - .../Units 00-17/03 Data 1/Ex_08/Ex_08.pde | 1 - .../Units 00-17/03 Data 1/Ex_09/Ex_09.pde | 2 - .../Units 00-17/03 Data 1/Ex_10/Ex_10.pde | 2 - .../Units 00-17/03 Data 1/Ex_11/Ex_11.pde | 4 - .../Units 00-17/04 Math 1/Ex_01/Ex_01.pde | 6 - .../Units 00-17/04 Math 1/Ex_02/Ex_02.pde | 5 - .../Units 00-17/04 Math 1/Ex_03/Ex_03.pde | 7 - .../Units 00-17/04 Math 1/Ex_04/Ex_04.pde | 6 - .../Units 00-17/04 Math 1/Ex_05/Ex_05.pde | 6 - .../Units 00-17/04 Math 1/Ex_06/Ex_06.pde | 8 - .../Units 00-17/04 Math 1/Ex_07/Ex_07.pde | 8 - .../Units 00-17/04 Math 1/Ex_08/Ex_08.pde | 4 - .../Units 00-17/04 Math 1/Ex_09/Ex_09.pde | 6 - .../Units 00-17/04 Math 1/Ex_10/Ex_10.pde | 2 - .../Units 00-17/04 Math 1/Ex_11/Ex_11.pde | 4 - .../Units 00-17/04 Math 1/Ex_12/Ex_12.pde | 2 - .../Units 00-17/04 Math 1/Ex_13/Ex_13.pde | 4 - .../Units 00-17/04 Math 1/Ex_14/Ex_14.pde | 2 - .../Units 00-17/04 Math 1/Ex_15/Ex_15.pde | 2 - .../Units 00-17/04 Math 1/Ex_16/Ex_16.pde | 9 - .../Units 00-17/04 Math 1/Ex_17/Ex_17.pde | 3 - .../Units 00-17/04 Math 1/Ex_18/Ex_18.pde | 3 - .../Units 00-17/04 Math 1/Ex_19/Ex_19.pde | 9 - .../Units 00-17/04 Math 1/Ex_20/Ex_20.pde | 9 - .../Units 00-17/04 Math 1/Ex_21/Ex_21.pde | 3 - .../Units 00-17/04 Math 1/Ex_22/Ex_22.pde | 4 - .../Units 00-17/04 Math 1/Ex_23/Ex_23.pde | 4 - .../Units 00-17/04 Math 1/Ex_24/Ex_24.pde | 4 - .../Units 00-17/04 Math 1/Ex_25/Ex_25.pde | 1 - .../Units 00-17/04 Math 1/Ex_26/Ex_26.pde | 6 - .../Units 00-17/05 Control 1/Ex_01/Ex_01.pde | 15 - .../Units 00-17/05 Control 1/Ex_02/Ex_02.pde | 7 - .../Units 00-17/05 Control 1/Ex_03/Ex_03.pde | 12 - .../Units 00-17/05 Control 1/Ex_04/Ex_04.pde | 9 - .../Units 00-17/05 Control 1/Ex_05/Ex_05.pde | 12 - .../Units 00-17/05 Control 1/Ex_06/Ex_06.pde | 8 - .../Units 00-17/05 Control 1/Ex_07/Ex_07.pde | 9 - .../Units 00-17/05 Control 1/Ex_08/Ex_08.pde | 14 - .../Units 00-17/05 Control 1/Ex_09/Ex_09.pde | 13 - .../Units 00-17/05 Control 1/Ex_10/Ex_10.pde | 15 - .../Units 00-17/05 Control 1/Ex_11/Ex_11.pde | 14 - .../Units 00-17/05 Control 1/Ex_12/Ex_12.pde | 10 - .../Units 00-17/05 Control 1/Ex_13/Ex_13.pde | 8 - .../Units 00-17/06 Control 2/Ex_01/Ex_01.pde | 8 - .../Units 00-17/06 Control 2/Ex_02/Ex_02.pde | 7 - .../Units 00-17/06 Control 2/Ex_03/Ex_03.pde | 4 - .../Units 00-17/06 Control 2/Ex_04/Ex_04.pde | 4 - .../Units 00-17/06 Control 2/Ex_05/Ex_05.pde | 3 - .../Units 00-17/06 Control 2/Ex_06/Ex_06.pde | 3 - .../Units 00-17/06 Control 2/Ex_07/Ex_07.pde | 5 - .../Units 00-17/06 Control 2/Ex_08/Ex_08.pde | 8 - .../Units 00-17/06 Control 2/Ex_09/Ex_09.pde | 7 - .../Units 00-17/06 Control 2/Ex_10/Ex_10.pde | 6 - .../Units 00-17/06 Control 2/Ex_11/Ex_11.pde | 7 - .../Units 00-17/06 Control 2/Ex_12/Ex_12.pde | 10 - .../Units 00-17/06 Control 2/Ex_13/Ex_13.pde | 11 - .../Units 00-17/07 Shape 2/Ex_01/Ex_01.pde | 7 - .../Units 00-17/07 Shape 2/Ex_02/Ex_02.pde | 7 - .../Units 00-17/07 Shape 2/Ex_03/Ex_03.pde | 7 - .../Units 00-17/07 Shape 2/Ex_04/Ex_04.pde | 11 - .../Units 00-17/07 Shape 2/Ex_05/Ex_05.pde | 11 - .../Units 00-17/07 Shape 2/Ex_06/Ex_06.pde | 10 - .../Units 00-17/07 Shape 2/Ex_07/Ex_07.pde | 7 - .../Units 00-17/07 Shape 2/Ex_08/Ex_08.pde | 7 - .../Units 00-17/07 Shape 2/Ex_09/Ex_09.pde | 9 - .../Units 00-17/07 Shape 2/Ex_10/Ex_10.pde | 10 - .../Units 00-17/07 Shape 2/Ex_11/Ex_11.pde | 7 - .../Units 00-17/07 Shape 2/Ex_12/Ex_12.pde | 10 - .../Units 00-17/07 Shape 2/Ex_13/Ex_13.pde | 10 - .../Units 00-17/07 Shape 2/Ex_14/Ex_14.pde | 9 - .../Units 00-17/07 Shape 2/Ex_15/Ex_15.pde | 5 - .../Units 00-17/07 Shape 2/Ex_16/Ex_16.pde | 7 - .../Units 00-17/07 Shape 2/Ex_17/Ex_17.pde | 7 - .../Units 00-17/07 Shape 2/Ex_18/Ex_18.pde | 9 - .../Units 00-17/08 Math 2/Ex_01/Ex_01.pde | 3 - .../Units 00-17/08 Math 2/Ex_02/Ex_02.pde | 3 - .../Units 00-17/08 Math 2/Ex_03/Ex_03.pde | 4 - .../Units 00-17/08 Math 2/Ex_04/Ex_04.pde | 3 - .../Units 00-17/08 Math 2/Ex_05/Ex_05.pde | 3 - .../Units 00-17/08 Math 2/Ex_06/Ex_06.pde | 3 - .../Units 00-17/08 Math 2/Ex_07/Ex_07.pde | 3 - .../Units 00-17/08 Math 2/Ex_08/Ex_08.pde | 6 - .../Units 00-17/08 Math 2/Ex_09/Ex_09.pde | 6 - .../Units 00-17/08 Math 2/Ex_10/Ex_10.pde | 10 - .../Units 00-17/08 Math 2/Ex_11/Ex_11.pde | 8 - .../Units 00-17/08 Math 2/Ex_12/Ex_12.pde | 8 - .../Units 00-17/09 Color 1/Ex_01/Ex_01.pde | 1 - .../Units 00-17/09 Color 1/Ex_02/Ex_02.pde | 1 - .../Units 00-17/09 Color 1/Ex_03/Ex_03.pde | 4 - .../Units 00-17/09 Color 1/Ex_04/Ex_04.pde | 5 - .../Units 00-17/09 Color 1/Ex_05/Ex_05.pde | 6 - .../Units 00-17/09 Color 1/Ex_06/Ex_06.pde | 8 - .../Units 00-17/09 Color 1/Ex_07/Ex_07.pde | 7 - .../Units 00-17/09 Color 1/Ex_08/Ex_08.pde | 9 - .../Units 00-17/09 Color 1/Ex_09/Ex_09.pde | 9 - .../Units 00-17/09 Color 1/Ex_10/Ex_10.pde | 9 - .../Units 00-17/09 Color 1/Ex_11/Ex_11.pde | 4 - .../Units 00-17/09 Color 1/Ex_12/Ex_12.pde | 6 - .../Units 00-17/09 Color 1/Ex_13/Ex_13.pde | 2 - .../Units 00-17/09 Color 1/Ex_14/Ex_14.pde | 3 - .../Units 00-17/09 Color 1/Ex_15/Ex_15.pde | 6 - .../Units 00-17/09 Color 1/Ex_16/Ex_16.pde | 6 - .../Units 00-17/09 Color 1/Ex_17/Ex_17.pde | 6 - .../Units 00-17/09 Color 1/Ex_18/Ex_18.pde | 8 - .../Units 00-17/09 Color 1/Ex_19/Ex_19.pde | 9 - .../Units 00-17/09 Color 1/Ex_20/Ex_20.pde | 7 - .../Units 00-17/09 Color 1/Ex_21/Ex_21.pde | 5 - .../Units 00-17/10 Image 1/Ex_01/Ex_01.pde | 4 - .../Units 00-17/10 Image 1/Ex_02/Ex_02.pde | 4 - .../Units 00-17/10 Image 1/Ex_03/Ex_03.pde | 6 - .../Units 00-17/10 Image 1/Ex_04/Ex_04.pde | 6 - .../Units 00-17/10 Image 1/Ex_05/Ex_05.pde | 11 - .../Units 00-17/10 Image 1/Ex_06/Ex_06.pde | 7 - .../Units 00-17/10 Image 1/Ex_07/Ex_07.pde | 8 - .../Units 00-17/10 Image 1/Ex_08/Ex_08.pde | 6 - .../10 Image 1/Ex_08/data/archTrans.gif | Bin 1025 -> 0 bytes .../10 Image 1/Ex_08/data/mud-trans.gif | Bin 7951 -> 0 bytes .../Units 00-17/10 Image 1/Ex_09/Ex_09.pde | 6 - .../Units 00-17/11 Data 2/Ex_01/Ex_01.pde | 4 - .../11 Data 2/Ex_01/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/11 Data 2/Ex_02/Ex_02.pde | 5 - .../11 Data 2/Ex_02/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/11 Data 2/Ex_03/Ex_03.pde | 4 - .../11 Data 2/Ex_03/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/11 Data 2/Ex_04/Ex_04.pde | 6 - .../11 Data 2/Ex_04/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/11 Data 2/Ex_05/Ex_05.pde | 4 - .../11 Data 2/Ex_05/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/11 Data 2/Ex_06/Ex_06.pde | 11 - .../11 Data 2/Ex_06/data/archTrans.gif | Bin 1025 -> 0 bytes .../Units 00-17/12 Data 3/Ex_01/Ex_01.pde | 4 - .../Units 00-17/12 Data 3/Ex_02/Ex_02.pde | 6 - .../Units 00-17/12 Data 3/Ex_03/Ex_03.pde | 6 - .../Units 00-17/12 Data 3/Ex_04/Ex_04.pde | 4 - .../Units 00-17/12 Data 3/Ex_05/Ex_05.pde | 4 - .../Units 00-17/12 Data 3/Ex_06/Ex_06.pde | 4 - .../Units 00-17/12 Data 3/Ex_07/Ex_07.pde | 6 - .../Units 00-17/12 Data 3/Ex_08/Ex_08.pde | 6 - .../Units 00-17/12 Data 3/Ex_09/Ex_09.pde | 4 - .../Units 00-17/12 Data 3/Ex_10/Ex_10.pde | 4 - .../Units 00-17/12 Data 3/Ex_11/Ex_11.pde | 4 - .../Units 00-17/12 Data 3/Ex_12/Ex_12.pde | 4 - .../Units 00-17/12 Data 3/Ex_13/Ex_13.pde | 5 - .../Units 00-17/12 Data 3/Ex_14/Ex_14.pde | 3 - .../Units 00-17/12 Data 3/Ex_15/Ex_15.pde | 5 - .../13 Typography 1/Ex_01/Ex_01.pde | 7 - .../Ex_01/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../13 Typography 1/Ex_02/Ex_02.pde | 7 - .../Ex_02/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../13 Typography 1/Ex_03/Ex_03.pde | 6 - .../13 Typography 1/Ex_03/data/Courier-12.vlw | Bin 19855 -> 0 bytes .../Ex_03/data/Ziggurat-12.vlw | Bin 23253 -> 0 bytes .../13 Typography 1/Ex_04/Ex_04.pde | 9 - .../13 Typography 1/Ex_04/data/Courier-48.vlw | Bin 176127 -> 0 bytes .../Ex_04/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../13 Typography 1/Ex_05/Ex_05.pde | 9 - .../13 Typography 1/Ex_05/data/Courier-96.vlw | Bin 661241 -> 0 bytes .../Ex_05/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../Ex_05/data/Ziggurat-48.vlw | Bin 252627 -> 0 bytes .../Ex_05/data/Ziggurat-72.vlw | Bin 553233 -> 0 bytes .../13 Typography 1/Ex_06/Ex_06.pde | 10 - .../13 Typography 1/Ex_06/data/Courier-48.vlw | Bin 176127 -> 0 bytes .../Ex_06/data/CourierItalic-48.vlw | Bin 193600 -> 0 bytes .../Ex_06/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../Ex_06/data/ZigguratItalic-32.vlw | Bin 141775 -> 0 bytes .../Ex_06/data/ZigguratItalic-48.vlw | Bin 304917 -> 0 bytes .../13 Typography 1/Ex_07/Ex_07.pde | 10 - .../13 Typography 1/Ex_07/data/Courier-48.vlw | Bin 176127 -> 0 bytes .../Ex_07/data/CourierItalic-48.vlw | Bin 193600 -> 0 bytes .../Ex_07/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../13 Typography 1/Ex_08/Ex_08.pde | 11 - .../13 Typography 1/Ex_08/data/Courier-12.vlw | Bin 20170 -> 0 bytes .../Ex_08/data/Ziggurat-12.vlw | Bin 23253 -> 0 bytes .../13 Typography 1/Ex_09/Ex_09.pde | 11 - .../13 Typography 1/Ex_09/data/Courier-12.vlw | Bin 19855 -> 0 bytes .../Ex_09/data/Ziggurat-12.vlw | Bin 23253 -> 0 bytes .../13 Typography 1/Ex_10/Ex_10.pde | 11 - .../13 Typography 1/Ex_10/data/Courier-12.vlw | Bin 19855 -> 0 bytes .../Ex_10/data/Ziggurat-12.vlw | Bin 23253 -> 0 bytes .../13 Typography 1/Ex_11/Ex_11.pde | 12 - .../13 Typography 1/Ex_11/data/Courier-32.vlw | Bin 80610 -> 0 bytes .../Ex_11/data/Ziggurat-32.vlw | Bin 118840 -> 0 bytes .../Units 00-17/14 Math 3/Ex_01/Ex_01.pde | 1 - .../Units 00-17/14 Math 3/Ex_02/Ex_02.pde | 8 - .../Units 00-17/14 Math 3/Ex_03/Ex_03.pde | 3 - .../Units 00-17/14 Math 3/Ex_04/Ex_04.pde | 3 - .../Units 00-17/14 Math 3/Ex_05/Ex_05.pde | 4 - .../Units 00-17/14 Math 3/Ex_06/Ex_06.pde | 9 - .../Units 00-17/14 Math 3/Ex_07/Ex_07.pde | 13 - .../Units 00-17/14 Math 3/Ex_08/14-08.tif | Bin 97108 -> 0 bytes .../Units 00-17/14 Math 3/Ex_08/Ex_08.pde | 16 - .../Units 00-17/14 Math 3/Ex_09/Ex_09.pde | 16 - .../Units 00-17/14 Math 3/Ex_10/Ex_10.pde | 13 - .../Units 00-17/14 Math 3/Ex_11/Ex_11.pde | 17 - .../Units 00-17/14 Math 3/Ex_12/Ex_12.pde | 9 - .../Units 00-17/14 Math 3/Ex_13/Ex_13.pde | 9 - .../Units 00-17/14 Math 3/Ex_14/Ex_14.pde | 6 - .../Units 00-17/14 Math 3/Ex_15/Ex_15.pde | 10 - .../Units 00-17/14 Math 3/Ex_16/Ex_16.pde | 10 - .../Units 00-17/14 Math 3/Ex_17/Ex_17.pde | 15 - .../Units 00-17/15 Math 4/Ex_01/Ex_01.pde | 3 - .../Units 00-17/15 Math 4/Ex_02/Ex_02.pde | 8 - .../Units 00-17/15 Math 4/Ex_03/Ex_03.pde | 12 - .../Units 00-17/15 Math 4/Ex_04/Ex_04.pde | 8 - .../Units 00-17/15 Math 4/Ex_05/Ex_05.pde | 6 - .../Units 00-17/15 Math 4/Ex_06/Ex_06.pde | 4 - .../Units 00-17/15 Math 4/Ex_07/Ex_07.pde | 10 - .../Units 00-17/15 Math 4/Ex_08/Ex_08.pde | 11 - .../Units 00-17/15 Math 4/Ex_09/Ex_09.pde | 13 - .../Units 00-17/15 Math 4/Ex_10/Ex_10.pde | 17 - .../16 Transform 1/Ex_01/Ex_01.pde | 5 - .../16 Transform 1/Ex_02/Ex_02.pde | 5 - .../16 Transform 1/Ex_03/Ex_03.pde | 5 - .../16 Transform 1/Ex_04/Ex_04.pde | 3 - .../16 Transform 1/Ex_05/Ex_05.pde | 8 - .../16 Transform 1/Ex_06/Ex_06.pde | 10 - .../17 Transform 2/Ex_01/Ex_01.pde | 4 - .../17 Transform 2/Ex_02/Ex_02.pde | 6 - .../17 Transform 2/Ex_03/Ex_03.pde | 4 - .../17 Transform 2/Ex_04/Ex_04.pde | 4 - .../17 Transform 2/Ex_05/Ex_05.pde | 6 - .../17 Transform 2/Ex_06/Ex_06.pde | 5 - .../17 Transform 2/Ex_07/Ex_07.pde | 3 - .../17 Transform 2/Ex_08/Ex_08.pde | 3 - .../17 Transform 2/Ex_09/Ex_09.pde | 6 - .../17 Transform 2/Ex_10/Ex_10.pde | 6 - .../17 Transform 2/Ex_11/Ex_11.pde | 7 - .../17 Transform 2/Ex_12/Ex_12.pde | 5 - .../17 Transform 2/Ex_13/Ex_13.pde | 9 - .../17 Transform 2/Ex_14/Ex_14.pde | 9 - .../17 Transform 2/Ex_15/Ex_15.pde | 11 - .../17 Transform 2/Ex_16/Ex_16.pde | 14 - .../17 Transform 2/Ex_17/Ex_17.pde | 12 - .../20 Structure 2/Ex_01/Ex_01.pde | 4 - .../20 Structure 2/Ex_02/Ex_02.pde | 5 - .../20 Structure 2/Ex_03/Ex_03.pde | 6 - .../20 Structure 2/Ex_04/Ex_04.pde | 8 - .../20 Structure 2/Ex_05/Ex_05.pde | 8 - .../20 Structure 2/Ex_06/Ex_06.pde | 10 - .../20 Structure 2/Ex_07/Ex_07.pde | 16 - .../20 Structure 2/Ex_08/Ex_08.pde | 6 - .../20 Structure 2/Ex_09/Ex_09.pde | 10 - .../20 Structure 2/Ex_10/Ex_10.pde | 14 - .../20 Structure 2/Ex_11/Ex_11.pde | 9 - .../20 Structure 2/Ex_12/Ex_12.pde | 6 - .../20 Structure 2/Ex_13/Ex_13.pde | 11 - .../21 Structure 3/Ex_01/Ex_01.pde | 15 - .../21 Structure 3/Ex_02/Ex_02.pde | 23 - .../21 Structure 3/Ex_03/Ex_03.pde | 20 - .../21 Structure 3/Ex_04/Ex_04.pde | 24 - .../21 Structure 3/Ex_05/Ex_05.pde | 23 - .../21 Structure 3/Ex_06/Ex_06.pde | 16 - .../21 Structure 3/Ex_07/Ex_07.pde | 16 - .../21 Structure 3/Ex_08/Ex_08.pde | 16 - .../21 Structure 3/Ex_09/Ex_09.pde | 16 - .../21 Structure 3/Ex_10/Ex_10.pde | 18 - .../21 Structure 3/Ex_11/Ex_11.pde | 18 - .../21 Structure 3/Ex_12/Ex_12.pde | 19 - .../21 Structure 3/Ex_13/Ex_13.pde | 22 - .../21 Structure 3/Ex_14/Ex_14.pde | 35 - .../21 Structure 3/Ex_15/Ex_15.pde | 36 - .../21 Structure 3/Ex_16/Ex_16.pde | 2 - .../21 Structure 3/Ex_17/Ex_17.pde | 2 - .../21 Structure 3/Ex_18/Ex_18.pde | 2 - .../21 Structure 3/Ex_19/Ex_19.pde | 10 - .../21 Structure 3/Ex_20/Ex_20.pde | 10 - .../Units 20-29/22 Shape 3/Ex_01/Ex_01.pde | 7 - .../Units 20-29/22 Shape 3/Ex_02/Ex_02.pde | 22 - .../Units 20-29/22 Shape 3/Ex_03/Ex_03.pde | 23 - .../Units 20-29/22 Shape 3/Ex_04/Ex_04.pde | 27 - .../Units 20-29/22 Shape 3/Ex_05/Ex_05.pde | 25 - .../Units 20-29/22 Shape 3/Ex_06/Ex_06.pde | 6 - .../Units 20-29/22 Shape 3/Ex_07/Ex_07.pde | 10 - .../Units 20-29/22 Shape 3/Ex_08/Ex_08.pde | 17 - .../Units 20-29/22 Shape 3/Ex_09/Ex_09.pde | 24 - .../Units 20-29/22 Shape 3/Ex_10/Ex_10.pde | 25 - .../Units 20-29/22 Shape 3/Ex_11/Ex_11.pde | 33 - .../Units 20-29/23 Input 1/Ex_01/Ex_01.pde | 4 - .../Units 20-29/23 Input 1/Ex_02/Ex_02.pde | 11 - .../Units 20-29/23 Input 1/Ex_03/Ex_03.pde | 12 - .../Units 20-29/23 Input 1/Ex_04/Ex_04.pde | 12 - .../Units 20-29/23 Input 1/Ex_05/Ex_05.pde | 18 - .../Units 20-29/23 Input 1/Ex_06/Ex_06.pde | 15 - .../Units 20-29/23 Input 1/Ex_07/Ex_07.pde | 4 - .../Units 20-29/23 Input 1/Ex_08/Ex_08.pde | 11 - .../Units 20-29/23 Input 1/Ex_09/Ex_09.pde | 12 - .../Units 20-29/23 Input 1/Ex_10/Ex_10.pde | 14 - .../Units 20-29/23 Input 1/Ex_11/Ex_11.pde | 16 - .../Units 20-29/23 Input 1/Ex_12/Ex_12.pde | 18 - .../Units 20-29/23 Input 1/Ex_13/Ex_13.pde | 20 - .../Units 20-29/23 Input 1/Ex_14/Ex_14.pde | 18 - .../Units 20-29/23 Input 1/Ex_15/Ex_15.pde | 14 - .../Units 20-29/23 Input 1/Ex_16/Ex_16.pde | 16 - .../Units 20-29/23 Input 1/Ex_17/Ex_17.pde | 19 - .../Units 20-29/23 Input 1/Ex_18/Ex_18.pde | 12 - .../Units 20-29/23 Input 1/Ex_19/Ex_19.pde | 12 - .../Units 20-29/23 Input 1/Ex_20/Ex_20.pde | 16 - .../24 Drawing 1/Ex_01/24-01--1.tif | Bin 42688 -> 0 bytes .../Units 20-29/24 Drawing 1/Ex_01/Ex_01.pde | 8 - .../Units 20-29/24 Drawing 1/Ex_02/Ex_02.pde | 9 - .../24 Drawing 1/Ex_03/24-03--34556.tif | Bin 30768 -> 0 bytes .../Units 20-29/24 Drawing 1/Ex_03/Ex_03.pde | 11 - .../Units 20-29/24 Drawing 1/Ex_04/Ex_04.pde | 14 - .../Units 20-29/24 Drawing 1/Ex_05/Ex_05.pde | 9 - .../Units 20-29/24 Drawing 1/Ex_06/Ex_06.pde | 9 - .../Units 20-29/24 Drawing 1/Ex_07/Ex_07.pde | 18 - .../Units 20-29/24 Drawing 1/Ex_08/Ex_08.pde | 12 - .../Units 20-29/24 Drawing 1/Ex_09/Ex_09.pde | 14 - .../Units 20-29/25 Input 2/Ex_01/Ex_01.pde | 15 - .../Units 20-29/25 Input 2/Ex_02/Ex_02.pde | 16 - .../Units 20-29/25 Input 2/Ex_03/Ex_03.pde | 12 - .../Ex_03/data/ThesisMonoLight-72.vlw | Bin 343711 -> 0 bytes .../Units 20-29/25 Input 2/Ex_04/Ex_04.pde | 15 - .../Units 20-29/25 Input 2/Ex_05/Ex_05.pde | 12 - .../Units 20-29/25 Input 2/Ex_06/Ex_06.pde | 19 - .../Units 20-29/25 Input 2/Ex_07/Ex_07.pde | 20 - .../Units 20-29/26 Input 3/Ex_01/Ex_01.pde | 13 - .../Units 20-29/26 Input 3/Ex_02/Ex_02.pde | 13 - .../Units 20-29/26 Input 3/Ex_03/Ex_03.pde | 10 - .../Units 20-29/26 Input 3/Ex_04/Ex_04.pde | 25 - .../Units 20-29/26 Input 3/Ex_05/Ex_05.pde | 12 - .../Units 20-29/26 Input 3/Ex_06/Ex_06.pde | 24 - .../Units 20-29/26 Input 3/Ex_07/Ex_07.pde | 29 - .../26 Input 3/Ex_07/data/Eureka-24.vlw | Bin 120766 -> 0 bytes .../Units 20-29/26 Input 3/Ex_08/Ex_08.pde | 32 - .../26 Input 3/Ex_08/data/Eureka-24.vlw | Bin 120766 -> 0 bytes .../Units 20-29/26 Input 3/Ex_09/Ex_09.pde | 23 - .../Units 20-29/26 Input 3/Ex_10/Ex_10.pde | 13 - .../Units 20-29/27 Input 4/Ex_01/Ex_01.pde | 3 - .../Units 20-29/27 Input 4/Ex_02/Ex_02.pde | 18 - .../Units 20-29/27 Input 4/Ex_03/Ex_03.pde | 3 - .../Units 20-29/27 Input 4/Ex_04/Ex_04.pde | 12 - .../Units 20-29/27 Input 4/Ex_05/Ex_05.pde | 22 - .../Units 20-29/27 Input 4/Ex_06/Ex_06.pde | 15 - .../Units 20-29/27 Input 4/Ex_07/Ex_07.pde | 20 - .../Units 20-29/27 Input 4/Ex_08/Ex_08.pde | 21 - .../Units 20-29/27 Input 4/Ex_09/Ex_09.pde | 12 - .../Units 20-29/27 Input 4/Ex_10/Ex_10.pde | 16 - .../Units 20-29/27 Input 4/Ex_11/Ex_11.pde | 18 - .../Units 20-29/27 Input 4/Ex_12/Ex_12.pde | 31 - .../Units 20-29/28 Input 5/Ex_01/Ex_01.pde | 4 - .../Units 20-29/28 Input 5/Ex_02/Ex_02.pde | 16 - .../Units 20-29/28 Input 5/Ex_03/Ex_03.pde | 17 - .../28 Input 5/Ex_03/data/Pro-20.vlw | Bin 26111 -> 0 bytes .../Units 20-29/28 Input 5/Ex_04/Ex_04.pde | 14 - .../Units 20-29/28 Input 5/Ex_05/Ex_05.pde | 20 - .../Units 20-29/28 Input 5/Ex_06/Ex_06.pde | 14 - .../Units 20-29/28 Input 5/Ex_07/Ex_07.pde | 12 - .../Units 20-29/28 Input 5/Ex_08/Ex_08.pde | 4 - .../Units 20-29/28 Input 5/Ex_09/Ex_09.pde | 6 - .../Units 20-29/28 Input 5/Ex_10/Ex_10.pde | 7 - .../Units 31-42/31 Motion 1/Ex_01/Ex_01.pde | 19 - .../Units 31-42/31 Motion 1/Ex_02/Ex_02.pde | 22 - .../Units 31-42/31 Motion 1/Ex_03/Ex_03.pde | 30 - .../Units 31-42/31 Motion 1/Ex_04/Ex_04.pde | 25 - .../Units 31-42/31 Motion 1/Ex_05/Ex_05.pde | 34 - .../Units 31-42/31 Motion 1/Ex_06/Ex_06.pde | 26 - .../Units 31-42/31 Motion 1/Ex_07/Ex_07.pde | 34 - .../Units 31-42/31 Motion 1/Ex_08/Ex_08.pde | 40 - .../Units 31-42/31 Motion 1/Ex_09/Ex_09.pde | 39 - .../Units 31-42/31 Motion 1/Ex_10/Ex_10.pde | 11 - .../Units 31-42/31 Motion 1/Ex_11/Ex_11.pde | 22 - .../Units 31-42/31 Motion 1/Ex_12/Ex_12.pde | 33 - .../Units 31-42/31 Motion 1/Ex_13/Ex_13.pde | 17 - .../Units 31-42/32 Motion 2/Ex_01/Ex_01.pde | 19 - .../Units 31-42/32 Motion 2/Ex_02/Ex_02.pde | 32 - .../Units 31-42/32 Motion 2/Ex_03/Ex_03.pde | 16 - .../Units 31-42/32 Motion 2/Ex_04/Ex_04.pde | 21 - .../Units 31-42/32 Motion 2/Ex_05/Ex_05.pde | 15 - .../Units 31-42/32 Motion 2/Ex_06/Ex_06.pde | 20 - .../Units 31-42/32 Motion 2/Ex_07/Ex_07.pde | 29 - .../Units 31-42/32 Motion 2/Ex_08/Ex_08.pde | 21 - .../Units 31-42/32 Motion 2/Ex_09/Ex_09.pde | 24 - .../Units 31-42/33 Data 4/Ex_01/Ex_01.pde | 9 - .../Units 31-42/33 Data 4/Ex_02/Ex_02.pde | 11 - .../Units 31-42/33 Data 4/Ex_03/Ex_03.pde | 10 - .../Units 31-42/33 Data 4/Ex_04/Ex_04.pde | 4 - .../Units 31-42/33 Data 4/Ex_05/Ex_05.pde | 7 - .../Units 31-42/33 Data 4/Ex_06/Ex_06.pde | 6 - .../Units 31-42/33 Data 4/Ex_07/Ex_07.pde | 1 - .../Units 31-42/33 Data 4/Ex_08/Ex_08.pde | 6 - .../Units 31-42/33 Data 4/Ex_09/Ex_09.pde | 4 - .../Units 31-42/33 Data 4/Ex_10/Ex_10.pde | 6 - .../Units 31-42/33 Data 4/Ex_11/Ex_11.pde | 4 - .../Units 31-42/33 Data 4/Ex_12/Ex_12.pde | 13 - .../Units 31-42/33 Data 4/Ex_13/Ex_13.pde | 26 - .../Units 31-42/33 Data 4/Ex_14/Ex_14.pde | 20 - .../Units 31-42/33 Data 4/Ex_15/Ex_15.pde | 26 - .../Units 31-42/33 Data 4/Ex_16/Ex_16.pde | 25 - .../Units 31-42/33 Data 4/Ex_17/Ex_17.pde | 11 - .../Units 31-42/33 Data 4/Ex_18/Ex_18.pde | 6 - .../Units 31-42/33 Data 4/Ex_19/Ex_19.pde | 15 - .../Units 31-42/33 Data 4/Ex_20/Ex_20.pde | 9 - .../Units 31-42/33 Data 4/Ex_21/Ex_21.pde | 15 - .../Units 31-42/33 Data 4/Ex_22/Ex_22.pde | 19 - .../Units 31-42/33 Data 4/Ex_23/Ex_23.pde | 7 - .../Units 31-42/33 Data 4/Ex_24/Ex_24.pde | 19 - .../Units 31-42/34 Image 2/Ex_01/Ex_01.pde | 28 - .../34 Image 2/Ex_01/data/ani-000.gif | Bin 4662 -> 0 bytes .../34 Image 2/Ex_01/data/ani-001.gif | Bin 4702 -> 0 bytes .../34 Image 2/Ex_01/data/ani-002.gif | Bin 4711 -> 0 bytes .../34 Image 2/Ex_01/data/ani-003.gif | Bin 4574 -> 0 bytes .../34 Image 2/Ex_01/data/ani-004.gif | Bin 4560 -> 0 bytes .../34 Image 2/Ex_01/data/ani-005.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_01/data/ani-006.gif | Bin 4291 -> 0 bytes .../34 Image 2/Ex_01/data/ani-007.gif | Bin 4357 -> 0 bytes .../34 Image 2/Ex_01/data/ani-008.gif | Bin 4451 -> 0 bytes .../34 Image 2/Ex_01/data/ani-009.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_01/data/ani-010.gif | Bin 4559 -> 0 bytes .../34 Image 2/Ex_01/data/ani-011.gif | Bin 4645 -> 0 bytes .../Units 31-42/34 Image 2/Ex_02/Ex_02.pde | 21 - .../34 Image 2/Ex_02/data/ani-000.gif | Bin 4662 -> 0 bytes .../34 Image 2/Ex_02/data/ani-001.gif | Bin 4702 -> 0 bytes .../34 Image 2/Ex_02/data/ani-002.gif | Bin 4711 -> 0 bytes .../34 Image 2/Ex_02/data/ani-003.gif | Bin 4574 -> 0 bytes .../34 Image 2/Ex_02/data/ani-004.gif | Bin 4560 -> 0 bytes .../34 Image 2/Ex_02/data/ani-005.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_02/data/ani-006.gif | Bin 4291 -> 0 bytes .../34 Image 2/Ex_02/data/ani-007.gif | Bin 4357 -> 0 bytes .../34 Image 2/Ex_02/data/ani-008.gif | Bin 4451 -> 0 bytes .../34 Image 2/Ex_02/data/ani-009.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_02/data/ani-010.gif | Bin 4559 -> 0 bytes .../34 Image 2/Ex_02/data/ani-011.gif | Bin 4645 -> 0 bytes .../Units 31-42/34 Image 2/Ex_03/Ex_03.pde | 16 - .../34 Image 2/Ex_03/data/ani-000.gif | Bin 4662 -> 0 bytes .../34 Image 2/Ex_03/data/ani-001.gif | Bin 4702 -> 0 bytes .../34 Image 2/Ex_03/data/ani-002.gif | Bin 4711 -> 0 bytes .../34 Image 2/Ex_03/data/ani-003.gif | Bin 4574 -> 0 bytes .../34 Image 2/Ex_03/data/ani-004.gif | Bin 4560 -> 0 bytes .../34 Image 2/Ex_03/data/ani-005.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_03/data/ani-006.gif | Bin 4291 -> 0 bytes .../34 Image 2/Ex_03/data/ani-007.gif | Bin 4357 -> 0 bytes .../34 Image 2/Ex_03/data/ani-008.gif | Bin 4451 -> 0 bytes .../34 Image 2/Ex_03/data/ani-009.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_03/data/ani-010.gif | Bin 4559 -> 0 bytes .../34 Image 2/Ex_03/data/ani-011.gif | Bin 4645 -> 0 bytes .../Units 31-42/34 Image 2/Ex_04/Ex_04.pde | 24 - .../34 Image 2/Ex_04/data/ani-000.gif | Bin 4662 -> 0 bytes .../34 Image 2/Ex_04/data/ani-001.gif | Bin 4702 -> 0 bytes .../34 Image 2/Ex_04/data/ani-002.gif | Bin 4711 -> 0 bytes .../34 Image 2/Ex_04/data/ani-003.gif | Bin 4574 -> 0 bytes .../34 Image 2/Ex_04/data/ani-004.gif | Bin 4560 -> 0 bytes .../34 Image 2/Ex_04/data/ani-005.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_04/data/ani-006.gif | Bin 4291 -> 0 bytes .../34 Image 2/Ex_04/data/ani-007.gif | Bin 4357 -> 0 bytes .../34 Image 2/Ex_04/data/ani-008.gif | Bin 4451 -> 0 bytes .../34 Image 2/Ex_04/data/ani-009.gif | Bin 4506 -> 0 bytes .../34 Image 2/Ex_04/data/ani-010.gif | Bin 4559 -> 0 bytes .../34 Image 2/Ex_04/data/ani-011.gif | Bin 4645 -> 0 bytes .../Units 31-42/34 Image 2/Ex_05/Ex_05.pde | 16 - .../34 Image 2/Ex_05/data/PT-Shifty-0020.gif | Bin 658 -> 0 bytes .../Units 31-42/34 Image 2/Ex_06/Ex_06.pde | 15 - .../34 Image 2/Ex_06/data/PT-Shifty-0023.gif | Bin 805 -> 0 bytes .../Units 31-42/34 Image 2/Ex_07/Ex_07.pde | 16 - .../34 Image 2/Ex_07/data/PT-Teddy-0017.gif | Bin 853 -> 0 bytes .../Units 31-42/35 Image 3/Ex_01/Ex_01.pde | 5 - .../Units 31-42/35 Image 3/Ex_02/Ex_02.pde | 8 - .../Units 31-42/35 Image 3/Ex_03/Ex_03.pde | 6 - .../Units 31-42/35 Image 3/Ex_04/Ex_04.pde | 5 - .../Units 31-42/35 Image 3/Ex_05/Ex_05.pde | 7 - .../Units 31-42/35 Image 3/Ex_06/Ex_06.pde | 14 - .../Units 31-42/35 Image 3/Ex_07/Ex_07.pde | 19 - .../Units 31-42/35 Image 3/Ex_08/Ex_08.pde | 9 - .../Units 31-42/35 Image 3/Ex_09/Ex_09.pde | 5 - .../Units 31-42/35 Image 3/Ex_10/Ex_10.pde | 6 - .../Units 31-42/35 Image 3/Ex_11/Ex_11.pde | 11 - .../Units 31-42/35 Image 3/Ex_12/Ex_12.pde | 9 - .../36 Typography 2/Ex_01/Ex_01.pde | 14 - .../36 Typography 2/Ex_01/data/Eureka-48.vlw | Bin 120766 -> 0 bytes .../36 Typography 2/Ex_02/Ex_02.pde | 24 - .../36 Typography 2/Ex_02/data/Eureka-48.vlw | Bin 120766 -> 0 bytes .../36 Typography 2/Ex_03/Ex_03.pde | 15 - .../36 Typography 2/Ex_03/data/Eureka-48.vlw | Bin 120766 -> 0 bytes .../36 Typography 2/Ex_04/Ex_04.pde | 19 - .../Ex_04/data/EurekaSmallCaps-36.vlw | Bin 71570 -> 0 bytes .../36 Typography 2/Ex_05/Ex_05.pde | 21 - .../36 Typography 2/Ex_05/data/Eureka-90.vlw | Bin 393839 -> 0 bytes .../36 Typography 2/Ex_06/Ex_06.pde | 20 - .../36 Typography 2/Ex_06/data/Eureka-32.vlw | Bin 58502 -> 0 bytes .../36 Typography 2/Ex_07/Ex_07.pde | 22 - .../Ex_07/data/EurekaMono-48.vlw | Bin 108381 -> 0 bytes .../36 Typography 2/Ex_08/Ex_08.pde | 36 - .../Ex_08/data/EurekaSmallCaps-36.vlw | Bin 71570 -> 0 bytes .../37 Typography 3/Ex_01/Ex_01.pde | 16 - .../37 Typography 3/Ex_01/data/Eureka-24.vlw | Bin 36321 -> 0 bytes .../37 Typography 3/Ex_02/Ex_02.pde | 24 - .../37 Typography 3/Ex_02/data/Eureka-24.vlw | Bin 36321 -> 0 bytes .../37 Typography 3/Ex_03/Ex_03.pde | 28 - .../37 Typography 3/Ex_03/data/Eureka-24.vlw | Bin 36321 -> 0 bytes .../37 Typography 3/Ex_04/Ex_04.pde | 35 - .../37 Typography 3/Ex_04/data/Eureka-48.vlw | Bin 120766 -> 0 bytes .../Units 31-42/38 Color 2/Ex_01/Ex_01.pde | 10 - .../Units 31-42/38 Color 2/Ex_02/Ex_02.pde | 5 - .../Units 31-42/38 Color 2/Ex_03/Ex_03.pde | 6 - .../Units 31-42/38 Color 2/Ex_04/Ex_04.pde | 4 - .../Units 31-42/38 Color 2/Ex_05/Ex_05.pde | 5 - .../Units 31-42/38 Color 2/Ex_06/Ex_06.pde | 4 - .../Units 31-42/38 Color 2/Ex_07/Ex_07.pde | 19 - .../Units 31-42/38 Color 2/Ex_08/Ex_08.pde | 22 - .../Units 31-42/38 Color 2/Ex_09/Ex_09.pde | 29 - .../Units 31-42/38 Color 2/Ex_10/Ex_10.pde | 23 - .../Units 31-42/38 Color 2/Ex_11/Ex_11.pde | 21 - .../Units 31-42/38 Color 2/Ex_12/Ex_12.pde | 17 - .../Units 31-42/38 Color 2/Ex_13/Ex_13.pde | 42 - .../Units 31-42/39 Image 4/Ex_01/Ex_01.pde | 3 - .../Units 31-42/39 Image 4/Ex_02/Ex_02.pde | 6 - .../Units 31-42/39 Image 4/Ex_03/Ex_03.pde | 18 - .../Units 31-42/39 Image 4/Ex_04/Ex_04.pde | 4 - .../Units 31-42/39 Image 4/Ex_05/Ex_05.pde | 7 - .../Units 31-42/39 Image 4/Ex_06/Ex_06.pde | 8 - .../Units 31-42/39 Image 4/Ex_07/Ex_07.pde | 4 - .../Units 31-42/39 Image 4/Ex_08/Ex_08.pde | 10 - .../Units 31-42/39 Image 4/Ex_09/Ex_09.pde | 3 - .../Units 31-42/39 Image 4/Ex_10/Ex_10.pde | 14 - .../Units 31-42/39 Image 4/Ex_11/Ex_11.pde | 3 - .../Units 31-42/39 Image 4/Ex_12/Ex_12.pde | 5 - .../Units 31-42/40 Image 5/Ex_01/Ex_01.pde | 12 - .../Units 31-42/40 Image 5/Ex_02/Ex_02.pde | 4 - .../Units 31-42/40 Image 5/Ex_03/Ex_03.pde | 4 - .../Units 31-42/40 Image 5/Ex_04/Ex_04.pde | 12 - .../Units 31-42/40 Image 5/Ex_05/Ex_05.pde | 18 - .../Units 31-42/40 Image 5/Ex_06/Ex_06.pde | 16 - .../Units 31-42/40 Image 5/Ex_07/Ex_07.pde | 8 - .../Units 31-42/40 Image 5/Ex_08/Ex_08.pde | 8 - .../Units 31-42/40 Image 5/Ex_09/Ex_09.pde | 8 - .../Units 31-42/40 Image 5/Ex_10/Ex_10.pde | 8 - .../Units 31-42/40 Image 5/Ex_11/Ex_11.pde | 11 - .../Units 31-42/40 Image 5/Ex_12/Ex_12.pde | 22 - .../Units 31-42/40 Image 5/Ex_13/Ex_13.pde | 31 - .../Units 31-42/40 Image 5/Ex_14/Ex_14.pde | 22 - .../Units 31-42/40 Image 5/Ex_15/Ex_15.pde | 18 - .../Units 31-42/40 Image 5/Ex_16/Ex_16.pde | 25 - .../Units 31-42/41 Output 1/Ex_01/Ex_01.pde | 4 - .../Units 31-42/41 Output 1/Ex_02/Ex_02.pde | 4 - .../Units 31-42/41 Output 1/Ex_03/Ex_03.pde | 12 - .../Units 31-42/41 Output 1/Ex_04/Ex_04.pde | 18 - .../Units 31-42/41 Output 1/Ex_05/Ex_05.pde | 8 - .../Units 31-42/41 Output 1/Ex_06/Ex_06.pde | 8 - .../43 Structure 4/Ex_01/Ex_01.pde | 14 - .../43 Structure 4/Ex_02/Ex_02.pde | 21 - .../43 Structure 4/Ex_03/Ex_03.pde | 23 - .../43 Structure 4/Ex_04/Ex_04.pde | 27 - .../43 Structure 4/Ex_05/Ex_05.pde | 25 - .../43 Structure 4/Ex_06/Ex_06.pde | 42 - .../43 Structure 4/Ex_07/Ex_07.pde | 49 - .../43 Structure 4/Ex_08/Ex_08.pde | 36 - .../43 Structure 4/Ex_09/Ex_09.pde | 51 - .../43 Structure 4/Ex_10/Ex_10.pde | 53 - .../43 Structure 4/Ex_11/Ex_11.pde | 30 - .../43 Structure 4/Ex_12/Ex_12.pde | 60 - .../Units 43-51/44 Drawing 2/Ex_01/Ex_01.pde | 13 - .../Units 43-51/44 Drawing 2/Ex_02/Ex_02.pde | 24 - .../Units 43-51/44 Drawing 2/Ex_03/Ex_03.pde | 31 - .../Units 43-51/44 Drawing 2/Ex_04/Ex_04.pde | 19 - .../Units 43-51/44 Drawing 2/Ex_05/Ex_05.pde | 46 - .../44 Drawing 2/Ex_06/44-06--0775.tif | Bin 30768 -> 0 bytes .../44 Drawing 2/Ex_06/44-06--1287.tif | Bin 30768 -> 0 bytes .../44 Drawing 2/Ex_06/44-06--2208.tif | Bin 30768 -> 0 bytes .../44 Drawing 2/Ex_06/44-06--6438.tif | Bin 30768 -> 0 bytes .../Units 43-51/44 Drawing 2/Ex_06/Ex_06.pde | 33 - .../Units 43-51/45 Output 2/Ex_01/Ex_01.pde | 7 - .../Units 43-51/45 Output 2/Ex_02/Ex_02.pde | 6 - .../Units 43-51/45 Output 2/Ex_03/Ex_03.pde | 36 - .../Units 43-51/45 Output 2/Ex_03/lines.txt | 9 - .../Units 43-51/45 Output 2/Ex_04/Ex_04.pde | 23 - .../Units 43-51/45 Output 2/Ex_05/Ex_05.pde | 31 - .../45 Output 2/Ex_05/data/Eureka-24.vlw | Bin 36321 -> 0 bytes .../Units 43-51/45 Output 2/Ex_05/words.txt | 0 .../Units 43-51/46 Input 6/Ex_01/Ex_01.pde | 13 - .../46 Input 6/Ex_01/data/positions.txt | 206 - .../Units 43-51/46 Input 6/Ex_02/Ex_02.pde | 4 - .../Units 43-51/46 Input 6/Ex_03/Ex_03.pde | 4 - .../Units 43-51/46 Input 6/Ex_04/Ex_04.pde | 6 - .../Units 43-51/46 Input 6/Ex_05/Ex_05.pde | 20 - .../46 Input 6/Ex_05/data/positions.txt | 206 - .../Units 43-51/46 Input 6/Ex_06/Ex_06.pde | 40 - .../46 Input 6/Ex_06/data/cars2.tsv | 1 - .../Units 43-51/46 Input 6/Ex_07/Ex_07.pde | 30 - .../46 Input 6/Ex_07/data/2895.txt | 19485 -- .../Units 43-51/47 Input 7/Ex_01/Ex_01.pde | 25 - .../Units 43-51/47 Input 7/Ex_02/Ex_02.pde | 25 - .../Units 43-51/47 Input 7/Ex_03/Ex_03.pde | 17 - .../47 Input 7/Ex_03/OverCircle.pde | 25 - .../Units 43-51/47 Input 7/Ex_03/OverRect.pde | 25 - .../Units 43-51/47 Input 7/Ex_04/Ex_04.pde | 11 - .../47 Input 7/Ex_04/OverCircle.pde | 25 - .../Units 43-51/47 Input 7/Ex_04/OverRect.pde | 25 - .../Units 43-51/47 Input 7/Ex_05/Ex_05.pde | 53 - .../Units 43-51/47 Input 7/Ex_06/Button.pde | 53 - .../Units 43-51/47 Input 7/Ex_06/Ex_06.pde | 24 - .../Units 43-51/47 Input 7/Ex_07/Button.pde | 53 - .../Units 43-51/47 Input 7/Ex_07/Ex_07.pde | 55 - .../Units 43-51/47 Input 7/Ex_08/Ex_08.pde | 31 - .../Units 43-51/47 Input 7/Ex_09/Check.pde | 31 - .../Units 43-51/47 Input 7/Ex_09/Ex_09.pde | 16 - .../Units 43-51/47 Input 7/Ex_10/Check.pde | 31 - .../Units 43-51/47 Input 7/Ex_10/Ex_10.pde | 31 - .../Units 43-51/47 Input 7/Ex_11/Ex_11.pde | 46 - .../Units 43-51/47 Input 7/Ex_12/Ex_12.pde | 23 - .../Units 43-51/47 Input 7/Ex_12/Radio.pde | 46 - .../Units 43-51/47 Input 7/Ex_13/Ex_13.pde | 25 - .../Units 43-51/47 Input 7/Ex_13/Radio.pde | 46 - .../Units 43-51/47 Input 7/Ex_14/Ex_14.pde | 75 - .../Units 43-51/47 Input 7/Ex_15/Ex_15.pde | 36 - .../47 Input 7/Ex_15/Scrollbar.pde | 75 - .../47 Input 7/Ex_15/data/Courier-30.vlw | Bin 72503 -> 0 bytes .../Units 43-51/47 Input 7/Ex_16/Ex_16.pde | 27 - .../47 Input 7/Ex_16/Scrollbar.pde | 75 - .../48 Structure 5/Ex_01/Ex_01.pde | 37 - .../Units 43-51/48 Structure 5/Ex_02/Egg.pde | 36 - .../48 Structure 5/Ex_02/Ex_02.pde | 20 - .../Units 43-51/48 Structure 5/Ex_02/Ring.pde | 30 - .../Units 43-51/48 Structure 5/Ex_03/Egg.pde | 36 - .../48 Structure 5/Ex_03/EggRing.pde | 20 - .../48 Structure 5/Ex_03/Ex_03.pde | 14 - .../Units 43-51/48 Structure 5/Ex_03/Ring.pde | 30 - .../48 Structure 5/Ex_04/Ex_04.pde | 15 - .../48 Structure 5/Ex_05/Ex_05.pde | 16 - .../Units 43-51/48 Structure 5/Ex_05/Spin.pde | 15 - .../48 Structure 5/Ex_06/Ex_06.pde | 19 - .../Units 43-51/48 Structure 5/Ex_06/Spin.pde | 15 - .../48 Structure 5/Ex_07/Ex_07.pde | 17 - .../Units 43-51/48 Structure 5/Ex_07/Spin.pde | 15 - .../48 Structure 5/Ex_07/SpinArm.pde | 16 - .../48 Structure 5/Ex_07/SpinSpots.pde | 19 - .../48 Structure 5/Ex_08/Button.pde | 59 - .../48 Structure 5/Ex_08/Ex_08.pde | 20 - .../48 Structure 5/Ex_09/Button.pde | 59 - .../48 Structure 5/Ex_09/DragButton.pde | 20 - .../48 Structure 5/Ex_09/Ex_09.pde | 28 - .../48 Structure 5/Ex_10/Button.pde | 59 - .../48 Structure 5/Ex_10/DragButton.pde | 20 - .../48 Structure 5/Ex_10/Ex_10.pde | 22 - .../Units 43-51/49 Simulate 1/Ex_01/Ex_01.pde | 57 - .../Units 43-51/49 Simulate 1/Ex_02/Ex_02.pde | 52 - .../Units 43-51/49 Simulate 1/Ex_03/Ex_03.pde | 14 - .../Units 43-51/49 Simulate 1/Ex_04/Ex_04.pde | 57 - .../Units 43-51/49 Simulate 1/Ex_05/Ex_05.pde | 49 - .../Units 43-51/50 Simulate 2/Ex_01/Ex_01.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_02/Ex_02.pde | 23 - .../Units 43-51/50 Simulate 2/Ex_03/Ex_03.pde | 23 - .../Units 43-51/50 Simulate 2/Ex_04/Ex_04.pde | 27 - .../Units 43-51/50 Simulate 2/Ex_05/Ex_05.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_06/Ex_06.pde | 16 - .../50 Simulate 2/Ex_06/Particle.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_07/Ex_07.pde | 19 - .../50 Simulate 2/Ex_07/Particle.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_08/Ex_08.pde | 27 - .../50 Simulate 2/Ex_08/GenParticle.pde | 19 - .../50 Simulate 2/Ex_08/Particle.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_09/Ex_09.pde | 24 - .../50 Simulate 2/Ex_09/Particle.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_10/Ex_10.pde | 26 - .../50 Simulate 2/Ex_10/LimitedParticle.pde | 24 - .../50 Simulate 2/Ex_10/Particle.pde | 24 - .../Units 43-51/50 Simulate 2/Ex_11/Ex_11.pde | 26 - .../50 Simulate 2/Ex_11/Particle.pde | 24 - .../50 Simulate 2/Ex_12/ArrowParticle.pde | 26 - .../Units 43-51/50 Simulate 2/Ex_12/Ex_12.pde | 22 - .../50 Simulate 2/Ex_12/Particle.pde | 25 - .../Units 43-51/50 Simulate 2/Ex_13/Ex_13.pde | 21 - .../Units 43-51/50 Simulate 2/Ex_14/Ex_14.pde | 28 - .../Units 43-51/50 Simulate 2/Ex_15/Ex_15.pde | 35 - .../Units 43-51/50 Simulate 2/Ex_16/Ex_16.pde | 20 - .../50 Simulate 2/Ex_16/Spring2D.pde | 35 - .../Units 43-51/50 Simulate 2/Ex_17/Ex_17.pde | 23 - .../50 Simulate 2/Ex_17/Spring2D.pde | 35 - .../Units 43-51/50 Simulate 2/Ex_18/Ex_18.pde | 24 - .../50 Simulate 2/Ex_18/Spring2D.pde | 35 - .../Units 43-51/50 Simulate 2/Ex_19/Ex_19.pde | 16 - .../50 Simulate 2/Ex_19/FixedSpring.pde | 24 - .../50 Simulate 2/Ex_19/Spring2D.pde | 35 - .../Units 43-51/50 Simulate 2/Ex_20/Ex_20.pde | 23 - .../50 Simulate 2/Ex_20/FixedSpring.pde | 24 - .../50 Simulate 2/Ex_20/Spring2D.pde | 35 - .../Visualizing Data/ch03-usmap/readme.txt | 14 - .../step00_show_map/step00_show_map.pde | 11 - .../ch03-usmap/step01_fig1_red_dots/Table.pde | 120 - .../step01_fig1_red_dots/data/locations.tsv | 50 - .../step01_fig1_red_dots.pde | 30 - .../step02_fig2_varying_sizes/Table.pde | 142 - .../data/locations.tsv | 50 - .../step02_fig2_varying_sizes/data/random.tsv | 50 - .../step02_fig2_varying_sizes.pde | 57 - .../step03_fig3_red_to_blue/Table.pde | 82 - .../data/locations.tsv | 50 - .../step03_fig3_red_to_blue/data/random.tsv | 50 - .../step03_fig3_red_to_blue.pde | 54 - .../step04_fig4_blue_green/Table.pde | 82 - .../step04_fig4_blue_green/data/locations.tsv | 50 - .../step04_fig4_blue_green/data/random.tsv | 50 - .../step04_fig4_blue_green.pde | 54 - .../step05_fig5_blue_green_hsb/Table.pde | 82 - .../data/locations.tsv | 50 - .../data/random.tsv | 50 - .../step05_fig5_blue_green_hsb.pde | 54 - .../step06_fig6_two_sided_range/Table.pde | 82 - .../data/locations.tsv | 50 - .../data/random.tsv | 50 - .../step06_fig6_two_sided_range.pde | 59 - .../step07_fig7_two_sided_alpha/Table.pde | 82 - .../data/locations.tsv | 50 - .../data/random.tsv | 50 - .../step07_fig7_two_sided_alpha.pde | 58 - .../ch03-usmap/step08_rollovers/Table.pde | 82 - .../step08_rollovers/data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step08_rollovers/data/locations.tsv | 50 - .../step08_rollovers/data/random.tsv | 50 - .../step08_rollovers/step08_rollovers.pde | 70 - .../step09_rollovers_full_names/Table.pde | 82 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../data/locations.tsv | 50 - .../data/names.tsv | 50 - .../data/random.tsv | 50 - .../step09_rollovers_full_names.pde | 70 - .../step10_single_rollover/Table.pde | 120 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step10_single_rollover/data/locations.tsv | 50 - .../step10_single_rollover/data/names.tsv | 50 - .../step10_single_rollover/data/random.tsv | 50 - .../step10_single_rollover.pde | 94 - .../step11_randomize_on_keypress/Table.pde | 120 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../data/locations.tsv | 50 - .../data/names.tsv | 50 - .../data/random.tsv | 50 - .../step11_randomize_on_keypress.pde | 90 - .../step12_randomize_with_nfp/Table.pde | 120 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../data/locations.tsv | 50 - .../step12_randomize_with_nfp/data/names.tsv | 50 - .../step12_randomize_with_nfp/data/random.tsv | 50 - .../step12_randomize_with_nfp.pde | 90 - .../step13_randomize_from_cgi/Table.pde | 120 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../data/locations.tsv | 50 - .../step13_randomize_from_cgi/data/names.tsv | 50 - .../step13_randomize_from_cgi/random.cgi | 24 - .../step13_randomize_from_cgi.pde | 85 - .../step14_integrators/Integrator.pde | 60 - .../ch03-usmap/step14_integrators/Table.pde | 120 - .../data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step14_integrators/data/locations.tsv | 50 - .../step14_integrators/data/names.tsv | 50 - .../step14_integrators/data/random.tsv | 50 - .../step14_integrators/step14_integrators.pde | 106 - .../step15_framerate/Integrator.pde | 60 - .../ch03-usmap/step15_framerate/Table.pde | 120 - .../step15_framerate/data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step15_framerate/data/locations.tsv | 50 - .../step15_framerate/data/names.tsv | 50 - .../step15_framerate/data/random.tsv | 50 - .../step15_framerate/step15_framerate.pde | 107 - .../step16_lethargic/Integrator.pde | 60 - .../ch03-usmap/step16_lethargic/Table.pde | 120 - .../step16_lethargic/data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step16_lethargic/data/locations.tsv | 50 - .../step16_lethargic/data/names.tsv | 50 - .../step16_lethargic/data/random.tsv | 50 - .../step16_lethargic/step16_lethargic.pde | 107 - .../ch03-usmap/step17_bouncy/Integrator.pde | 60 - .../ch03-usmap/step17_bouncy/Table.pde | 120 - .../step17_bouncy/data/Univers-Bold-12.vlw | Bin 21478 -> 0 bytes .../step17_bouncy/data/locations.tsv | 50 - .../ch03-usmap/step17_bouncy/data/names.tsv | 50 - .../ch03-usmap/step17_bouncy/data/random.tsv | 50 - .../step17_bouncy/step17_bouncy.pde | 107 - .../figure_01_just_points/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_01_just_points.pde | 60 - .../figure_02_plot_title/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_02_plot_title.pde | 74 - .../figure_03_labels/FloatTable.pde | 223 - .../figure_03_labels/data/milk-tea-coffee.tsv | 96 - .../figure_03_labels/figure_03_labels.pde | 115 - .../figure_04_grid/FloatTable.pde | 223 - .../figure_04_grid/data/milk-tea-coffee.tsv | 96 - .../figure_04_grid/figure_04_grid.pde | 247 - .../FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_05_ylabels_and_ticks.pde | 150 - .../figure_06_finalish/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_06_finalish/figure_06_finalish.pde | 166 - .../figure_07a_shape_noFill.pde | 9 - .../figure_07b_shape_fill.pde | 8 - .../figure_07c_shape_close.pde | 8 - .../figure_08_draw_data_line/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_08_draw_data_line.pde | 167 - .../figure_09_draw_data_mixed/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_09_draw_data_mixed.pde | 181 - .../figure_10_rollovers/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_10_rollovers.pde | 200 - .../figure_11_curve/FloatTable.pde | 223 - .../figure_11_curve/data/milk-tea-coffee.tsv | 96 - .../figure_11_curve/figure_11_curve.pde | 174 - .../figure_12_area/FloatTable.pde | 223 - .../figure_12_area/data/milk-tea-coffee.tsv | 96 - .../figure_12_area/figure_12_area.pde | 169 - .../figure_13_reversed/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_13_reversed/figure_13_reversed.pde | 166 - .../figure_14_bar_chart/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../figure_14_bar_chart.pde | 183 - .../figure_15_tabs/FloatTable.pde | 223 - .../figure_15_tabs/data/milk-tea-coffee.tsv | 96 - .../figure_15_tabs/figure_15_tabs.pde | 228 - .../ch04-milkteacoffee/readme.txt | 16 - .../step_16_tabs_images/FloatTable.pde | 223 - .../data/milk-tea-coffee.tsv | 96 - .../step_16_tabs_images.pde | 237 - .../step_17_interpolate/FloatTable.pde | 223 - .../step_17_interpolate/Integrator.pde | 60 - .../data/milk-tea-coffee.tsv | 96 - .../step_17_interpolate.pde | 216 - .../step_08b_web/Integrator.java | 79 - .../step_08b_web/RankedList.java | 121 - .../step_08b_web/data/salaries.tsv | 30 - .../step_08b_web/data/small/ana.gif | Bin 453 -> 0 bytes .../step_08b_web/data/small/ari.gif | Bin 986 -> 0 bytes .../step_08b_web/data/small/atl.gif | Bin 664 -> 0 bytes .../step_08b_web/data/small/bal.gif | Bin 1072 -> 0 bytes .../step_08b_web/data/small/bos.gif | Bin 1202 -> 0 bytes .../step_08b_web/data/small/chc.gif | Bin 1096 -> 0 bytes .../step_08b_web/data/small/cin.gif | Bin 841 -> 0 bytes .../step_08b_web/data/small/cle.gif | Bin 1099 -> 0 bytes .../step_08b_web/data/small/col.gif | Bin 1005 -> 0 bytes .../step_08b_web/data/small/cws.gif | Bin 1050 -> 0 bytes .../step_08b_web/data/small/det.gif | Bin 1596 -> 0 bytes .../step_08b_web/data/small/fla.gif | Bin 1050 -> 0 bytes .../step_08b_web/data/small/hou.gif | Bin 815 -> 0 bytes .../step_08b_web/data/small/kc.gif | Bin 645 -> 0 bytes .../step_08b_web/data/small/la.gif | Bin 869 -> 0 bytes .../step_08b_web/data/small/mil.gif | Bin 815 -> 0 bytes .../step_08b_web/data/small/min.gif | Bin 1019 -> 0 bytes .../step_08b_web/data/small/nym.gif | Bin 1210 -> 0 bytes .../step_08b_web/data/small/nyy.gif | Bin 1116 -> 0 bytes .../step_08b_web/data/small/oak.gif | Bin 1180 -> 0 bytes .../step_08b_web/data/small/phi.gif | Bin 687 -> 0 bytes .../step_08b_web/data/small/pit.gif | Bin 1040 -> 0 bytes .../step_08b_web/data/small/sd.gif | Bin 825 -> 0 bytes .../step_08b_web/data/small/sea.gif | Bin 1227 -> 0 bytes .../step_08b_web/data/small/sf.gif | Bin 758 -> 0 bytes .../step_08b_web/data/small/stl.gif | Bin 928 -> 0 bytes .../step_08b_web/data/small/tb.gif | Bin 752 -> 0 bytes .../step_08b_web/data/small/tex.gif | Bin 861 -> 0 bytes .../step_08b_web/data/small/tor.gif | Bin 497 -> 0 bytes .../step_08b_web/data/small/was.gif | Bin 1609 -> 0 bytes .../step_08b_web/data/teams.tsv | 30 - .../step_08b_web/step_08b_web.pde | 475 - .../ColorIntegrator.java | 51 - .../round_09c_focus_handling/Integrator.java | 181 - .../round_09c_focus_handling/Place.pde | 131 - .../round_09c_focus_handling/Slurper.pde | 31 - .../data/ScalaSans-Regular-14.vlw | Bin 23330 -> 0 bytes .../round_09c_focus_handling.pde | 393 - .../ch07-hierarchies/equator_03b/WordItem.pde | 23 - .../ch07-hierarchies/equator_03b/WordMap.pde | 24 - .../equator_03b/data/equator.txt | 194700 --------------- .../equator_03b/equator_03b.pde | 40 - .../file_tree_queue_08b/Node.pde | 58 - .../file_tree_queue_08b.pde | 67 - .../filetreemap_06b/BoundsIntegrator.java | 178 - .../filetreemap_06b/FileItem.pde | 118 - .../filetreemap_06b/FolderItem.pde | 213 - .../filetreemap_06b/RankedLongArray.pde | 57 - .../filetreemap_06b/filetreemap_06b.pde | 93 - .../step_06c_variable_size_nodes/Edge.pde | 45 - .../step_06c_variable_size_nodes/Node.pde | 80 - .../data/huckfinn.txt | 17 - .../step_06c_variable_size_nodes.pde | 186 - .../step_07c_save_pdf/Edge.pde | 45 - .../step_07c_save_pdf/Node.pde | 80 - .../step_07c_save_pdf/data/huckfinn.txt | 17 - .../step_07c_save_pdf/step_07c_save_pdf.pde | 186 - .../step_08c_graphviz/Edge.pde | 45 - .../step_08c_graphviz/Node.pde | 80 - .../step_08c_graphviz/data/huckfinn.txt | 17 - .../step_08c_graphviz/step_08c_graphviz.pde | 200 - 1821 files changed, 307463 deletions(-) delete mode 100644 java/examples/Books/Getting Started/Chapter02/Ex_02_01/Ex_02_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter02/Ex_02_02/Ex_02_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_01/Ex_03_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_02/Ex_03_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_03/Ex_03_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_04/Ex_03_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_05/Ex_03_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_06/Ex_03_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_07/Ex_03_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_08/Ex_03_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_09/Ex_03_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_10/Ex_03_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_11/Ex_03_11.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_12/Ex_03_12.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_13/Ex_03_13.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_14/Ex_03_14.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_15/Ex_03_15.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_16/Ex_03_16.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_17/Ex_03_17.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_18/Ex_03_18.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_19/Ex_03_19.pde delete mode 100644 java/examples/Books/Getting Started/Chapter03/Ex_03_20/Ex_03_20.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_01/Ex_04_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_02/Ex_04_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_03/Ex_04_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_04/Ex_04_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_05/Ex_04_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_06/Ex_04_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_07/Ex_04_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_08/Ex_04_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_09/Ex_04_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_10/Ex_04_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_11/Ex_04_11.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_12/Ex_04_12.pde delete mode 100644 java/examples/Books/Getting Started/Chapter04/Ex_04_13/Ex_04_13.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_01/Ex_05_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_02/Ex_05_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_03/Ex_05_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_04/Ex_05_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_05/Ex_05_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_06/Ex_05_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_07/Ex_05_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_08/Ex_05_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_09/Ex_05_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_10/Ex_05_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_11/Ex_05_11.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_12/Ex_05_12.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_13/Ex_05_13.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_14/Ex_05_14.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_15/Ex_05_15.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_16/Ex_05_16.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_17/Ex_05_17.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_18/Ex_05_18.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_19/Ex_05_19.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_20/Ex_05_20.pde delete mode 100644 java/examples/Books/Getting Started/Chapter05/Ex_05_21/Ex_05_21.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_01/Ex_06_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_02/Ex_06_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_03/Ex_06_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_04/Ex_06_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_04/data/clouds.gif delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_05/Ex_06_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_06/Ex_06_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_06/data/AndaleMono-36.vlw delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_07/Ex_06_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_07/data/AndaleMono-24.vlw delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_08/Ex_06_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_08/data/AndaleMono-24.vlw delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_09/Ex_06_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_09/data/network.svg delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_10/Ex_06_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter06/Ex_06_10/data/network.svg delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_01/Ex_07_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_02/Ex_07_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_03/Ex_07_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_04/Ex_07_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_05/Ex_07_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_06/Ex_07_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_07/Ex_07_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_08/Ex_07_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_09/Ex_07_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_10/Ex_07_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_11/Ex_07_11.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_12/Ex_07_12.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_13/Ex_07_13.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_14/Ex_07_14.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_15/Ex_07_15.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_16/Ex_07_16.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_17/Ex_07_17.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_18/Ex_07_18.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_19/Ex_07_19.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_20/Ex_07_20.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_21/Ex_07_21.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_22/Ex_07_22.pde delete mode 100644 java/examples/Books/Getting Started/Chapter07/Ex_07_23/Ex_07_23.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_01/Ex_08_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_02/Ex_08_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_03/Ex_08_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_04/Ex_08_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_05/Ex_08_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_06/Ex_08_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_07/Ex_08_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter08/Ex_08_08/Ex_08_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter09/Ex_09_01/Ex_09_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter09/Ex_09_02/Ex_09_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_01/Ex_10_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_02/Ex_10_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_03/Ex_10_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_04/Ex_10_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_05/Ex_10_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_06/Ex_10_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_07/Ex_10_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_08/Ex_10_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_09/Ex_10_09.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_10/Ex_10_10.pde delete mode 100644 java/examples/Books/Getting Started/Chapter10/Ex_10_11/Ex_10_11.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_01/Ex_11_01.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_02/Ex_11_02.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_03/Ex_11_03.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_04/Ex_11_04.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_05/Ex_11_05.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_06/Ex_11_06.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_07/Ex_11_07.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_08/Ex_11_08.pde delete mode 100644 java/examples/Books/Getting Started/Chapter11/Ex_11_09/Ex_11_09.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot1_Draw/Robot1_Draw.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot2_Variables/Robot2_Variables.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot3_Response/Robot3_Response.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot4_Media/Robot4_Media.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot1.svg delete mode 100644 java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot2.svg delete mode 100644 java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot3.svg delete mode 100644 java/examples/Books/Getting Started/Robots/Robot5_Motion/Robot5_Motion.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot6_Functions/Robot6_Functions.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot7_Objects/Robot7_Objects.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot1.svg delete mode 100644 java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot2.svg delete mode 100644 java/examples/Books/Getting Started/Robots/Robot8_Arrays/Robot8_Arrays.pde delete mode 100644 java/examples/Books/Getting Started/Robots/Robot8_Arrays/data/robot1.svg delete mode 100644 java/examples/Books/Getting Started/media/AndaleMono-24.vlw delete mode 100644 java/examples/Books/Getting Started/media/AndaleMono-36.vlw delete mode 100644 java/examples/Books/Getting Started/media/clouds.gif delete mode 100644 java/examples/Books/Getting Started/media/network.svg delete mode 100644 java/examples/Books/Getting Started/media/robot1.svg delete mode 100644 java/examples/Books/Getting Started/media/robot2.svg delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Connection.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Exercise_10_5_LayeredNetworkAnimation.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Network.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Neuron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Connection.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/LayeredNetworkViz.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Network.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Neuron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/NOC_10_01_SimplePerceptron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Perceptron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Trainer.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/NOC_10_02_SeekingNeural.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Perceptron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Connection.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/NOC_10_03_NetworkViz.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Network.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Neuron.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Connection.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/NOC_10_04_NetworkAnimation.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Network.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Neuron.pde delete mode 100755 java/examples/Books/Nature of Code/chp10_nn/xor/Landscape.pde delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Connection.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/HiddenNeuron.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/InputNeuron.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Network.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Neuron.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/code/src/OutputNeuron.java delete mode 100644 java/examples/Books/Nature of Code/chp10_nn/xor/xor.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/NOC_1_10_motion101_acceleration.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/NOC_1_11_motion101_acceleration_array.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_1_bouncingball_novectors/NOC_1_1_bouncingball_novectors.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_2_bouncingball_vectors/NOC_1_2_bouncingball_vectors.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_3_vector_subtraction/NOC_1_3_vector_subtraction.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_4_vector_multiplication/NOC_1_4_vector_multiplication.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_5_vector_magnitude/NOC_1_5_vector_magnitude.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_6_vector_normalize/NOC_1_6_vector_normalize.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/NOC_1_7_motion101.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/NOC_1_8_motion101_acceleration.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/NOC_1_9_motion101_acceleration.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Exercise_2_10_attractrepel.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Extra_instantforce.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/NOC_02forces_many_attraction_3D.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/NOC_02forces_many_mutual_boundaries.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/NOC_2_1_forces.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/NOC_2_2_forces_many.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/NOC_2_3_forces_many_realgravity.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/NOC_2_4_forces_friction.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/NOC_2_4_forces_nofriction.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Liquid.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/NOC_2_5_fluidresistance.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Liquid.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/NOC_2_5_fluidresistance_sequence.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/NOC_2_6_attraction.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/NOC_2_7_attraction_many.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/NOC_2_8_mutual_attraction.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/AdditiveWave/AdditiveWave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/AttractionArrayWithOscillation.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Crawler.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Oscillator.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_01_exercise_baton/Exercise_3_01_exercise_baton.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/CannonBall.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/Exercise_3_03_cannon.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_04_spiral/Exercise_3_04_spiral.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Exercise_3_05_asteroids.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Spaceship.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Exercise_3_10_OOPWave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Wave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_11_AdditiveWave/Exercise_3_11_AdditiveWave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Exercise_3_16_springs.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Exercise_3_16_springs_array.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/ExtraOscillatingBody.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingUpAndDown/ExtraOscillatingUpAndDown.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/MultipleOscillations/MultipleOscillations.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_03spring_exercise_sine/NOC_03spring_exercise_sine.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_01_angular_motion/NOC_3_01_angular_motion.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/NOC_3_02_forces_angular_motion.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/NOC_3_03_pointing_velocity.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian/NOC_3_04_PolarToCartesian.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian_trail/NOC_3_04_PolarToCartesian_trail.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_05_simple_harmonic_motion/NOC_3_05_simple_harmonic_motion.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_06_simple_harmonic_motion/NOC_3_06_simple_harmonic_motion.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/NOC_3_07_oscillating_objects.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/Oscillator.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_08_static_wave_lines/NOC_3_08_static_wave_lines.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_exercise_additive_wave/NOC_3_09_exercise_additive_wave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave/NOC_3_09_wave.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_a/NOC_3_09_wave_a.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_b/NOC_3_09_wave_b.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_c/NOC_3_09_wave_c.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/NOC_3_10_PendulumExample.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/Pendulum.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/NOC_3_10_PendulumExampleSimplified.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/Pendulum.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/NOC_3_11_spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/OOPWaveParticles.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Wave.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/CircleVsBlob.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/blob.tif delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/circle.tif delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/data/texture.gif delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/data/texture.psd delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_03_MovingParticleSystem/Exercise_4_03_MovingParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_03_MovingParticleSystem/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_03_MovingParticleSystem/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Exercise_4_04_asteroids.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Spaceship.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Exercise_4_06_Shatter.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Exercise_4_10_particleintersection.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Exercise_4_10_particlerepel.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Exercise_4_12_ArrayofImages.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/data/texture.psd delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_01_SingleParticle/NOC_4_01_SingleParticle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_01_SingleParticle/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_01_SingleParticle_trail/NOC_4_01_SingleParticle_trail.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_01_SingleParticle_trail/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_02_ArrayListParticles/NOC_4_02_ArrayListParticles.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_02_ArrayListParticles/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/NOC_4_03_ParticleSystemClass.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/NOC_4_04_SystemofSystems.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Confetti.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/NOC_4_05_ParticleSystemInheritancePolymorphism.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/NOC_4_06_ParticleSystemForces.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/NOC_4_07_ParticleSystemForcesRepeller.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Repeller.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/NOC_4_08_ParticleSystemSmoke.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/data/texture.psd delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/NOC_4_08_ParticleSystemSmoke_b.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/data/texture.psd delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/NOC_4_09_AdditiveBlending.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/data/texture.psd delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleChild.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystemInheritance_pushpop.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/NOC_gl.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/emitter.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/flight404_particles_1_simple.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/NOC_gl.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/cursor.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/emitter.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/flight404_particles_2_GLtexture.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/images.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/nebula.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/pov.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/NOC_gl.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/cursor.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/emitter.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/flight404_particles_2_simple.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/images.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/nebula.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/particle.pde delete mode 100755 java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/pov.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Circle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Shape.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Square.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/simpleInheritance.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Circle.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Shape.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Square.pde delete mode 100644 java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/simplePolymorphism.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/CollisionsEqualMass.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/drawVector.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Blob.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/BlobSkeleton.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blob.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blobby.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/CollisionListeningDeletionExercise.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/CollisionsAndControl.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/CollisionsAndControlInterface.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/ContactListener.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Exercise_5_10_ApplyForceAttractMouse.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Exercise_5_10_ApplyForceSimpleWind.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Exercise_5_10_AttractionApplyForce.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Mover.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Exercise_5_3_NoiseChain.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Surface.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Exercise_5_3_SineChain.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Surface.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Bridge.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Exercise_5_6_Bridge.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/KinematicTest.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Liquidy.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/ParticleSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/MouseKinematic.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/NOC_5_1_box2d_exercise.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/NOC_5_1_box2d_exercise_solved.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/NOC_5_2_Boxes.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/NOC_5_3_ChainShape_Simple.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Surface.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/CustomShape.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/NOC_5_4_Polygons.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Lollipop.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/NOC_5_5_MultiShapes.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/NOC_5_6_DistanceJoint.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Pair.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/NOC_5_7_RevoluteJoint.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Windmill.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Box.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/NOC_5_8_MouseJoint.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Spring.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Boundary.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/NOC_5_9_CollisionListening.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/VectorStuff/VectorStuff.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/readme.txt delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Blanket.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Connection.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Exercise_5_13_SoftBodySquareAdapted.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Cluster.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Exercise_5_15_ForceDirectedGraph.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Node.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/NOC_5_10_SimpleSpring.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Chain.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/NOC_5_11_SoftStringPendulum.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Cluster.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/NOC_5_12_SimpleCluster.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Node.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Attractor.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/NOC_5_13_AttractRepel.pde delete mode 100644 java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Particle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Alignment/Alignment.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Alignment/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Exercise_6_04_Wander.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Exercise_6_08_FlowField3DNoise.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/FlowField.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_09_AngleBetween/Exercise_6_09_AngleBetween.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Exercise_6_13_CrowdPathFollowing.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Path.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Boid.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Exercise_6_17_View.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Flock.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowField.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowfieldImage.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/NOC_6_01_Seek.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/NOC_6_01_Seek_trail.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/NOC_6_02_Arrive.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/NOC_6_03_StayWithinWalls.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/NOC_6_03_StayWithinWalls_trail.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/FlowField.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/NOC_6_04_Flow_Figures.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/data/arrow.svg delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/FlowField.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/NOC_6_04_Flowfield.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/NOC_6_05_PathFollowingSimple.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Path.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/NOC_6_06_PathFollowing.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Path.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/NOC_6_07_Separation.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/NOC_6_08_SeparationAndSeek.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Boid.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Flock.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/NOC_6_09_Flocking.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/SimpleScalarProjection/SimpleScalarProjection.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/StayWithinCircle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/Vehicle.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/Thing.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/intersection.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/Thing.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/intersection_slow.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Boid.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flock.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flocking_box2d.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Boid.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Flock.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/flocking_sliders.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/keyPressed.pde delete mode 100644 java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/scrollbar.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/Exercise_7_01_WolframCA_randomizedrules.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/Exercise_7_04_WolframCA_scrolling.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/Exercise_7_04_WolframCA_scrolling_110.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/Exercise_7_04_WolframCA_scrolling_190.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/Exercise_7_04_WolframCA_scrolling_222.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/Exercise_7_04_WolframCA_scrolling_30.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Cell.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Exercise_7_09_HexagonCells.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/GOL.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/Figure_7_17_cells.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/cells.tif delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/GameOfLifeWrapAround/GOL.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/GameOfLifeWrapAround/GameOfLifeWrapAround.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/HexagonCells/Cell.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/HexagonCells/GOL.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/HexagonCells/HexagonCells.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/NOC_7_01_WolframCA_figures.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/CA.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/NOC_7_01_WolframCA_simple.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/GOL.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/NOC_7_02_GameOfLifeSimple.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/Cell.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/GOL.pde delete mode 100644 java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/NOC_7_03_GameOfLifeOOP.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/CantorSetArrayList.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/Line.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_01_RecursionLines/Exercise_8_01_RecursionLines.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/Exercise_8_02_KochSnowFlake.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/KochLine.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_06_Tree/Exercise_8_06_Tree.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_07_Tree/Exercise_8_07_Tree.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Branch.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Exercise_8_08_09_TreeArrayListLeaves.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Leaf.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_10_TreeStochasticNoise/Exercise_8_10_TreeStochasticNoise.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Figure_8_02_Mandelbrot/Figure_8_02_Mandelbrot.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/Figure_8_14_Koch.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/KochLine.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Figure_8_20_Tree/Figure_8_20_Tree.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/Figure_8_CantorLine/Figure_8_CantorLine.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_01_Recursion/NOC_8_01_Recursion.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_02_Recursion/NOC_8_02_Recursion.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_03_Recursion/NOC_8_03_Recursion.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_CantorSet/NOC_8_04_CantorSet.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_Tree/NOC_8_04_Tree.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochFractal.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochLine.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/NOC_8_05_Koch.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/KochLine.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/NOC_8_05_KochSimple.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_SimpleLSystem/NOC_8_06_SimpleLSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree/NOC_8_06_Tree.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree_static/NOC_8_06_Tree_static.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic/NOC_8_07_TreeStochastic.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic_angleonly/NOC_8_07_TreeStochastic_angleonly.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_08_SimpleLSystem/NOC_8_08_SimpleLSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/LSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/NOC_8_09_LSystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Rule.pde delete mode 100644 java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Turtle.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/EvolveFlowField.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Obstacle.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Rocket.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/GA_Shakespeare_fancyfitness.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/NOC_9_01_GA_Shakespeare.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/NOC_9_01_GA_Shakespeare_simplified.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/NOC_9_02_SmartRockets_superbasic.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Rocket.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/NOC_9_03_SmartRockets.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Obstacle.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Rocket.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Button.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Face.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/NOC_9_04_Faces_interactiveselection.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Population.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Rectangle.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Bloop.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/DNA.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Food.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/NOC_9_05_EvolutionEcosystem.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/World.pde delete mode 100644 java/examples/Books/Nature of Code/chp9_ga/bruteforce/bruteforce.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Exercise_I_10_NoiseLandscape.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Landscape.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Exercise_I_1_WalkerTendsToDownRight.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Exercise_I_9_Noise3D/Exercise_I_9_Noise3D.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Figure_I_2_BellCurve/Figure_I_2_BellCurve.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Figure_I_5_Noise1DGraph/Figure_I_5_Noise1DGraph.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Figure_I_6_RandomGraph/Figure_I_6_RandomGraph.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Gaussian2/Gaussian2.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/MonteCarloDistribution/MonteCarloDistribution.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/MultipleProbability/MultipleProbability.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_1_RandomWalkTraditional/NOC_I_1_RandomWalkTraditional.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_1_RandomWalkTraditional/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_2_RandomDistribution/NOC_I_2_RandomDistribution.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_3_RandomWalkTendsToRight/NOC_I_3_RandomWalkTendsToRight.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_3_RandomWalkTendsToRight/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_4_Gaussian/NOC_I_4_Gaussian.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_5_NoiseWalk/NOC_I_5_NoiseWalk.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NOC_I_5_NoiseWalk/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Noise1D/Noise1D.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/Noise2D/Noise2D.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseDistribution/NoiseDistribution.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/NoiseWalkAcceleration.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/NoiseWalkVelocity.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/NoiseWalk_Many.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalk/RandomWalk.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalk/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkLevy/RandomWalkLevy.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkLevy/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkNoise/RandomWalkNoise.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkNoise/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkPVector/RandomWalkPVector.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkPVector/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/RandomWalkTraditional2.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/RandomWalkTraditional3.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTrail/RandomWalkTrail.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTrail/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/RandomWalkTrailCurve.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/SelfAvoidingWalk.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/Walker.pde delete mode 100644 java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/goal.svg delete mode 100644 java/examples/Books/Nature of Code/introduction/SimpleProbablility/SimpleProbablility.pde delete mode 100755 java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_04/Ex_04.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_01/Ex_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_02/Ex_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix D/Ex_01/Ex_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_01/Ex_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_02/Ex_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_03/Ex_03.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_04/Ex_04.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_05/Ex_05.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_06/Ex_06.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_07/Ex_07.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_08/Ex_08.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_09/Ex_09.pde delete mode 100644 java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/data/chair.obj delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/3D/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01A/Ex_01A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01B/Ex_01B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02A/Ex_02A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02B/Ex_02B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03A/Ex_03A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03B/Ex_03B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04A/Ex_04A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04B/Ex_04B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05A/Ex_05A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05B/Ex_05B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_02A/Ex_02A.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_02B/Ex_02B.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/data/CourierNew-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Print/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_03/data/cela3.aif delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_04/data/guitar.aif delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Sound/Ex_05/data/test.aif delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Vision/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Vision/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Vision/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Extensions/Vision/Ex_04/Ex_04.pde delete mode 100644 java/examples/Books/Processing Handbook/Illustrations/page_022/page_022.pde delete mode 100644 java/examples/Books/Processing Handbook/Illustrations/page_042/page_042.pde delete mode 100644 java/examples/Books/Processing Handbook/Illustrations/page_060/page_060.pde delete mode 100644 java/examples/Books/Processing Handbook/Illustrations/page_078/page_078.pde delete mode 100644 java/examples/Books/Processing Handbook/Illustrations/page_094/page_094.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_100/page_100.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_110/page_110.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_126/page_126.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_136/page_136.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_144/page_144.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_148/data/Thumbs.db delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_148/page_148.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_172/page_172.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_216/page_216.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_222/page_222.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_228/page_228.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_250/page_250.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_254/page_254.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_278/page_278.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_290/page_290.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_300/page_300.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0000.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0001.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0002.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0003.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0004.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0005.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0006.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0007.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0008.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0009.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0010.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0011.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0012.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0013.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0014.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0015.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0016.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0017.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0018.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0019.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0020.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0021.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0022.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0023.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0024.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0025.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0026.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0027.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0028.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0029.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0030.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0031.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0032.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0033.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0034.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0035.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0036.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/data/PT_Shifty_0037.gif delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_314/page_314.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_326/page_326.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_346/page_346.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_366/page_366.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_394/page_394.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_412/page_412.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_420/page_420.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_476/ArrowParticle.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_476/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_476/page_476.pde delete mode 100755 java/examples/Books/Processing Handbook/Illustrations/page_xx/page_xx.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_01_collage_01/Synthesis_01_collage_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_01_collage_02/Synthesis_01_collage_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_01/Synthesis_02_waves_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_02/Synthesis_02_waves_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_03/Synthesis_02_waves_03.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_04/Synthesis_02_waves_04.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_02_waves_05/Synthesis_02_waves_05.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_01/Synthesis_03_grids_01.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_02/Synthesis_03_grids_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_03/Synthesis_03_grids_03.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_04/Synthesis_03_grids_04.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_03_grids_05/Synthesis_03_grids_05.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_04_mandelbrot/Synthesis_04_mandelbrot.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_05_tennis/Synthesis_05_tennis.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/Synthesis_06_cursor.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_06_cursor/data/NewsGothicBT-Bold-48.vlw delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/Synthesis_07_typing.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/data/TheSerif-Plain-128.vlw delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_07_typing/data/TheSerif-Plain-96.vlw delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_08_clock/Synthesis_08_clock.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_09_centipede/Synthesis_09_centipede.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_10_chronodraw/Synthesis_10_chronodraw.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_11_amoebaAbstract/Synthesis_11_amoebaAbstract.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/Synthesis_12_robot.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/battalpha.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/batteat.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/batteatalpha.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_12_robot/data/headalpha.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/Module.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/ModuleA.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/ModuleB.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/Synthesis_13_withoutTitle.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/Thumbs.db delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_down.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_hi.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/down_lo.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_down.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_hi.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_13_withoutTitle/data/up_lo.gif delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_14_pond/Synthesis_14_pond.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Branch.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Segment.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/Synthesis_15_tree.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_15_tree/data/treeData.txt delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Button.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Control.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Mass.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Slider.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Spring.pde delete mode 100644 java/examples/Books/Processing Handbook/Synthesis/Synthesis_16_sodaprocessing/Synthesis_16_sodaprocessing.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/00 Using Processing/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/01 Structure 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_21/Ex_21.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_22/Ex_22.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_23/Ex_23.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_24/Ex_24.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_25/Ex_25.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_26/Ex_26.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_27/Ex_27.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_28/Ex_28.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_29/Ex_29.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_30/Ex_30.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_31/Ex_31.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_32/Ex_32.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_33/Ex_33.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_34/Ex_34.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_35/Ex_35.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_36/Ex_36.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_37/Ex_37.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_38/Ex_38.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_39/Ex_39.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_40/Ex_40.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/02 Shape 1/Ex_41/Ex_41.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/03 Data 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_21/Ex_21.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_22/Ex_22.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_23/Ex_23.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_24/Ex_24.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_25/Ex_25.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/04 Math 1/Ex_26/Ex_26.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/05 Control 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/06 Control 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/07 Shape 2/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/08 Math 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/09 Color 1/Ex_21/Ex_21.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_08/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_08/data/mud-trans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/10 Image 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_01/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_02/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_03/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_04/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_05/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/11 Data 2/Ex_06/data/archTrans.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/12 Data 3/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_01/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_02/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_03/data/Courier-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_03/data/Ziggurat-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_04/data/Courier-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_04/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_05/data/Courier-96.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_05/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_05/data/Ziggurat-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_05/data/Ziggurat-72.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/data/Courier-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/data/CourierItalic-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/data/ZigguratItalic-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_06/data/ZigguratItalic-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_07/data/Courier-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_07/data/CourierItalic-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_07/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_08/data/Courier-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_08/data/Ziggurat-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_09/data/Courier-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_09/data/Ziggurat-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_10/data/Courier-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_10/data/Ziggurat-12.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_11/data/Courier-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/13 Typography 1/Ex_11/data/Ziggurat-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_07/Ex_07.pde delete mode 100644 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_08/14-08.tif delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/14 Math 3/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/15 Math 4/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/16 Transform 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 00-17/17 Transform 2/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/20 Structure 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/21 Structure 3/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/22 Shape 3/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/23 Input 1/Ex_20/Ex_20.pde delete mode 100644 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_01/24-01--1.tif delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_02/Ex_02.pde delete mode 100644 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_03/24-03--34556.tif delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/24 Drawing 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_03/data/ThesisMonoLight-72.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/25 Input 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_07/data/Eureka-24.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_08/data/Eureka-24.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/26 Input 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/27 Input 4/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_03/data/Pro-20.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 20-29/28 Input 5/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/31 Motion 1/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/32 Motion 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_21/Ex_21.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_22/Ex_22.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_23/Ex_23.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/33 Data 4/Ex_24/Ex_24.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-000.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-001.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-002.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-003.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-004.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-005.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-006.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-007.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-008.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-009.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-010.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_01/data/ani-011.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-000.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-001.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-002.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-003.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-004.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-005.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-006.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-007.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-008.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-009.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-010.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_02/data/ani-011.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-000.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-001.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-002.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-003.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-004.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-005.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-006.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-007.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-008.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-009.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-010.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_03/data/ani-011.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-000.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-001.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-002.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-003.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-004.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-005.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-006.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-007.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-008.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-009.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-010.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_04/data/ani-011.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_05/data/PT-Shifty-0020.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_06/data/PT-Shifty-0023.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/34 Image 2/Ex_07/data/PT-Teddy-0017.gif delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/35 Image 3/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_01/data/Eureka-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_02/data/Eureka-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_03/data/Eureka-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_04/data/EurekaSmallCaps-36.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_05/data/Eureka-90.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_06/data/Eureka-32.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_07/data/EurekaMono-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/36 Typography 2/Ex_08/data/EurekaSmallCaps-36.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_01/data/Eureka-24.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_02/data/Eureka-24.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_03/data/Eureka-24.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/37 Typography 3/Ex_04/data/Eureka-48.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/38 Color 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/39 Image 4/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/40 Image 5/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 31-42/41 Output 1/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/43 Structure 4/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_05/Ex_05.pde delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_06/44-06--0775.tif delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_06/44-06--1287.tif delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_06/44-06--2208.tif delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_06/44-06--6438.tif delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/44 Drawing 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_03/Ex_03.pde delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_03/lines.txt delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_05/data/Eureka-24.vlw delete mode 100644 java/examples/Books/Processing Handbook/Units 43-51/45 Output 2/Ex_05/words.txt delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_01/data/positions.txt delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_05/data/positions.txt delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_06/data/cars2.tsv delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/46 Input 6/Ex_07/data/2895.txt delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_03/OverCircle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_03/OverRect.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_04/OverCircle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_04/OverRect.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_06/Button.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_07/Button.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_09/Check.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_10/Check.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_12/Radio.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_13/Radio.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_15/Scrollbar.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_15/data/Courier-30.vlw delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/47 Input 7/Ex_16/Scrollbar.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_02/Egg.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_02/Ring.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_03/Egg.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_03/EggRing.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_03/Ring.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_05/Spin.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_06/Spin.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_07/Spin.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_07/SpinArm.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_07/SpinSpots.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_08/Button.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_09/Button.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_09/DragButton.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_10/Button.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_10/DragButton.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/48 Structure 5/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/49 Simulate 1/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/49 Simulate 1/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/49 Simulate 1/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/49 Simulate 1/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/49 Simulate 1/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_01/Ex_01.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_02/Ex_02.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_03/Ex_03.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_04/Ex_04.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_05/Ex_05.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_06/Ex_06.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_06/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_07/Ex_07.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_07/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_08/Ex_08.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_08/GenParticle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_08/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_09/Ex_09.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_09/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_10/Ex_10.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_10/LimitedParticle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_10/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_11/Ex_11.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_11/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_12/ArrowParticle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_12/Ex_12.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_12/Particle.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_13/Ex_13.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_14/Ex_14.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_15/Ex_15.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_16/Ex_16.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_16/Spring2D.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_17/Ex_17.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_17/Spring2D.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_18/Ex_18.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_18/Spring2D.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_19/Ex_19.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_19/FixedSpring.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_19/Spring2D.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_20/Ex_20.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_20/FixedSpring.pde delete mode 100755 java/examples/Books/Processing Handbook/Units 43-51/50 Simulate 2/Ex_20/Spring2D.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/readme.txt delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step00_show_map/step00_show_map.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step01_fig1_red_dots/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step01_fig1_red_dots/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step01_fig1_red_dots/step01_fig1_red_dots.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step02_fig2_varying_sizes/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step02_fig2_varying_sizes/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step02_fig2_varying_sizes/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step02_fig2_varying_sizes/step02_fig2_varying_sizes.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step03_fig3_red_to_blue/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step03_fig3_red_to_blue/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step03_fig3_red_to_blue/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step03_fig3_red_to_blue/step03_fig3_red_to_blue.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step04_fig4_blue_green/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step04_fig4_blue_green/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step04_fig4_blue_green/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step04_fig4_blue_green/step04_fig4_blue_green.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step05_fig5_blue_green_hsb/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step05_fig5_blue_green_hsb/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step05_fig5_blue_green_hsb/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step05_fig5_blue_green_hsb/step05_fig5_blue_green_hsb.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step06_fig6_two_sided_range/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step06_fig6_two_sided_range/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step06_fig6_two_sided_range/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step06_fig6_two_sided_range/step06_fig6_two_sided_range.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step07_fig7_two_sided_alpha/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step07_fig7_two_sided_alpha/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step07_fig7_two_sided_alpha/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step07_fig7_two_sided_alpha/step07_fig7_two_sided_alpha.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step08_rollovers/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step08_rollovers/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step08_rollovers/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step08_rollovers/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step08_rollovers/step08_rollovers.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step09_rollovers_full_names/step09_rollovers_full_names.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step10_single_rollover/step10_single_rollover.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step11_randomize_on_keypress/step11_randomize_on_keypress.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step12_randomize_with_nfp/step12_randomize_with_nfp.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/data/names.tsv delete mode 100755 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/random.cgi delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step13_randomize_from_cgi/step13_randomize_from_cgi.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/Integrator.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step14_integrators/step14_integrators.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/Integrator.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step15_framerate/step15_framerate.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/Integrator.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step16_lethargic/step16_lethargic.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/Integrator.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/Table.pde delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/data/Univers-Bold-12.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/data/locations.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/data/names.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/data/random.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch03-usmap/step17_bouncy/step17_bouncy.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_01_just_points/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_01_just_points/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_01_just_points/figure_01_just_points.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_02_plot_title/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_02_plot_title/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_02_plot_title/figure_02_plot_title.pde delete mode 100755 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_03_labels/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_03_labels/data/milk-tea-coffee.tsv delete mode 100755 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_03_labels/figure_03_labels.pde delete mode 100755 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_04_grid/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_04_grid/data/milk-tea-coffee.tsv delete mode 100755 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_04_grid/figure_04_grid.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_05_ylabels_and_ticks/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_05_ylabels_and_ticks/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_05_ylabels_and_ticks/figure_05_ylabels_and_ticks.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_06_finalish/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_06_finalish/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_06_finalish/figure_06_finalish.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_07a_shape_noFill/figure_07a_shape_noFill.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_07b_shape_fill/figure_07b_shape_fill.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_07c_shape_close/figure_07c_shape_close.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_08_draw_data_line/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_08_draw_data_line/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_08_draw_data_line/figure_08_draw_data_line.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_09_draw_data_mixed/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_09_draw_data_mixed/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_09_draw_data_mixed/figure_09_draw_data_mixed.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_10_rollovers/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_10_rollovers/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_10_rollovers/figure_10_rollovers.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_11_curve/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_11_curve/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_11_curve/figure_11_curve.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_12_area/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_12_area/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_12_area/figure_12_area.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_13_reversed/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_13_reversed/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_13_reversed/figure_13_reversed.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_14_bar_chart/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_14_bar_chart/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_14_bar_chart/figure_14_bar_chart.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_15_tabs/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_15_tabs/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/figure_15_tabs/figure_15_tabs.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/readme.txt delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_16_tabs_images/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_16_tabs_images/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_16_tabs_images/step_16_tabs_images.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_17_interpolate/FloatTable.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_17_interpolate/Integrator.pde delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_17_interpolate/data/milk-tea-coffee.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch04-milkteacoffee/step_17_interpolate/step_17_interpolate.pde delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/Integrator.java delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/RankedList.java delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/salaries.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/ana.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/ari.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/atl.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/bal.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/bos.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/chc.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/cin.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/cle.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/col.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/cws.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/det.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/fla.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/hou.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/kc.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/la.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/mil.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/min.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/nym.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/nyy.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/oak.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/phi.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/pit.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/sd.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/sea.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/sf.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/stl.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/tb.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/tex.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/tor.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/small/was.gif delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/data/teams.tsv delete mode 100644 java/examples/Books/Visualizing Data/ch05-salaryper/step_08b_web/step_08b_web.pde delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/ColorIntegrator.java delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/Integrator.java delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/Place.pde delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/Slurper.pde delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/data/ScalaSans-Regular-14.vlw delete mode 100644 java/examples/Books/Visualizing Data/ch06-zipdecode/round_09c_focus_handling/round_09c_focus_handling.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/equator_03b/WordItem.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/equator_03b/WordMap.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/equator_03b/data/equator.txt delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/equator_03b/equator_03b.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/file_tree_queue_08b/Node.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/file_tree_queue_08b/file_tree_queue_08b.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/BoundsIntegrator.java delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/FileItem.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/FolderItem.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/RankedLongArray.pde delete mode 100644 java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/filetreemap_06b.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_06c_variable_size_nodes/Edge.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_06c_variable_size_nodes/Node.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_06c_variable_size_nodes/data/huckfinn.txt delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_06c_variable_size_nodes/step_06c_variable_size_nodes.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_07c_save_pdf/Edge.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_07c_save_pdf/Node.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_07c_save_pdf/data/huckfinn.txt delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_07c_save_pdf/step_07c_save_pdf.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_08c_graphviz/Edge.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_08c_graphviz/Node.pde delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_08c_graphviz/data/huckfinn.txt delete mode 100644 java/examples/Books/Visualizing Data/ch08-graphlayout/step_08c_graphviz/step_08c_graphviz.pde diff --git a/java/examples/Books/Getting Started/Chapter02/Ex_02_01/Ex_02_01.pde b/java/examples/Books/Getting Started/Chapter02/Ex_02_01/Ex_02_01.pde deleted file mode 100644 index 82539334c..000000000 --- a/java/examples/Books/Getting Started/Chapter02/Ex_02_01/Ex_02_01.pde +++ /dev/null @@ -1,4 +0,0 @@ -// Example 02-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -ellipse(50, 50, 80, 80); diff --git a/java/examples/Books/Getting Started/Chapter02/Ex_02_02/Ex_02_02.pde b/java/examples/Books/Getting Started/Chapter02/Ex_02_02/Ex_02_02.pde deleted file mode 100644 index 0455e4836..000000000 --- a/java/examples/Books/Getting Started/Chapter02/Ex_02_02/Ex_02_02.pde +++ /dev/null @@ -1,17 +0,0 @@ -// Example 02-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - if (mousePressed) { - fill(0); - } else { - fill(255); - } - ellipse(mouseX, mouseY, 80, 80); -} - diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_01/Ex_03_01.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_01/Ex_03_01.pde deleted file mode 100644 index 2220a08fb..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_01/Ex_03_01.pde +++ /dev/null @@ -1,4 +0,0 @@ -// Example 03-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(800, 600); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_02/Ex_03_02.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_02/Ex_03_02.pde deleted file mode 100644 index abd536f2c..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_02/Ex_03_02.pde +++ /dev/null @@ -1,5 +0,0 @@ -// Example 03-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -point(240, 60); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_03/Ex_03_03.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_03/Ex_03_03.pde deleted file mode 100644 index ba7ab8280..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_03/Ex_03_03.pde +++ /dev/null @@ -1,5 +0,0 @@ -// Example 03-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -line(20, 50, 420, 110); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_04/Ex_03_04.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_04/Ex_03_04.pde deleted file mode 100644 index eb117b98c..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_04/Ex_03_04.pde +++ /dev/null @@ -1,7 +0,0 @@ -// Example 03-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -quad(158, 55, 199, 14, 392, 66, 351, 107); -triangle(347, 54, 392, 9, 392, 66); -triangle(158, 55, 290, 91, 290, 112); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_05/Ex_03_05.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_05/Ex_03_05.pde deleted file mode 100644 index 9e297af1e..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_05/Ex_03_05.pde +++ /dev/null @@ -1,5 +0,0 @@ -// Example 03-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -rect(180, 60, 220, 40); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_06/Ex_03_06.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_06/Ex_03_06.pde deleted file mode 100644 index d4016401c..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_06/Ex_03_06.pde +++ /dev/null @@ -1,7 +0,0 @@ -// Example 03-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -ellipse(278, -100, 400, 400); -ellipse(120, 100, 110, 110); -ellipse(412, 60, 18, 18); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_07/Ex_03_07.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_07/Ex_03_07.pde deleted file mode 100644 index a0dc019a7..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_07/Ex_03_07.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 03-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -arc(90, 60, 80, 80, 0, HALF_PI); -arc(190, 60, 80, 80, 0, PI+HALF_PI); -arc(290, 60, 80, 80, PI, TWO_PI+HALF_PI); -arc(390, 60, 80, 80, QUARTER_PI, PI+QUARTER_PI); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_08/Ex_03_08.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_08/Ex_03_08.pde deleted file mode 100644 index 75b5f4f73..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_08/Ex_03_08.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 03-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -arc(90, 60, 80, 80, 0, radians(90)); -arc(190, 60, 80, 80, 0, radians(270)); -arc(290, 60, 80, 80, radians(180), radians(450)); -arc(390, 60, 80, 80, radians(45), radians(225)); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_09/Ex_03_09.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_09/Ex_03_09.pde deleted file mode 100644 index 525f1da67..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_09/Ex_03_09.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 03-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -ellipse(140, 0, 190, 190); -// The rectangle draws on top of the ellipse -// because it comes after in the code -rect(160, 30, 260, 20); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_10/Ex_03_10.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_10/Ex_03_10.pde deleted file mode 100644 index b765d8fb9..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_10/Ex_03_10.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 03-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -rect(160, 30, 260, 20); -// The ellipse draws on top of the rectangle -// because it comes after in the code -ellipse(140, 0, 190, 190); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_11/Ex_03_11.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_11/Ex_03_11.pde deleted file mode 100644 index d40ff08cb..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_11/Ex_03_11.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 03-11 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); // Turns on smoothing -ellipse(140, 60, 90, 90); -noSmooth(); // Turns off smoothing -ellipse(240, 60, 90, 90); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_12/Ex_03_12.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_12/Ex_03_12.pde deleted file mode 100644 index fdd8e9a4f..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_12/Ex_03_12.pde +++ /dev/null @@ -1,11 +0,0 @@ -// Example 03-12 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -ellipse(75, 60, 90, 90); -strokeWeight(8); // Stroke weight to 8 pixels -ellipse(175, 60, 90, 90); -ellipse(279, 60, 90, 90); -strokeWeight(20); // Stroke weight to 20 pixels -ellipse(389, 60, 90, 90); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_13/Ex_03_13.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_13/Ex_03_13.pde deleted file mode 100644 index e47332559..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_13/Ex_03_13.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 03-13 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(12); -strokeJoin(ROUND); // Round the stroke corners -rect(40, 25, 70, 70); -strokeJoin(BEVEL); // Bevel the stroke corners -rect(140, 25, 70, 70); -strokeCap(SQUARE); // Square the line endings -line(270, 25, 340, 95); -strokeCap(ROUND); // Round the line endings -line(350, 25, 420, 95); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_14/Ex_03_14.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_14/Ex_03_14.pde deleted file mode 100644 index 31f7d5f93..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_14/Ex_03_14.pde +++ /dev/null @@ -1,12 +0,0 @@ -// Example 03-14 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -background(0); // Black -fill(204); // Light gray -ellipse(132, 82, 200, 200); // Light gray circle -fill(153); // Medium gray -ellipse(228, -16, 200, 200); // Medium gray circle -fill(102); // Dark gray -ellipse(268, 118, 200, 200); // Dark gray circle diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_15/Ex_03_15.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_15/Ex_03_15.pde deleted file mode 100644 index 83b5d3c44..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_15/Ex_03_15.pde +++ /dev/null @@ -1,11 +0,0 @@ -// Example 03-15 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -fill(153); // Medium gray -ellipse(132, 82, 200, 200); // Gray circle -noFill(); // Turn off fill -ellipse(228, -16, 200, 200); // Outline circle -noStroke(); // Turn off stroke -ellipse(268, 118, 200, 200); // Doesn’t draw! diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_16/Ex_03_16.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_16/Ex_03_16.pde deleted file mode 100644 index 833ce14a1..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_16/Ex_03_16.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 03-16 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -noStroke(); -smooth(); -background(0, 26, 51); // Dark blue color -fill(255, 0, 0); // Red color -ellipse(132, 82, 200, 200); // Red circle -fill(0, 255, 0); // Green color -ellipse(228, -16, 200, 200); // Green circle -fill(0, 0, 255); // Blue color -ellipse(268, 118, 200, 200); // Blue circle diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_17/Ex_03_17.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_17/Ex_03_17.pde deleted file mode 100644 index d7bbbd22d..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_17/Ex_03_17.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 03-17 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -noStroke(); -smooth(); -background(204, 226, 225); // Light blue color -fill(255, 0, 0, 160); // Red color -ellipse(132, 82, 200, 200); // Red circle -fill(0, 255, 0, 160); // Green color -ellipse(228, -16, 200, 200); // Green circle -fill(0, 0, 255, 160); // Blue color -ellipse(268, 118, 200, 200); // Blue circle diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_18/Ex_03_18.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_18/Ex_03_18.pde deleted file mode 100644 index c19099ee0..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_18/Ex_03_18.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 03-18 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -beginShape(); -vertex(180, 82); -vertex(207, 36); -vertex(214, 63); -vertex(407, 11); -vertex(412, 30); -vertex(219, 82); -vertex(226, 109); -endShape(); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_19/Ex_03_19.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_19/Ex_03_19.pde deleted file mode 100644 index 0e1e8d785..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_19/Ex_03_19.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 03-19 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -beginShape(); -vertex(180, 82); -vertex(207, 36); -vertex(214, 63); -vertex(407, 11); -vertex(412, 30); -vertex(219, 82); -vertex(226, 109); -endShape(CLOSE); diff --git a/java/examples/Books/Getting Started/Chapter03/Ex_03_20/Ex_03_20.pde b/java/examples/Books/Getting Started/Chapter03/Ex_03_20/Ex_03_20.pde deleted file mode 100644 index 76b283bfa..000000000 --- a/java/examples/Books/Getting Started/Chapter03/Ex_03_20/Ex_03_20.pde +++ /dev/null @@ -1,38 +0,0 @@ -// Example 03-20 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); - -// Left creature -beginShape(); -vertex(50, 120); -vertex(100, 90); -vertex(110, 60); -vertex(80, 20); -vertex(210, 60); -vertex(160, 80); -vertex(200, 90); -vertex(140, 100); -vertex(130, 120); -endShape(); -fill(0); -ellipse(155, 60, 8, 8); - -// Right creature -fill(255); -beginShape(); -vertex(370, 120); -vertex(360, 90); -vertex(290, 80); -vertex(340, 70); -vertex(280, 50); -vertex(420, 10); -vertex(390, 50); -vertex(410, 90); -vertex(460, 120); -endShape(); -fill(0); -ellipse(345, 50, 10, 10); - - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_01/Ex_04_01.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_01/Ex_04_01.pde deleted file mode 100644 index 22ab9a5e3..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_01/Ex_04_01.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Example 04-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -int y = 60; -int d = 80; -ellipse(75, y, d, d); // Left -ellipse(175, y, d, d); // Middle -ellipse(275, y, d, d); // Right diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_02/Ex_04_02.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_02/Ex_04_02.pde deleted file mode 100644 index 01d3cb29a..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_02/Ex_04_02.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Example 04-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -int y = 100; -int d = 130; -ellipse(75, y, d, d); // Left -ellipse(175, y, d, d); // Middle -ellipse(275, y, d, d); // Right diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_03/Ex_04_03.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_03/Ex_04_03.pde deleted file mode 100644 index b7cdec584..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_03/Ex_04_03.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 04-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -line(0, 0, width, height); // Line from (0,0) to (480, 120) -line(width, 0, 0, height); // Line from (480, 0) to (0, 120) -ellipse(width/2, height/2, 60, 60); diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_04/Ex_04_04.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_04/Ex_04_04.pde deleted file mode 100644 index 294092ded..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_04/Ex_04_04.pde +++ /dev/null @@ -1,12 +0,0 @@ -// Example 04-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -int x = 25; -int h = 20; -int y = 25; -rect(x, y, 300, h); // Top -x = x + 100; -rect(x, y + h, 300, h); // Middle -x = x - 250; -rect(x, y + h*2, 300, h); // Bottom diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_05/Ex_04_05.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_05/Ex_04_05.pde deleted file mode 100644 index beddf453e..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_05/Ex_04_05.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 04-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(8); -line(20, 40, 80, 80); -line(80, 40, 140, 80); -line(140, 40, 200, 80); -line(200, 40, 260, 80); -line(260, 40, 320, 80); -line(320, 40, 380, 80); -line(380, 40, 440, 80); diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_06/Ex_04_06.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_06/Ex_04_06.pde deleted file mode 100644 index b7f5fa3f4..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_06/Ex_04_06.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Example 04-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(8); -for (int i = 20; i < 400; i += 60) { - line(i, 40, i + 60, 80); -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_07/Ex_04_07.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_07/Ex_04_07.pde deleted file mode 100644 index 6c641d898..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_07/Ex_04_07.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Example 04-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(2); -for (int i = 20; i < 400; i += 8) { - line(i, 40, i + 60, 80); -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_08/Ex_04_08.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_08/Ex_04_08.pde deleted file mode 100644 index 68092ced5..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_08/Ex_04_08.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Example 04-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(2); -for (int i = 20; i < 400; i += 20) { - line(i, 0, i + i/2, 80); -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_09/Ex_04_09.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_09/Ex_04_09.pde deleted file mode 100644 index 67493fd0d..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_09/Ex_04_09.pde +++ /dev/null @@ -1,11 +0,0 @@ -// Example 04-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -smooth(); -strokeWeight(2); -for (int i = 20; i < 400; i += 20) { - line(i, 0, i + i/2, 80); - line(i + i/2, 80, i*1.2, 120); -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_10/Ex_04_10.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_10/Ex_04_10.pde deleted file mode 100644 index 2b6f7cb4f..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_10/Ex_04_10.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 04-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -background(0); -smooth(); -noStroke(); -for (int y = 0; y <= height; y += 40) { - for (int x = 0; x <= width; x += 40) { - fill(255, 140); - ellipse(x, y, 40, 40); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_11/Ex_04_11.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_11/Ex_04_11.pde deleted file mode 100644 index 18bf46050..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_11/Ex_04_11.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 04-11 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -background(0); -smooth(); -noStroke(); -for (int y = 0; y < height+45; y += 40) { - fill(255, 140); - ellipse(0, y, 40, 40); -} -for (int x = 0; x < width+45; x += 40) { - fill(255, 140); - ellipse(x, 0, 40, 40); -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_12/Ex_04_12.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_12/Ex_04_12.pde deleted file mode 100644 index 565af4f4b..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_12/Ex_04_12.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 04-12 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -background(0); -smooth(); -fill(255); -stroke(102); -for (int y = 20; y <= height-20; y += 10) { - for (int x = 20; x <= width-20; x += 10) { - ellipse(x, y, 4, 4); - // Draw a line to the center of the display - line(x, y, 240, 60); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter04/Ex_04_13/Ex_04_13.pde b/java/examples/Books/Getting Started/Chapter04/Ex_04_13/Ex_04_13.pde deleted file mode 100644 index a57dd0f97..000000000 --- a/java/examples/Books/Getting Started/Chapter04/Ex_04_13/Ex_04_13.pde +++ /dev/null @@ -1,12 +0,0 @@ -// Example 04-13 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(480, 120); -background(0); -smooth(); -for (int y = 32; y <= height; y += 8) { - for (int x = 12; x <= width; x += 15) { - ellipse(x + y, y, 16 - y/10.0, 16 - y/10.0); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_01/Ex_05_01.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_01/Ex_05_01.pde deleted file mode 100644 index f1359dd0e..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_01/Ex_05_01.pde +++ /dev/null @@ -1,9 +0,0 @@ -// Example 05-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void draw() { - // Displays the frame count to the Console - println("I’m drawing"); - println(frameCount); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_02/Ex_05_02.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_02/Ex_05_02.pde deleted file mode 100644 index 4dd7dafbb..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_02/Ex_05_02.pde +++ /dev/null @@ -1,11 +0,0 @@ -// Example 05-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - println("I’m starting"); -} - -void draw() { - println("I’m running"); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_03/Ex_05_03.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_03/Ex_05_03.pde deleted file mode 100644 index 6151ad601..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_03/Ex_05_03.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 05-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int x = 280; -int y = -100; -int diameter = 380; - -void setup() { - size(480, 120); - smooth(); - fill(102); -} - -void draw() { - background(204); - ellipse(x, y, diameter, diameter); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_04/Ex_05_04.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_04/Ex_05_04.pde deleted file mode 100644 index f5752a2e0..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_04/Ex_05_04.pde +++ /dev/null @@ -1,15 +0,0 @@ -// Example 05-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - fill(0, 102); - smooth(); - noStroke(); -} - -void draw() { - ellipse(mouseX, mouseY, 9, 9); -} - - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_05/Ex_05_05.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_05/Ex_05_05.pde deleted file mode 100644 index fcd3daa4a..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_05/Ex_05_05.pde +++ /dev/null @@ -1,15 +0,0 @@ -// Example 05-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - fill(0, 102); - smooth(); - noStroke(); -} - -void draw() { - background(204); - ellipse(mouseX, mouseY, 9, 9); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_06/Ex_05_06.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_06/Ex_05_06.pde deleted file mode 100644 index 3346117bd..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_06/Ex_05_06.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 05-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - strokeWeight(4); - smooth(); - stroke(0, 102); -} - -void draw() { - line(mouseX, mouseY, pmouseX, pmouseY); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_07/Ex_05_07.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_07/Ex_05_07.pde deleted file mode 100644 index 5f0415957..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_07/Ex_05_07.pde +++ /dev/null @@ -1,15 +0,0 @@ -// Example 05-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); - stroke(0, 102); -} - -void draw() { - float weight = dist(mouseX, mouseY, pmouseX, pmouseY); - strokeWeight(weight); - line(mouseX, mouseY, pmouseX, pmouseY); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_08/Ex_05_08.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_08/Ex_05_08.pde deleted file mode 100644 index d32f682bb..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_08/Ex_05_08.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 05-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x; -float easing = 0.01; - -void setup() { - size(220, 120); - smooth(); -} - -void draw() { - float targetX = mouseX; - x += (targetX - x) * easing; - ellipse(x, 40, 12, 12); - println(targetX + " : " + x); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_09/Ex_05_09.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_09/Ex_05_09.pde deleted file mode 100644 index 0bca76b71..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_09/Ex_05_09.pde +++ /dev/null @@ -1,27 +0,0 @@ -// Example 05-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x; -float y; -float px; -float py; -float easing = 0.05; - -void setup() { - size(480, 120); - smooth(); - stroke(0, 102); -} - -void draw() { - float targetX = mouseX; - x += (targetX - x) * easing; - float targetY = mouseY; - y += (targetY - y) * easing; - float weight = dist(x, y, px, py); - strokeWeight(weight); - line(x, y, px, py); - py = y; - px = x; -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_10/Ex_05_10.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_10/Ex_05_10.pde deleted file mode 100644 index be0cf8ced..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_10/Ex_05_10.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 05-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - strokeWeight(12); - smooth(); -} - -void draw() { - background(204); - stroke(255); - line(120, 60, mouseX, mouseY); // White line - stroke(0); - float mx = mouseX/2 + 60; - line(120, 60, mx, mouseY); // Black line -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_11/Ex_05_11.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_11/Ex_05_11.pde deleted file mode 100644 index 0fb127237..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_11/Ex_05_11.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 05-11 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - strokeWeight(12); - smooth(); -} - -void draw() { - background(204); - stroke(255); - line(120, 60, mouseX, mouseY); // White line - stroke(0); - float mx = map(mouseX, 0, width, 60, 180); - line(120, 60, mx, mouseY); // Black line -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_12/Ex_05_12.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_12/Ex_05_12.pde deleted file mode 100644 index b69e2f422..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_12/Ex_05_12.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Example 05-12 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - smooth(); - strokeWeight(30); -} - -void draw() { - background(204); - stroke(102); - line(40, 0, 70, height); - if (mousePressed == true) { - stroke(0); - } - line(0, 70, width, 50); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_13/Ex_05_13.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_13/Ex_05_13.pde deleted file mode 100644 index a5f4cd85d..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_13/Ex_05_13.pde +++ /dev/null @@ -1,21 +0,0 @@ -// Example 05-13 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - smooth(); - strokeWeight(30); -} - -void draw() { - background(204); - stroke(102); - line(40, 0, 70, height); - if (mousePressed) { - stroke(0); - } else { - stroke(255); - } - line(0, 70, width, 50); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_14/Ex_05_14.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_14/Ex_05_14.pde deleted file mode 100644 index a75d0a93f..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_14/Ex_05_14.pde +++ /dev/null @@ -1,23 +0,0 @@ -// Example 05-14 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); - smooth(); - strokeWeight(30); -} - -void draw() { - background(204); - stroke(102); - line(40, 0, 70, height); - if (mousePressed) { - if (mouseButton == LEFT) { - stroke(255); - } else { - stroke(0); - } - line(0, 70, width, 50); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_15/Ex_05_15.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_15/Ex_05_15.pde deleted file mode 100644 index 78a1bdae0..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_15/Ex_05_15.pde +++ /dev/null @@ -1,28 +0,0 @@ -// Example 05-15 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x; -int offset = 10; - -void setup() { - size(240, 120); - smooth(); - x = width/2; -} - -void draw() { - background(204); - if (mouseX > x) { - x += 0.5; - offset = -10; - } - if (mouseX < x) { - x -= 0.5; - offset = 10; - } - line(x, 0, x, height); - line(mouseX, mouseY, mouseX + offset, mouseY - 10); - line(mouseX, mouseY, mouseX + offset, mouseY + 10); - line(mouseX, mouseY, mouseX + offset*3, mouseY); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_16/Ex_05_16.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_16/Ex_05_16.pde deleted file mode 100644 index 7092b86ab..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_16/Ex_05_16.pde +++ /dev/null @@ -1,25 +0,0 @@ -// Example 05-16 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int x = 120; -int y = 60; -int radius = 12; - -void setup() { - size(240, 120); - smooth(); - ellipseMode(RADIUS); -} - -void draw() { - background(204); - float d = dist(mouseX, mouseY, x, y); - if (d < radius) { - radius++; - fill(0); - } else { - fill(255); - } - ellipse(x, y, radius, radius); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_17/Ex_05_17.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_17/Ex_05_17.pde deleted file mode 100644 index cf3ebe452..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_17/Ex_05_17.pde +++ /dev/null @@ -1,24 +0,0 @@ -// Example 05-17 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int x = 80; -int y = 30; -int w = 80; -int h = 60; - -void setup() { - size(240, 120); -} - -void draw() { - background(204); - if ((mouseX > x) && (mouseX < x+w) && - (mouseY > y) && (mouseY < y+h)) { - fill(0); - } - else { - fill(255); - } - rect(x, y, w, h); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_18/Ex_05_18.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_18/Ex_05_18.pde deleted file mode 100644 index 1031bb201..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_18/Ex_05_18.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 05-18 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - smooth(); -} - -void draw() { - background(204); - line(20, 20, 220, 100); - if (keyPressed) { - line(220, 20, 20, 100); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_19/Ex_05_19.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_19/Ex_05_19.pde deleted file mode 100644 index 96bb0217d..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_19/Ex_05_19.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 05-19 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); - textSize(64); - textAlign(CENTER); -} - -void draw() { - background(0); - text(key, 60, 80); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_20/Ex_05_20.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_20/Ex_05_20.pde deleted file mode 100644 index df7a032eb..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_20/Ex_05_20.pde +++ /dev/null @@ -1,22 +0,0 @@ -// Example 05-20 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - background(204); - if (keyPressed) { - if ((key == 'h') || (key == 'H')) { - line(30, 60, 90, 60); - } - if ((key == 'n') || (key == 'N')) { - line(30, 20, 90, 100); - } - } - line(30, 20, 30, 100); - line(90, 20, 90, 100); -} - diff --git a/java/examples/Books/Getting Started/Chapter05/Ex_05_21/Ex_05_21.pde b/java/examples/Books/Getting Started/Chapter05/Ex_05_21/Ex_05_21.pde deleted file mode 100644 index b3e3afabe..000000000 --- a/java/examples/Books/Getting Started/Chapter05/Ex_05_21/Ex_05_21.pde +++ /dev/null @@ -1,21 +0,0 @@ -// Example 05-21 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int x = 215; - -void setup() { - size(480, 120); -} - -void draw() { - if (keyPressed && (key == CODED)) { // If it's a coded key - if (keyCode == LEFT) { // If it's the left arrow - x--; - } - else if (keyCode == RIGHT) { // If it's the right arrow - x++; - } - } - rect(x, 45, 50, 50); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_01/Ex_06_01.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_01/Ex_06_01.pde deleted file mode 100644 index 534292bd6..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_01/Ex_06_01.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 06-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PImage img; - -void setup() { - size(480, 120); - img = loadImage("lunar.jpg"); -} - -void draw() { - image(img, 0, 0); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_02/Ex_06_02.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_02/Ex_06_02.pde deleted file mode 100644 index 38ede3e47..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_02/Ex_06_02.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 06-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PImage img1; -PImage img2; - -void setup() { - size(480, 120); - img1 = loadImage("lunar.jpg"); - img2 = loadImage("capsule.jpg"); -} - -void draw() { - image(img1, -120, 0); - image(img1, 130, 0, 240, 120); - image(img2, 300, 0, 240, 120); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_03/Ex_06_03.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_03/Ex_06_03.pde deleted file mode 100644 index 11d0ce517..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_03/Ex_06_03.pde +++ /dev/null @@ -1,15 +0,0 @@ -// Example 06-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PImage img; - -void setup() { - size(480, 120); - img = loadImage("lunar.jpg"); -} - -void draw() { - background(0); - image(img, 0, 0, mouseX * 2, mouseY * 2); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_04/Ex_06_04.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_04/Ex_06_04.pde deleted file mode 100644 index a59ea353a..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_04/Ex_06_04.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 06-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PImage img; - -void setup() { - size(480, 120); - img = loadImage("clouds.gif"); -} - -void draw() { - background(255); - image(img, 0, 0); - image(img, 0, mouseY * -1); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_04/data/clouds.gif b/java/examples/Books/Getting Started/Chapter06/Ex_06_04/data/clouds.gif deleted file mode 100644 index ad52b85a1cc1f336f360b4d82742723411ea6380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138979 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 O`1qCtq+BdO68;BrT0@Nh diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_05/Ex_06_05.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_05/Ex_06_05.pde deleted file mode 100644 index 0b157b55d..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_05/Ex_06_05.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 06-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PImage img; - -void setup() { - size(480, 120); - img = loadImage("clouds.png"); -} - -void draw() { - background(204); - image(img, 0, 0); - image(img, 0, mouseY * -1); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_06/Ex_06_06.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_06/Ex_06_06.pde deleted file mode 100644 index 1831a30bd..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_06/Ex_06_06.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Example 06-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PFont font; - -void setup() { - size(480, 120); - smooth(); - font = loadFont("AndaleMono-36.vlw"); - textFont(font); -} - -void draw() { - background(102); - textSize(36); - text("That’s one small step for man...", 25, 60); - textSize(18); - text("That’s one small step for man...", 27, 90); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_06/data/AndaleMono-36.vlw b/java/examples/Books/Getting Started/Chapter06/Ex_06_06/data/AndaleMono-36.vlw deleted file mode 100644 index 34e243f0bd4b89a0838b9eca8ac21760e264d702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128059 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 D5eNwF diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_07/Ex_06_07.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_07/Ex_06_07.pde deleted file mode 100644 index b96eff645..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_07/Ex_06_07.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 06-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PFont font; - -void setup() { - size(480, 120); - font = loadFont("AndaleMono-24.vlw"); - textFont(font); -} - -void draw() { - background(102); - text("That’s one small step for man...", 26, 30, 240, 100); -} - - - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_07/data/AndaleMono-24.vlw b/java/examples/Books/Getting Started/Chapter06/Ex_06_07/data/AndaleMono-24.vlw deleted file mode 100644 index a71ac78ac465bb3427f5cc4d63a9cf79b99c27a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66629 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_10/Ex_06_10.pde b/java/examples/Books/Getting Started/Chapter06/Ex_06_10/Ex_06_10.pde deleted file mode 100644 index 417acc3c8..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_10/Ex_06_10.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 06-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -PShape network; - -void setup() { - size(240, 120); - smooth(); - shapeMode(CENTER); - network = loadShape("network.svg"); -} - -void draw() { - background(0); - float diameter = map(mouseX, 0, width, 10, 800); - shape(network, 120, 60, diameter, diameter); -} - diff --git a/java/examples/Books/Getting Started/Chapter06/Ex_06_10/data/network.svg b/java/examples/Books/Getting Started/Chapter06/Ex_06_10/data/network.svg deleted file mode 100644 index 5ecd8d159..000000000 --- a/java/examples/Books/Getting Started/Chapter06/Ex_06_10/data/network.svg +++ /dev/null @@ -1,4056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_01/Ex_07_01.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_01/Ex_07_01.pde deleted file mode 100644 index 3db017b73..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_01/Ex_07_01.pde +++ /dev/null @@ -1,7 +0,0 @@ -// Example 07-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void draw() { - println(frameRate); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_02/Ex_07_02.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_02/Ex_07_02.pde deleted file mode 100644 index 615aaf154..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_02/Ex_07_02.pde +++ /dev/null @@ -1,15 +0,0 @@ -// Example 07-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - frameRate(30); // Thirty frames each second - //frameRate(12); // Twelve frames each second - //frameRate(2); // Two frames each second - //frameRate(0.5); // One frame every two seconds -} - -void draw() { - println(frameRate); -} - - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_03/Ex_07_03.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_03/Ex_07_03.pde deleted file mode 100644 index aafb141cc..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_03/Ex_07_03.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Example 07-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int radius = 40; -float x = -radius; -float speed = 0.5; - -void setup() { - size(240, 120); - smooth(); - ellipseMode(RADIUS); -} - -void draw() { - background(0); - x += speed; // Increase the value of x - arc(x, 60, radius, radius, 0.52, 5.76); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_04/Ex_07_04.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_04/Ex_07_04.pde deleted file mode 100644 index b3c37bad9..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_04/Ex_07_04.pde +++ /dev/null @@ -1,22 +0,0 @@ -// Example 07-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int radius = 40; -float x = -radius; -float speed = 0.5; - -void setup() { - size(240, 120); - smooth(); - ellipseMode(RADIUS); -} - -void draw() { - background(0); - x += speed; // Increase the value of x - if (x > width+radius) { // If the shape is off screen - x = -radius; // move to the left edge - } - arc(x, 60, radius, radius, 0.52, 5.76); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_05/Ex_07_05.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_05/Ex_07_05.pde deleted file mode 100644 index 99ac8e396..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_05/Ex_07_05.pde +++ /dev/null @@ -1,27 +0,0 @@ -// Example 07-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int radius = 40; -float x = 110; -float speed = 0.5; -int direction = 1; - -void setup() { - size(240, 120); - smooth(); - ellipseMode(RADIUS); -} - -void draw() { - background(0); - x += speed * direction; - if ((x > width-radius) || (x < radius)) { - direction = -direction; // Flip direction - } - if (direction == 1) { - arc(x, 60, radius, radius, 0.52, 5.76); // Face right - } else { - arc(x, 60, radius, radius, 3.67, 8.9); // Face left - } -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_06/Ex_07_06.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_06/Ex_07_06.pde deleted file mode 100644 index c318a2fe2..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_06/Ex_07_06.pde +++ /dev/null @@ -1,27 +0,0 @@ -// Example 07-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int startX = 20; // Initial x-coordinate -int stopX = 160; // Final x-coordinate -int startY = 30; // Initial y-coordinate -int stopY = 80; // Final y-coordinate -float x = startX; // Current x-coordinate -float y = startY; // Current y-coordinate -float step = 0.005; // Size of each step (0.0 to 1.0) -float pct = 0.0; // Percentage traveled (0.0 to 1.0) - -void setup() { - size(240, 120); - smooth(); -} - -void draw() { - background(0); - if (pct < 1.0) { - x = startX + ((stopX-startX) * pct); - y = startY + ((stopY-startY) * pct); - pct += step; - } - ellipse(x, y, 20, 20); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_07/Ex_07_07.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_07/Ex_07_07.pde deleted file mode 100644 index 045de5dbc..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_07/Ex_07_07.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 07-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void draw() { - float r = random(0, mouseX); - println(r); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_08/Ex_07_08.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_08/Ex_07_08.pde deleted file mode 100644 index f2d1b0ee1..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_08/Ex_07_08.pde +++ /dev/null @@ -1,18 +0,0 @@ -// Example 07-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(240, 120); - smooth(); -} - -void draw() { - background(204); - for (int x = 20; x < width; x += 20) { - float mx = mouseX / 10; - float offsetA = random(-mx, mx); - float offsetB = random(-mx, mx); - line(x + offsetA, 20, x - offsetB, 100); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_09/Ex_07_09.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_09/Ex_07_09.pde deleted file mode 100644 index 55f18fbab..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_09/Ex_07_09.pde +++ /dev/null @@ -1,21 +0,0 @@ -// Example 07-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float speed = 2.5; -int diameter = 20; -float x; -float y; - -void setup() { - size(240, 120); - smooth(); - x = width/2; - y = height/2; -} - -void draw() { - x += random(-speed, speed); - y += random(-speed, speed); - ellipse(x, y, diameter, diameter); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_10/Ex_07_10.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_10/Ex_07_10.pde deleted file mode 100644 index cec7c2012..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_10/Ex_07_10.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Example 07-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void draw() { - int timer = millis(); - println(timer); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_11/Ex_07_11.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_11/Ex_07_11.pde deleted file mode 100644 index 95ac8b2ab..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_11/Ex_07_11.pde +++ /dev/null @@ -1,23 +0,0 @@ -// Example 07-11 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int time1 = 2000; -int time2 = 4000; -float x = 0; - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - int currentTime = millis(); - background(204); - if (currentTime > time2) { - x -= 0.5; - } else if (currentTime > time1) { - x += 2; - } - ellipse(x, 60, 90, 90); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_12/Ex_07_12.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_12/Ex_07_12.pde deleted file mode 100644 index 21c2f7701..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_12/Ex_07_12.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Example 07-12 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; - -void draw() { - float sinval = sin(angle); - println(sinval); - float gray = map(sinval, -1, 1, 0, 255); - background(gray); - angle += 0.1; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_13/Ex_07_13.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_13/Ex_07_13.pde deleted file mode 100644 index b6beee4f4..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_13/Ex_07_13.pde +++ /dev/null @@ -1,24 +0,0 @@ -// Example 07-13 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; -float offset = 60; -float scalar = 40; -float speed = 0.05; - -void setup() { - size(240, 120); - smooth(); -} - -void draw() { - background(0); - float y1 = offset + sin(angle) * scalar; - float y2 = offset + sin(angle + 0.4) * scalar; - float y3 = offset + sin(angle + 0.8) * scalar; - ellipse( 80, y1, 40, 40); - ellipse(120, y2, 40, 40); - ellipse(160, y3, 40, 40); - angle += speed; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_14/Ex_07_14.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_14/Ex_07_14.pde deleted file mode 100644 index 55bf6952d..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_14/Ex_07_14.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Example 07-14 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; -float offset = 60; -float scalar = 30; -float speed = 0.05; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - float x = offset + cos(angle) * scalar; - float y = offset + sin(angle) * scalar; - ellipse( x, y, 40, 40); - angle += speed; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_15/Ex_07_15.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_15/Ex_07_15.pde deleted file mode 100644 index 85a550f76..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_15/Ex_07_15.pde +++ /dev/null @@ -1,22 +0,0 @@ -// Example 07-15 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; -float offset = 60; -float scalar = 2; -float speed = 0.05; - -void setup() { - size(120, 120); - fill(0); - smooth(); -} - -void draw() { - float x = offset + cos(angle) * scalar; - float y = offset + sin(angle) * scalar; - ellipse( x, y, 2, 2); - angle += speed; - scalar += speed; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_16/Ex_07_16.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_16/Ex_07_16.pde deleted file mode 100644 index 981566038..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_16/Ex_07_16.pde +++ /dev/null @@ -1,12 +0,0 @@ -// Example 07-16 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); -} - -void draw() { - translate(mouseX, mouseY); - rect(0, 0, 30, 30); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_17/Ex_07_17.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_17/Ex_07_17.pde deleted file mode 100644 index c25f2919c..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_17/Ex_07_17.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 07-17 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); -} - -void draw() { - translate(mouseX, mouseY); - rect(0, 0, 30, 30); - translate(35, 10); - rect(0, 0, 15, 15); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_18/Ex_07_18.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_18/Ex_07_18.pde deleted file mode 100644 index 62530d982..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_18/Ex_07_18.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 07-18 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(120, 120); -} - -void draw() { - pushMatrix(); - translate(mouseX, mouseY); - rect(0, 0, 30, 30); - popMatrix(); - translate(35, 10); - rect(0, 0, 15, 15); -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_19/Ex_07_19.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_19/Ex_07_19.pde deleted file mode 100644 index 3b8f61554..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_19/Ex_07_19.pde +++ /dev/null @@ -1,17 +0,0 @@ -// Example 07-19 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - translate(mouseX, mouseY); - rotate(angle); - rect(-15, -15, 30, 30); - angle += 0.1; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_20/Ex_07_20.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_20/Ex_07_20.pde deleted file mode 100644 index 599b07389..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_20/Ex_07_20.pde +++ /dev/null @@ -1,17 +0,0 @@ -// Example 07-20 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - rotate(angle); - translate(mouseX, mouseY); - rect(-15, -15, 30, 30); - angle += 0.1; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_21/Ex_07_21.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_21/Ex_07_21.pde deleted file mode 100644 index 323ed422d..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_21/Ex_07_21.pde +++ /dev/null @@ -1,17 +0,0 @@ -// Example 07-21 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - translate(mouseX, mouseY); - scale(sin(angle) + 2); - rect(-15, -15, 30, 30); - angle += 0.1; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_22/Ex_07_22.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_22/Ex_07_22.pde deleted file mode 100644 index 4eaf3f2b3..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_22/Ex_07_22.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Example 07-22 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - translate(mouseX, mouseY); - float scalar = sin(angle) + 2; - scale(scalar); - strokeWeight(1.0 / scalar); - rect(-15, -15, 30, 30); - angle += 0.1; -} - diff --git a/java/examples/Books/Getting Started/Chapter07/Ex_07_23/Ex_07_23.pde b/java/examples/Books/Getting Started/Chapter07/Ex_07_23/Ex_07_23.pde deleted file mode 100644 index 0c42b9fbc..000000000 --- a/java/examples/Books/Getting Started/Chapter07/Ex_07_23/Ex_07_23.pde +++ /dev/null @@ -1,33 +0,0 @@ -// Example 07-23 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float angle = 0.0; -float angleDirection = 1; -float speed = 0.005; - -void setup() { - size(120, 120); - smooth(); -} - -void draw() { - background(204); - translate(20, 25); // Move to start position - rotate(angle); - strokeWeight(12); - line(0, 0, 40, 0); - translate(40, 0); // Move to next joint - rotate(angle * 2.0); - strokeWeight(6); - line(0, 0, 30, 0); - translate(30, 0); // Move the next joint - rotate(angle * 2.5); - strokeWeight(3); - line(0, 0, 20, 0); - - angle += speed * angleDirection; - if ((angle > QUARTER_PI) || (angle < 0)) { - angleDirection *= -1; - } -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_01/Ex_08_01.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_01/Ex_08_01.pde deleted file mode 100644 index 4ca134af5..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_01/Ex_08_01.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Example 08-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - println("Ready to roll!"); - rollDice(20); - rollDice(20); - rollDice(6); - println("Finished."); -} - -void rollDice(int numSides) { - int d = 1 + int(random(numSides)); - println("Rolling... " + d); -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_02/Ex_08_02.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_02/Ex_08_02.pde deleted file mode 100644 index a4516b752..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_02/Ex_08_02.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 08-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - println("Ready to roll!"); - int d1 = 1 + int(random(20)); - println("Rolling... " + d1); - int d2 = 1 + int(random(20)); - println("Rolling... " + d2); - int d3 = 1 + int(random(6)); - println("Rolling... " + d3); - println("Finished."); -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_03/Ex_08_03.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_03/Ex_08_03.pde deleted file mode 100644 index 9f17ec89f..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_03/Ex_08_03.pde +++ /dev/null @@ -1,25 +0,0 @@ -// Example 08-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - background(204); - translate(110, 110); - stroke(0); - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(0); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_04/Ex_08_04.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_04/Ex_08_04.pde deleted file mode 100644 index 2a9eba4a0..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_04/Ex_08_04.pde +++ /dev/null @@ -1,42 +0,0 @@ -// Example 08-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - background(204); - - // Left owl - translate(110, 110); - stroke(0); - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(0); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak - - // Right owl - translate(70, 0); - stroke(0); - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(0); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_05/Ex_08_05.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_05/Ex_08_05.pde deleted file mode 100644 index b477a30d5..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_05/Ex_08_05.pde +++ /dev/null @@ -1,32 +0,0 @@ -// Example 08-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - background(204); - owl(110, 110); - owl(180, 110); -} - -void owl(int x, int y) { - pushMatrix(); - translate(x, y); - stroke(0); - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(0); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak - popMatrix(); -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_06/Ex_08_06.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_06/Ex_08_06.pde deleted file mode 100644 index df886744c..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_06/Ex_08_06.pde +++ /dev/null @@ -1,33 +0,0 @@ -// Example 08-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - background(204); - for (int x = 35; x < width + 70; x += 70) { - owl(x, 110); - } -} - -void owl(int x, int y) { - pushMatrix(); - translate(x, y); - stroke(0); - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(0); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak - popMatrix(); -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_07/Ex_08_07.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_07/Ex_08_07.pde deleted file mode 100644 index 51f496c9b..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_07/Ex_08_07.pde +++ /dev/null @@ -1,37 +0,0 @@ -// Example 08-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - size(480, 120); - smooth(); -} - -void draw() { - background(204); - randomSeed(0); - for (int i = 35; i < width + 40; i += 40) { - int gray = int(random(0, 102)); - float scalar = random(0.25, 1.0); - owl(i, 110, gray, scalar); - } -} - -void owl(int x, int y, int g, float s) { - pushMatrix(); - translate(x, y); - scale(s); // Set the size - stroke(g); // Set the gray value - strokeWeight(70); - line(0, -35, 0, -65); // Body - noStroke(); - fill(255-g); - ellipse(-17.5, -65, 35, 35); // Left eye dome - ellipse(17.5, -65, 35, 35); // Right eye dome - arc(0, -65, 70, 70, 0, PI); // Chin - fill(g); - ellipse(-14, -65, 8, 8); // Left eye - ellipse(14, -65, 8, 8); // Right eye - quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak - popMatrix(); -} - diff --git a/java/examples/Books/Getting Started/Chapter08/Ex_08_08/Ex_08_08.pde b/java/examples/Books/Getting Started/Chapter08/Ex_08_08/Ex_08_08.pde deleted file mode 100644 index 04450188b..000000000 --- a/java/examples/Books/Getting Started/Chapter08/Ex_08_08/Ex_08_08.pde +++ /dev/null @@ -1,14 +0,0 @@ -// Example 08-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -void setup() { - float yourWeight = 132; - float marsWeight = calculateMars(yourWeight); - println(marsWeight); -} - -float calculateMars(float w) { - float newWeight = w * 0.38; - return newWeight; -} - diff --git a/java/examples/Books/Getting Started/Chapter09/Ex_09_01/Ex_09_01.pde b/java/examples/Books/Getting Started/Chapter09/Ex_09_01/Ex_09_01.pde deleted file mode 100644 index 3ba66c8a6..000000000 --- a/java/examples/Books/Getting Started/Chapter09/Ex_09_01/Ex_09_01.pde +++ /dev/null @@ -1,40 +0,0 @@ -// Example 09-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -JitterBug bug; // Declare object - -void setup() { - size(480, 120); - smooth(); - // Create object and pass in parameters - bug = new JitterBug(width/2, height/2, 20); -} - -void draw() { - bug.move(); - bug.display(); -} - -class JitterBug { - float x; - float y; - int diameter; - float speed = 2.5; - - JitterBug(float tempX, float tempY, int tempDiameter) { - x = tempX; - y = tempY; - diameter = tempDiameter; - } - - void move() { - x += random(-speed, speed); - y += random(-speed, speed); - } - - void display() { - ellipse(x, y, diameter, diameter); - } -} - - diff --git a/java/examples/Books/Getting Started/Chapter09/Ex_09_02/Ex_09_02.pde b/java/examples/Books/Getting Started/Chapter09/Ex_09_02/Ex_09_02.pde deleted file mode 100644 index 3b229def1..000000000 --- a/java/examples/Books/Getting Started/Chapter09/Ex_09_02/Ex_09_02.pde +++ /dev/null @@ -1,45 +0,0 @@ -// Example 09-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -JitterBug jit; -JitterBug bug; - -void setup() { - size(480, 120); - smooth(); - jit = new JitterBug(width * 0.33, height/2, 50); - bug = new JitterBug(width * 0.66, height/2, 10); -} - -void draw() { - jit.move(); - jit.display(); - bug.move(); - bug.display(); -} - -class JitterBug { - - float x; - float y; - int diameter; - float speed = 2.5; - - JitterBug(float tempX, float tempY, int tempDiameter) { - x = tempX; - y = tempY; - diameter = tempDiameter; - } - - void move() { - x += random(-speed, speed); - y += random(-speed, speed); - } - - void display() { - ellipse(x, y, diameter, diameter); - } -} - - - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_01/Ex_10_01.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_01/Ex_10_01.pde deleted file mode 100644 index e2936c92e..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_01/Ex_10_01.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Example 10-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x1 = -20; -float x2 = 20; - -void setup() { - size(240, 120); - smooth(); - noStroke(); -} - -void draw() { - background(0); - x1 += 0.5; - x2 += 0.5; - arc(x1, 30, 40, 40, 0.52, 5.76); - arc(x2, 90, 40, 40, 0.52, 5.76); -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_02/Ex_10_02.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_02/Ex_10_02.pde deleted file mode 100644 index ae04cde1c..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_02/Ex_10_02.pde +++ /dev/null @@ -1,29 +0,0 @@ -// Example 10-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x1 = -10; -float x2 = 10; -float x3 = 35; -float x4 = 18; -float x5 = 30; - -void setup() { - size(240, 120); - smooth(); - noStroke(); -} - -void draw() { - background(0); - x1 += 0.5; - x2 += 0.5; - x3 += 0.5; - x4 += 0.5; - x5 += 0.5; - arc(x1, 20, 20, 20, 0.52, 5.76); - arc(x2, 40, 20, 20, 0.52, 5.76); - arc(x3, 60, 20, 20, 0.52, 5.76); - arc(x4, 80, 20, 20, 0.52, 5.76); - arc(x5, 100, 20, 20, 0.52, 5.76); -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_03/Ex_10_03.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_03/Ex_10_03.pde deleted file mode 100644 index 7902c2895..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_03/Ex_10_03.pde +++ /dev/null @@ -1,24 +0,0 @@ -// Example 10-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float[] x = new float[3000]; - -void setup() { - size(240, 120); - smooth(); - noStroke(); - fill(255, 200); - for (int i = 0; i < x.length; i++) { - x[i] = random(-1000, 200); - } -} - -void draw() { - background(0); - for (int i = 0; i < x.length; i++) { - x[i] += 0.5; - float y = i * 0.4; - arc(x[i], y, 12, 12, 0.52, 5.76); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_04/Ex_10_04.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_04/Ex_10_04.pde deleted file mode 100644 index 3b6830679..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_04/Ex_10_04.pde +++ /dev/null @@ -1,12 +0,0 @@ -// Example 10-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int[] x; // Declare the array - -void setup() { - size(200, 200); - x = new int[2]; // Create the array - x[0] = 12; // Assign the first value - x[1] = 2; // Assign the second value -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_05/Ex_10_05.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_05/Ex_10_05.pde deleted file mode 100644 index 53408bc04..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_05/Ex_10_05.pde +++ /dev/null @@ -1,11 +0,0 @@ -// Example 10-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int[] x = new int[2]; // Declare and create the array - -void setup() { - size(200, 200); - x[0] = 12; // Assign the first value - x[1] = 2; // Assign the second value -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_06/Ex_10_06.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_06/Ex_10_06.pde deleted file mode 100644 index a3b551a7a..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_06/Ex_10_06.pde +++ /dev/null @@ -1,9 +0,0 @@ -// Example 10-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int[] x = { 12, 2 }; // Declare, create, and assign - -void setup() { - size(200, 200); -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_07/Ex_10_07.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_07/Ex_10_07.pde deleted file mode 100644 index 581c46a2c..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_07/Ex_10_07.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Example 10-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float[] x = {-20, 20}; - -void setup() { - size(240, 120); - smooth(); - noStroke(); -} - -void draw() { - background(0); - x[0] += 0.5; // Increase the first element - x[1] += 0.5; // Increase the second element - arc(x[0], 30, 40, 40, 0.52, 5.76); - arc(x[1], 90, 40, 40, 0.52, 5.76); -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_08/Ex_10_08.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_08/Ex_10_08.pde deleted file mode 100644 index a1738f00e..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_08/Ex_10_08.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Example 10-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float[] gray; - -void setup() { - size(240, 120); - gray = new float[width]; - for (int i = 0; i < gray.length; i++) { - gray[i] = random(0, 255); - } -} - -void draw() { - for (int i = 0; i < gray.length; i++) { - stroke(gray[i]); - line(i, 0, i, height); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_09/Ex_10_09.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_09/Ex_10_09.pde deleted file mode 100644 index 74246b2b2..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_09/Ex_10_09.pde +++ /dev/null @@ -1,28 +0,0 @@ -// Example 10-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int num = 60; -int[] x = new int[num]; -int[] y = new int[num]; - -void setup() { - size(240, 120); - smooth(); - noStroke(); -} - -void draw() { - background(0); - // Copy array values from back to front - for (int i = x.length-1; i > 0; i--) { - x[i] = x[i-1]; - y[i] = y[i-1]; - } - x[0] = mouseX; // Set the first element - y[0] = mouseY; // Set the first element - for (int i = 0; i < x.length; i++) { - fill(i * 4); - ellipse(x[i], y[i], 40, 40); - } -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_10/Ex_10_10.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_10/Ex_10_10.pde deleted file mode 100644 index 6e1734e20..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_10/Ex_10_10.pde +++ /dev/null @@ -1,47 +0,0 @@ -// Example 10-10 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -JitterBug[] bugs = new JitterBug[33]; - -void setup() { - size(240, 120); - smooth(); - for (int i = 0; i < bugs.length; i++) { - float x = random(width); - float y = random(height); - int r = i + 2; - bugs[i] = new JitterBug(x, y, r); - } -} - -void draw() { - for (int i = 0; i < bugs.length; i++) { - bugs[i].move(); - bugs[i].display(); - } -} - -class JitterBug { - - float x; - float y; - int diameter; - float speed = 2.5; - - JitterBug(float tempX, float tempY, int tempDiameter) { - x = tempX; - y = tempY; - diameter = tempDiameter; - } - - void move() { - x += random(-speed, speed); - y += random(-speed, speed); - } - - void display() { - ellipse(x, y, diameter, diameter); - } - -} - diff --git a/java/examples/Books/Getting Started/Chapter10/Ex_10_11/Ex_10_11.pde b/java/examples/Books/Getting Started/Chapter10/Ex_10_11/Ex_10_11.pde deleted file mode 100644 index 8bac9402a..000000000 --- a/java/examples/Books/Getting Started/Chapter10/Ex_10_11/Ex_10_11.pde +++ /dev/null @@ -1,24 +0,0 @@ -// Example 10-11 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int numFrames = 12; // The number of frames -PImage[] images = new PImage[numFrames]; // Make the array -int currentFrame = 1; - -void setup() { - size(240, 120); - for (int i = 1; i < images.length; i++) { - String imageName = "frame-" + nf(i, 4) + ".png"; - images[i] = loadImage(imageName); // Load each image - } - frameRate(24); -} - -void draw() { - image(images[currentFrame], 0, 0); - currentFrame++; // Next frame - if (currentFrame >= images.length) { - currentFrame = 1; // Return to first frame - } -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_01/Ex_11_01.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_01/Ex_11_01.pde deleted file mode 100644 index 189a80672..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_01/Ex_11_01.pde +++ /dev/null @@ -1,29 +0,0 @@ -// Example 11-01 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.opengl.*; - -void setup() { - size(440, 220, OPENGL); - noStroke(); - fill(255, 190); -} - -void draw() { - background(0); - translate(width/2, height/2, 0); - rotateX(mouseX / 200.0); - rotateY(mouseY / 100.0); - int dim = 18; - for (int i = -height/2; i < height/2; i += dim*1.2) { - for (int j = -height/2; j < height/2; j += dim*1.2) { - beginShape(); - vertex(i, j, 0); - vertex(i+dim, j, 0); - vertex(i+dim, j+dim, -dim); - vertex(i, j+dim, -dim); - endShape(); - } - } -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_02/Ex_11_02.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_02/Ex_11_02.pde deleted file mode 100644 index a0585cb85..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_02/Ex_11_02.pde +++ /dev/null @@ -1,36 +0,0 @@ -// Example 11-02 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.opengl.*; - -void setup() { - size(420, 220, OPENGL); - noStroke(); - fill(255); -} - -void draw() { - lights(); - //ambientLight(102, 102, 102); - //directionalLight(255, 255, 255, // Color - // -1, 0, 0); // Direction XYZ - //pointLight(255, 255, 255, // Color - // mouseX, 110, 50); // Position - //spotLight(255, 255, 255, // Color - // mouseX, 0, 200, // Position - // 0, 0, -1, // Direction XYZ - // PI, 2); // Concentration - rotateY(PI/24); - background(0); - translate(width/2, height/2, -20); - int dim = 18; - for (int i = -height/2; i < height/2; i += dim*1.4) { - for (int j = -height/2; j < height/2; j += dim*1.4) { - pushMatrix(); - translate(i, j, -j); - box(dim, dim, dim); - popMatrix(); - } - } -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_03/Ex_11_03.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_03/Ex_11_03.pde deleted file mode 100644 index 7c0c0871d..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_03/Ex_11_03.pde +++ /dev/null @@ -1,29 +0,0 @@ -// Example 11-03 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.opengl.*; - -void setup() { - size(420, 220, OPENGL); - noStroke(); -} - -void draw() { - lights(); - background(0); - float camZ = (height/2.0) / tan(PI*60.0 / 360.0); - camera(mouseX, mouseY, camZ, // Camera location - width/2.0, height/2.0, 0, // Camera target - 0, 1, 0); // Camera orientation - translate(width/2, height/2, -20); - int dim = 18; - for (int i = -height/2; i < height/2; i += dim*1.4) { - for (int j = -height/2; j < height/2; j += dim*1.4) { - pushMatrix(); - translate(i, j, -j); - box(dim, dim, dim); - popMatrix(); - } - } -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_04/Ex_11_04.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_04/Ex_11_04.pde deleted file mode 100644 index fa63b0dd5..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_04/Ex_11_04.pde +++ /dev/null @@ -1,27 +0,0 @@ -// Example 11-04 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x = 0; - -void setup() { - size(720, 480); - smooth(); - noFill(); - strokeCap(SQUARE); - frameRate(30); -} - -void draw() { - background(204); - translate(x, 0); - for (int y = 40; y < 280; y += 20) { - line(-260, y, 0, y + 200); - line(0, y + 200, 260, y); - } - if (frameCount < 60) { - saveFrame("frames/SaveExample-####.tif"); - } else { - exit(); - } - x += 2.5; -} diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_05/Ex_11_05.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_05/Ex_11_05.pde deleted file mode 100644 index 104c28c73..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_05/Ex_11_05.pde +++ /dev/null @@ -1,25 +0,0 @@ -// Example 11-05 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.pdf.*; - -void setup() { - size(600, 800, PDF, "Ex-11-5.pdf"); - noFill(); - strokeCap(SQUARE); -} - -void draw() { - background(255); - for (int y = 100; y < height - 300; y+=20) { - float r = random(0, 102); - strokeWeight(r / 10); - beginShape(); - vertex(100, y); - vertex(width/2, y + 200); - vertex(width-100, y); - endShape(); - } - exit(); -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_06/Ex_11_06.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_06/Ex_11_06.pde deleted file mode 100644 index 70db3c766..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_06/Ex_11_06.pde +++ /dev/null @@ -1,17 +0,0 @@ -// Example 11-06 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -// Note: This is code for an Arduino board, not Processing - -int sensorPin = 0; // Select input pin -int val = 0; - -void setup() { - Serial.begin(9600); // Open serial port -} - -void loop() { - val = analogRead(sensorPin) / 4; // Read value from sensor - Serial.print(val, BYTE); // Print variable to serial port - delay(100); // Wait 100 milliseconds -} diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_07/Ex_11_07.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_07/Ex_11_07.pde deleted file mode 100644 index 8965855a7..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_07/Ex_11_07.pde +++ /dev/null @@ -1,30 +0,0 @@ -// Example 11-07 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.serial.*; - -Serial port; // Create object from Serial class -float val; // Data received from the serial port - -void setup() { - size(440, 220); - // IMPORTANT NOTE: - // The first serial port retrieved by Serial.list() - // should be your Arduino. If not, uncomment the next - // line by deleting the // before it. Run the sketch - // again to see a list of serial ports. Then, change - // the 0 in between [ and ] to the number of the port - // that your Arduino is connected to. - //println(Serial.list()); - String arduinoPort = Serial.list()[0]; - port = new Serial(this, arduinoPort, 9600); -} - -void draw() { - if (port.available() > 0) { // If data is available, - val = port.read(); // read it and store it in val - val = map(val, 0, 255, 0, height); // Convert the value - } - rect(40, val-10, 360, 20); -} - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_08/Ex_11_08.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_08/Ex_11_08.pde deleted file mode 100644 index 444e8c692..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_08/Ex_11_08.pde +++ /dev/null @@ -1,44 +0,0 @@ -// Example 11-08 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.serial.*; - -Serial port; // Create object from Serial class -float val; // Data received from the serial port -int x; -float easing = 0.05; -float easedVal; - -void setup() { - size(440, 440); - frameRate(30); - smooth(); - String arduinoPort = Serial.list()[0]; - port = new Serial(this, arduinoPort, 9600); - background(0); -} - -void draw() { - if ( port.available() > 0) { // If data is available, - val = port.read(); // read it and store it in val - val = map(val, 0, 255, 0, height); // Convert the values - } - - float targetVal = val; - easedVal += (targetVal - easedVal) * easing; - - stroke(0); - line(x, 0, x, height); // Black line - stroke(255); - line(x+1, 0, x+1, height); // White line - line(x, 220, x, val); // Raw value - line(x, 440, x, easedVal + 220); // Averaged value - - x++; - if (x > width) { - x = 0; - } -} - - - diff --git a/java/examples/Books/Getting Started/Chapter11/Ex_11_09/Ex_11_09.pde b/java/examples/Books/Getting Started/Chapter11/Ex_11_09/Ex_11_09.pde deleted file mode 100644 index ed28e4622..000000000 --- a/java/examples/Books/Getting Started/Chapter11/Ex_11_09/Ex_11_09.pde +++ /dev/null @@ -1,41 +0,0 @@ -// Example 11-09 from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -import processing.serial.*; - -Serial port; // Create object from Serial class -float val; // Data received from the serial port -float angle; -float radius; - -void setup() { - size(440, 440); - frameRate(30); - strokeWeight(2); - smooth(); - String arduinoPort = Serial.list()[0]; - port = new Serial(this, arduinoPort, 9600); - background(0); -} - -void draw() { - if ( port.available() > 0) { // If data is available, - val = port.read(); // read it and store it in val - // Convert the values to set the radius - radius = map(val, 0, 255, 0, height * 0.45); - } - - int middleX = width/2; - int middleY = height/2; - float x = middleX + cos(angle) * height/2; - float y = middleY + sin(angle) * height/2; - stroke(0); - line(middleX, middleY, x, y); - - x = middleX + cos(angle) * radius; - y = middleY + sin(angle) * radius; - stroke(255); - line(middleX, middleY, x, y); - - angle += 0.01; -} diff --git a/java/examples/Books/Getting Started/Robots/Robot1_Draw/Robot1_Draw.pde b/java/examples/Books/Getting Started/Robots/Robot1_Draw/Robot1_Draw.pde deleted file mode 100644 index 60b197205..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot1_Draw/Robot1_Draw.pde +++ /dev/null @@ -1,41 +0,0 @@ -// Robot 1: Draw from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -size(720, 480); -smooth(); -strokeWeight(2); -background(204); -ellipseMode(RADIUS); - -// Neck -stroke(102); // Set stroke to gray -line(266, 257, 266, 162); // Left -line(276, 257, 276, 162); // Middle -line(286, 257, 286, 162); // Right - -// Antennae -line(276, 155, 246, 112); // Small -line(276, 155, 306, 56); // Tall -line(276, 155, 342, 170); // Medium - -// Body -noStroke(); // Disable stroke -fill(102); // Set fill to gray -ellipse(264, 377, 33, 33); // Antigravity orb -fill(0); // Set fill to black -rect(219, 257, 90, 120); // Main body -fill(102); // Set fill to gray -rect(219, 274, 90, 6); // Gray stripe - -// Head -fill(0); // Set fill to black -ellipse(276, 155, 45, 45); // Head -fill(255); // Set fill to white -ellipse(288, 150, 14, 14); // Large eye -fill(0); // Set fill to black -ellipse(288, 150, 3, 3); // Pupil -fill(153); // Set fill to light gray -ellipse(263, 148, 5, 5); // Small eye 1 -ellipse(296, 130, 4, 4); // Small eye 2 -ellipse(305, 162, 3, 3); // Small eye 3 - diff --git a/java/examples/Books/Getting Started/Robots/Robot2_Variables/Robot2_Variables.pde b/java/examples/Books/Getting Started/Robots/Robot2_Variables/Robot2_Variables.pde deleted file mode 100644 index a20816e2c..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot2_Variables/Robot2_Variables.pde +++ /dev/null @@ -1,54 +0,0 @@ -// Robot 2: Variables from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -int x = 60; // X-coordinate -int y = 420; // Y-coordinate -int bodyHeight = 110; // Body Height -int neckHeight = 140; // Neck Height -int radius = 45; -int ny = y - bodyHeight - neckHeight - radius; // Neck Y - -size(170, 480); -smooth(); -strokeWeight(2); -background(204); -ellipseMode(RADIUS); - -// Neck -stroke(102); -line(x+2, y-bodyHeight, x+2, ny); -line(x+12, y-bodyHeight, x+12, ny); -line(x+22, y-bodyHeight, x+22, ny); - -// Antennae -line(x+12, ny, x-18, ny-43); -line(x+12, ny, x+42, ny-99); -line(x+12, ny, x+78, ny+15); - -// Body -noStroke(); -fill(102); -ellipse(x, y-33, 33, 33); -fill(0); -rect(x-45, y-bodyHeight, 90, bodyHeight-33); -fill(102); -rect(x-45, y-bodyHeight+17, 90, 6); - -// Head -fill(0); -ellipse(x+12, ny, radius, radius); -fill(255); -ellipse(x+24, ny-6, 14, 14); -fill(0); -ellipse(x+24, ny-6, 3, 3); -fill(153); -ellipse(x, ny-8, 5, 5); -ellipse(x+30, ny-26, 4, 4); -ellipse(x+41, ny+6, 3, 3); - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot3_Response/Robot3_Response.pde b/java/examples/Books/Getting Started/Robots/Robot3_Response/Robot3_Response.pde deleted file mode 100644 index dea4634d9..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot3_Response/Robot3_Response.pde +++ /dev/null @@ -1,59 +0,0 @@ -// Robot 3: Response from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x = 60; // X-coordinate -float y = 440; // Y-coordinate -int radius = 45; // Head Radius -int bodyHeight = 160; // Body Height -int neckHeight = 70; // Neck Height - -float easing = 0.02; - -void setup() { - size(360, 480); - smooth(); - strokeWeight(2); - ellipseMode(RADIUS); -} - -void draw() { - - int targetX = mouseX; - x += (targetX - x) * easing; - - if (mousePressed) { - neckHeight = 16; - bodyHeight = 90; - } else { - neckHeight = 70; - bodyHeight = 160; - } - - float ny = y - bodyHeight - neckHeight - radius; - - background(204); - - // Neck - stroke(102); - line(x+12, y-bodyHeight, x+12, ny); - - // Antennae - line(x+12, ny, x-18, ny-43); - line(x+12, ny, x+42, ny-99); - line(x+12, ny, x+78, ny+15); - - // Body - noStroke(); - fill(102); - ellipse(x, y-33, 33, 33); - fill(0); - rect(x-45, y-bodyHeight, 90, bodyHeight-33); - - // Head - fill(0); - ellipse(x+12, ny, radius, radius); - fill(255); - ellipse(x+24, ny-6, 14, 14); - fill(0); - ellipse(x+24, ny-6, 3, 3); -} diff --git a/java/examples/Books/Getting Started/Robots/Robot4_Media/Robot4_Media.pde b/java/examples/Books/Getting Started/Robots/Robot4_Media/Robot4_Media.pde deleted file mode 100644 index 1945fa3d4..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot4_Media/Robot4_Media.pde +++ /dev/null @@ -1,43 +0,0 @@ -// Robot 4: Media from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - - -PShape bot1; -PShape bot2; -PShape bot3; -PImage landscape; - -float easing = 0.05; -float offset = 0; - -void setup() { - size(720, 480); - bot1 = loadShape("robot1.svg"); - bot2 = loadShape("robot2.svg"); - bot3 = loadShape("robot3.svg"); - landscape = loadImage("alpine.png"); - smooth(); -} - -void draw() { - // Set the background to the "landscape" image, this image - // must be the same width and height as the program - background(landscape); - - // Set the left/right offset and apply easing to make - // the transition smooth - float targetOffset = map(mouseY, 0, height, -40, 40); - offset += (targetOffset - offset) * easing; - - // Draw the left robot - shape(bot1, 85 + offset, 65); - - // Draw the right robot smaller and give it a smaller offset - float smallerOffset = offset * 0.7; - shape(bot2, 510 + smallerOffset, 140, 78, 248); - - // Draw the smallest robot, give it a smaller offset - smallerOffset *= -0.5; - shape(bot3, 410 + smallerOffset, 225, 39, 124); -} - diff --git a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot1.svg b/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot1.svg deleted file mode 100644 index e44805f1c..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot1.svg +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot2.svg b/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot2.svg deleted file mode 100644 index bda32e6a1..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot2.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot3.svg b/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot3.svg deleted file mode 100644 index 436456609..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot4_Media/data/robot3.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot5_Motion/Robot5_Motion.pde b/java/examples/Books/Getting Started/Robots/Robot5_Motion/Robot5_Motion.pde deleted file mode 100644 index 70c0a2eff..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot5_Motion/Robot5_Motion.pde +++ /dev/null @@ -1,57 +0,0 @@ -// Robot 5: Motion from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -float x = 180; // X-coordinate -float y = 400; // Y-coordinate -float bodyHeight = 153; // Body Height -float neckHeight = 56; // Neck Height -float radius = 45; // Head Radius -float angle = 0.0; // Angle for motion - -void setup() { - size(360, 480); - smooth(); - ellipseMode(RADIUS); -} - -void draw() { - // Change position by a small random amount - x += random(-4, 4); - y += random(-1, 1); - - // Change height of neck - neckHeight = 80 + sin(angle) * 30; - angle += 0.05; - - // Adjust the height of the head - float ny = y - bodyHeight - neckHeight - radius; - - // Neck - stroke(102); - line(x+2, y-bodyHeight, x+2, ny); - line(x+12, y-bodyHeight, x+12, ny); - line(x+22, y-bodyHeight, x+22, ny); - - // Antennae - line(x+12, ny, x-18, ny-43); - line(x+12, ny, x+42, ny-99); - line(x+12, ny, x+78, ny+15); - - // Body - noStroke(); - fill(102); - ellipse(x, y-33, 33, 33); - fill(0); - rect(x-45, y-bodyHeight, 90, bodyHeight-33); - fill(102); - rect(x-45, y-bodyHeight+17, 90, 6); - - // Head - fill(0); - ellipse(x+12, ny, radius, radius); - fill(255); - ellipse(x+24, ny-6, 14, 14); - fill(0); - ellipse(x+24, ny-6, 3, 3); -} - diff --git a/java/examples/Books/Getting Started/Robots/Robot6_Functions/Robot6_Functions.pde b/java/examples/Books/Getting Started/Robots/Robot6_Functions/Robot6_Functions.pde deleted file mode 100644 index 9d1878b54..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot6_Functions/Robot6_Functions.pde +++ /dev/null @@ -1,63 +0,0 @@ -// Robot 6: Functions from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - - -void setup() { - size(720, 480); - smooth(); - strokeWeight(2); - ellipseMode(RADIUS); -} - -void draw() { - background(204); - drawRobot(120, 420, 110, 140); - drawRobot(270, 460, 260, 95); - drawRobot(420, 310, 80, 10); - drawRobot(570, 390, 180, 40); -} - -void drawRobot(int x, int y, int bodyHeight, int neckHeight) { - - int radius = 45; - int ny = y - bodyHeight - neckHeight - radius; // neckHeight Y - - // Neck - stroke(102); - line(x+2, y-bodyHeight, x+2, ny); - line(x+12, y-bodyHeight, x+12, ny); - line(x+22, y-bodyHeight, x+22, ny); - - // Antennae - line(x+12, ny, x-18, ny-43); - line(x+12, ny, x+42, ny-99); - line(x+12, ny, x+78, ny+15); - - // Body - noStroke(); - fill(102); - ellipse(x, y-33, 33, 33); - fill(0); - rect(x-45, y-bodyHeight, 90, bodyHeight-33); - fill(102); - rect(x-45, y-bodyHeight+17, 90, 6); - - // Head - fill(0); - ellipse(x+12, ny, radius, radius); - fill(255); - ellipse(x+24, ny-6, 14, 14); - fill(0); - ellipse(x+24, ny-6, 3, 3); - fill(153); - ellipse(x, ny-8, 5, 5); - ellipse(x+30, ny-26, 4, 4); - ellipse(x+41, ny+6, 3, 3); -} - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot7_Objects/Robot7_Objects.pde b/java/examples/Books/Getting Started/Robots/Robot7_Objects/Robot7_Objects.pde deleted file mode 100644 index 5f0da699f..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot7_Objects/Robot7_Objects.pde +++ /dev/null @@ -1,53 +0,0 @@ -// Robot 7: Objects from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -Robot bot1; -Robot bot2; - -void setup() { - size(720, 480); - bot1 = new Robot("robot1.svg", 90, 80); - bot2 = new Robot("robot2.svg", 440, 30); - smooth(); -} - -void draw() { - background(204); - - // Update and display first robot - bot1.update(); - bot1.display(); - - // Update and display second robot - bot2.update(); - bot2.display(); -} - -class Robot { - float xpos; - float ypos; - float angle; - PShape botShape; - float yoffset = 0.0; - - // Set initial values in constructor - Robot(String svgName, float tempX, float tempY) { - botShape = loadShape(svgName); - xpos = tempX; - ypos = tempY; - angle = random(0, TWO_PI); - } - - // Update the fields - void update() { - angle += 0.05; - yoffset = sin(angle) * 20; - } - - // Draw the robot to the screen - void display() { - shape(botShape, xpos, ypos + yoffset); - } - -} - diff --git a/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot1.svg b/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot1.svg deleted file mode 100644 index e44805f1c..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot1.svg +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot2.svg b/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot2.svg deleted file mode 100644 index bda32e6a1..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot7_Objects/data/robot2.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/Robots/Robot8_Arrays/Robot8_Arrays.pde b/java/examples/Books/Getting Started/Robots/Robot8_Arrays/Robot8_Arrays.pde deleted file mode 100644 index 396a5d6c5..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot8_Arrays/Robot8_Arrays.pde +++ /dev/null @@ -1,58 +0,0 @@ -// Robot 8: Arrays from "Getting Started with Processing" -// by Reas & Fry. O'Reilly / Make 2010 - -Robot[] bots; // Declare array of Robot objects - -void setup() { - size(720, 480); - PShape robotShape = loadShape("robot1.svg"); - // Create the array of Robot objects - bots = new Robot[20]; - // Create each object - for (int i = 0; i < bots.length; i++) { - // Create a random x-coordinate - float x = random(-40, width-40); - // Assign the y-coordinate based on the order - float y = map(i, 0, bots.length, -100, height-200); - bots[i] = new Robot(robotShape, x, y); - } - smooth(); -} - -void draw() { - background(204); - // Update and display each bot in the array - for (int i = 0; i < bots.length; i++) { - bots[i].update(); - bots[i].display(); - } -} - -class Robot { - float xpos; - float ypos; - float angle; - PShape botShape; - float yoffset = 0.0; - - // Set initial values in constructor - Robot(PShape shape, float tempX, float tempY) { - botShape = shape; - xpos = tempX; - ypos = tempY; - angle = random(0, TWO_PI); - } - - // Update the fields - void update() { - angle += 0.05; - yoffset = sin(angle) * 20; - } - - // Draw the robot to the screen - void display() { - shape(botShape, xpos, ypos + yoffset); - } - -} - diff --git a/java/examples/Books/Getting Started/Robots/Robot8_Arrays/data/robot1.svg b/java/examples/Books/Getting Started/Robots/Robot8_Arrays/data/robot1.svg deleted file mode 100644 index e44805f1c..000000000 --- a/java/examples/Books/Getting Started/Robots/Robot8_Arrays/data/robot1.svg +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/media/AndaleMono-24.vlw b/java/examples/Books/Getting Started/media/AndaleMono-24.vlw deleted file mode 100644 index a71ac78ac465bb3427f5cc4d63a9cf79b99c27a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66629 zcmeIb39x(Hp4YYS>nIyEXn=^uVc&icjAFEjL+sY59U6%Pk>Q{aRMOCG954+Ik-=C9 z5}YuKW1KZkC~B;7Dy@n*qBvC?8MK@g=W<4o+J3&jVeftZea^Y}zIWey|NpzJ`u|VX z+H3l)-@Jysc2RuvhZRNfJMjN^<^RY0{~`SU?fCz#{Qsd5|H1s`bE3tU`Csz?2k<}h zdc+mR{8w2$&pe_QesBH``LF(zr}n?Ze}x~xf2DsX{=ZxAN4}Bw`;aGCzNJ&|wPvknPdLf` zrjgDz^_y+}0a5OydVe5!!pjfhf5MVD`?kmvJeilU{Aiwu4&8d$-z@Ty4l0*z{z1gm z-%ELaaMXLLzdz)SdVgr-{f_)5oY~(z+I*=$@upzu*30pId*r=T?>op-KZ#Gln{@cY ziT}>8Op1?D|bu{>XUVt(Um|qsV)Wet$H1KP>7dUb4;a)b;p-u{}Uqbr7`^Y7wRQm)^F7N6UlpRd_UohdOwjo>AEhQ+22o!dfmJn z!%rqp{k=4Xrx)sFn?L1^dVf;Xdx@9+F8`T_4S{^GmX7V_r%Me%JX;YCBOV>Q72(h8wtzLAg*$f`5#=@^>5{WO{EI*UD`glqHeiqMPtM@%G)Jr(OH|k}Z>M!&DbmEeMghla$WkRPnLQ7_@_!t%2t?#sK8`-{nw90_l#C!L<*7ZK4|bG+Y%`2D8H{7X7{s@u)`#hpBjv77fx-pKn) z-^lx=>{(i+9d4F9ePcqo8_t(FX_cwI% zh(4?LH+J$QL)|w2rcU0wIQyGBd6J24y-O!gyx-0HTRM5~(*1Aks}HGv(zPc`C1Z zY9rSg$ch^UTeo@2;*|1i%4WA>+b_V=rZt4@wVzd81Qgt+ue!lK`7^B*Pt8Z7@o~x|-QGY6z^?o&R!I`vG zJj1_0+;~Q;kn>U`YA8z z_pe1>;zi|>2mkdq@_y|bdH)7^8bh|Jc((a(M!lqw`b%8@TW{q3+i&FkJLIX4Y*X=U z^AUM3!Se5tCq12b5iE(9fA5XFfB%iV|A4$Mt_4fB`5(TK_aBib7!ywMVdCu95f`l! zPU*{R^VbvC7_y%F&U(M$jlAFZM&5r+p4!PaHHK{SKZ(4AMdcEf|CG33%e*e1{b!Mv zZ7MI@{LkOW`!C+e`!C)7TAK9PuQ1@Vrag?)d)SH}ZbV8+rd9d1@zdroNNUek*awPSRH85>BlfNaixHGro^hU-F*( zsd$8sL@V)ij!)x>Hb0U*?bcIXgpXuDmCkzNr>rMiJL=^9Zk;^wURN)v@2n@-U#q8n zUaP0R1!uydc($oA3ul=p9A%z-8jT@+n;+WxHXjLp>MwEDg;VY8f6_>81dTq@SiAV_ z;zeWY)>Ay|{qDqH8{dy6Pw=PQDjqWS(YF(St z?B5ynG%o$`;%rI!wR%5>Ji(cCP(11IT~ROdy8ZpQH|nk4sP_}d6TXvv8heC~ej*X! zI>(^?B7F3dh)AvymX3^l^pkn6_OeaYkMPkG5sfL^?2hlJ@cdo8B;9}N8})wL8}&Bi zX?zK1m$pBh=dbaS)+4+1y14!s9-XAx0e_SePr_e5USQ@IEqeJ_#M#%a0e zR+S}u={NGHn2_&xJ9jtF1=QAAWP$F8vk{k|-_`C7d# zc`BRZ>%#dxJXc>SV~S^+-}^#d@Y0X?wdASIgj4Ydzgd2(Xr6hBNBAwmkNWSzl6mU) z<-D@rEBbZ4fBjFX+~Qi#i{hp~=XzQc+nR26wP>NxANGo>u5ZN*MjTkI7*2XcNvU4H zcdK{QxLs*z=Re!}eydlcj(ggi)%#sNDyH>vv@45pCo-xc>X6!&pv+y}N^29g^|>f6 z_0|$ZHbw7I&pcJv<6>CXR9-!;H$cBW)b-PnQFcPH-E9GQyQ}Nd?nxCdz*9V^tH7Wq z8j+A$C{h&5`bxBSI^XL0a(>kH`Eq!t&GEFZHBCuF*SUw9eQX1;DkrLE(UddUDL>@FU$`oqEyk1f`{wU zpE5v#6)1|M#T~F21F9cR%88yotnX>P13A#TfH1oP6nb<|bnVgYs0QZavSi#Kqz5=2 zX2tMov0J5*WwlPi;ftJtPJ{W(k!>WNtGuAw3(uhL3XD?`5)fvB=|uL?@Hc_ez`~CH z)WS59M==ElmjG(`r~$zF$RT+o1U=flJb^8hjc{dvJs8FVpsWDq5)bZbiU3%IW&Jn- z1S8ha;JWoin0ZJviZyVGuU%3Y#0scSF$j3xXmfWA->rtx(vYOa!A>;}hVRXmb7wz2 zH^Qi83*tMGGb%#+swf=<@<9N9O=4A=+`d>i3RCw)D)>+^6K?8M(khnnZS|eNg}?-O zgHkt*qh8cJ@6kpN_65VVeq4w=phDaXW{p4k0ggBgM1l(=jvyCVP7oWN0WP3n&wEv3 z&wu*u(>9T@nupeaH6ATx>AYJ;YUK9lYFKG}kd4wha z7!n&2)fHxCaaVX*Lbc4H<@`q7m;uX9)jj23XrY$<8Bh-=x9S!wE2zer^ zD@?7!=@Yy*EjEzmf@-SS)2Z|@B%8a#F**vp7N$oV zswZ}iFHb;6kLWLSZ4(H%CC0bwRm^_5UT+or(1dw!3|AnHBYutUQVQJ$I<39fw3me= zJfITb;(HH@)-&XZAtM0&N(|k*NWe=AJ&C`Ce!?>-fk6R$Vhq9mL%drLELIFAZ70h_ z{n=T~NN=1Y#3D%wNZ8gQ1?YFy2HWClLM7{DVV_OF1S@|8wWF_lViVQ~N=S8C04$A% zuxYw{7=!SLE`uq`NoWl#I$BMa0gKp_u(s!lixrfr;E=xQ4N4*k>KI-&73qD8hf{s|Z1r4i4nW!zR;?@k^g;7f8WQI61Tt2S&_#V3m=(+2)ao>?9b{ueM)*bJ(4TK;v)m<2fD}(Q3t=^TmgOxu>>BeVS>@3B8&;uW-Em`#0Q?FvpOf49Nl9$G1^Fg!1I$@TkR}c0qyzG) z@Y&m8Gx}J_o%ECZSLxD^4idwWL@lbirga{RlDoa&=f$g##Fe-&B2fbK~O&V$_E(wHH*vFK06<3PxGwOSarm#+4O zT$utGo8bV9YoV(Yv&uon(Zy9Sg0hJy{B@yIYZI1XG#HA32HR6(#**hk6DC8Q0PasF zBOFG79l~?z#ELQYH!!rXUSr3H65;icM@w{@IBJ&fRy(qg3F01f`^{5n6$z-hfz0k~9 zY$d6m@VhgzFqjaHQhc{kJ+vbjWlm#3^Q5B-ijR6af>PLoj z1-;qlfBUO8G_I;zSPT#Q42R(v{`GKg;6r;Pd;@WOi1$oG2s%rjhXBK7<~qT7^@UM^ zE6X!nZPhjpgeyX`P*bo%)P(+YVY(1ru&|IM+)iTeaWNNvgVR(3tv7N{;eZ(Kyb-aP zrp%2^Yb6f;1Rx?p+rb>fLR~eWz`>Cz1`g_rJz+dT`^?t3vf5-i&013%!P!QKk~__x zum|)4cZ(Bx7d3iH$RBmpH-#a`U{&u{409;?JM~$hg1k5y^2F-fx$dpd>@t(L>#goz z81j}TZ_2qcjx+SA@7Ed$>?8Wqs%EvS&p*VXcd8eMdO+VI1q`>XHx8(9F@j%52+VvY zs4uNMh&rV>@;F$Vo5UDuQw}!n-u8aKU!EEacAXnj1YP7pnbs7llLoo81;~V^A!r8X z8pC;E*yhh$uZ(6R@QOd=am%TG3<)Fmf2rgghJ;fZ z0H)R-w1>};Qs-BS9mSpD$tt6y`?O_LtMKv&)}sJbxJ!Z>bBY3GJ*eLw%t7XgxUF&k z>^|c#YZC_>OSQ9k+Fog?RNMn?5&;e+S=iu2rxb|F!Fxtj`Z3&9r%BpSN)TYCM4L%;Hrlw3UJUKn znt*o`4U=d%Z850S@Qc_fL|qL+Ay*Dsn1EFB^81UsN~}n^rBkyLu{I+BYK76Xa<3O! zrrYkQzZu|3P7TS(2~H*3j#f?1B%nrG0FvZdTs~fxB+POBIpdjU96_69oS`+(i8mx< zT-grAuhBk>pD-ij995zTz$Kir)p`WSxEU(lPiJiKa|9`iPIT#IWLc9~uSPfH2?6fU z1|AkQQ+57SExg>t(?~PLPP=a7y_Y@WxfewX9h!diS0P&c#e6=WY3UXjfWHWXsfpJ3euatU zI=E;}NHn5F5t$qpE#;U4B+){DB9|*Q1TQM55v@}g$qLaj{TOn^MwBg(+Z2C}hb(-6 z>y&{{jN(yKwqCAQOITdd2#Q_^n7wSw%YNoA1Vab1jl01t6wY$;)JPiTJj}_u*UWY` z9{ITzz6KG=cE4f*avD~>n4wB*ct|d5_S4L~yaP-N-`67s5%$G;iRwWeu8;)dm51CT z1-X&z9E~T&FsXeptVlz6%NUzU&_mwDI`p5^{Wg^_m=MlQlY$I$3Y37^-Lu=)7pz!# zd5*3yBY`_-SP~D~@`(=#&4PSk$(n{WOcGsV)1W}~gunrWNNAi|wQLlAT?QZ7yqqN& z;}mL3Ii#Kt=jjpQJ&A@&?ih=MhUQ@_mF&=lX_2|XM42aQb7vuUAgpPsEUW7+%}s|` zLjInnT9#lsg6kj+MV%=N5A}5t3H+^kg;7_|45qS`VoMaO{gX}V8=Os}n8Ehh5>5*0 zXnN_y5CpbMO>?%*?UM?&8sJQmbX;|!rvD-;Cpw~XCoKvmts=T*2|J=Y@Fn+w7WT;F z4W_Xu%6Po-D2O{{6njBIQ!GM4M9tj$Q*lnckA+c*#l>eJ;ML~v)pEMZ84N6|!iFY^ zqyEdufed(=S~&q7C{z)d`sbp`(#UcNgpMF!s)S{0hsYew><$~Kn>BtNfX&G9V#;|| zr)h14)PWOUbC#D6Rt)2Gj$G5(V<fvZUi<-l0LO#v z1mQW%F=BfGNjZM*5tS4ZHO4qubV>m!6P{iU2k@h*U4)sco;KU9$`e&t1)`rtw4DtN z-mIops^xO|z7wx{jd=LsE%Br&l6X#PCthf1hzEzT+u{yvY&iQ|kD7SBaHF|{=3VHC zg@+M8t+MHH^Vp5Jxex)$C1BRo3=8xN zt>&B%p$DmH`Hp7gc^D@|uI9g%<7#Y*p>gFQVJQL1!0DkjTy2BdRT)ZDq4B8R!$i9o z1#r!wpU=zjl>!NN`IJ#3pO>wLE=70En)NK!J*JQj-TtU-ReNYcDQ{l9>T=||l_lYc zaZs3iYq2l8o4RV{MpG3PwD=^a$SFtXv=e=rB0#cXCfJw|TMY4&kI}Ibe=1E>$eRE_ zOsB$G9k{$IiEgp&u+X@a-r!i+61}puw$$!)sx<$iY_3ZMlUZrUfNByLS|b4@;qPp> z@mPVcuW}(+hHa4JcF>VOX{5{C6^5CpqhOz83YnJwVD&BdyMj*bApt+@g@DmV8bO-Q z$k7`u=-3_V;;uOw5AA#zXQgP4Lrh?SF;4J2Z1|uO8kY4#PQgL;-jYjbCCzW#d+*Zj^(TH8QqfBT3mv2G6$`^1{ z0_2CQ;cLJ+AuIJ@Ohk9C4~=Okor+C{*dei^g1VV1tCOahdz{VM5x_BF3ugq?yi~ri zE=X2a7$-0%_g`JnE?fr`E({i7qaYZDLS;L4VxZ6ouf|ZrZXvA6Xs|ML@K-hs+zM#& z$6B{aFfI@?+L2Aj&W$uJqsbnm9=5#>T8a>-fIRh;sLoeZS}w$B1u_CBwKBvOqBfL* zp}|5f(=pU=U|xN$sfyNV@UmBo@Xq z96)}At(hQk94H3Ou)-CNl(Q+IKkvU18Se$AqsP9sdy3&Q6#!#Mzs?WXX<$$`&;l|f zEegj5EpSSpg<%-akPT-BT9BzkiyiW_+E7AVt#D~*0)u`+=ego~YfocYcc*94*kSx_;n%uvE<@(ZJLKb+I zDDepK&A~GJlJ;`E(adypO~&0`*X519kv5!Zq8lE?aHPG52&2K_as^tN5uGZB4@XfL z9?V>6lx{Il)4kO(c&tl8aEe8sKoTJz#j7Jh`Fgxt-lPUURcrDxC)!8XdGrYM%faiF zQrEECJuN_I;25As*WkN;oJWOhhJ}gD+qvou<~y07WQg{J12oHr$cP&N8tbU!*l1P{ zP{6Dy(URslGt0(B&#|v_Cs5V4XUQ{>#~B-^$f|xyg5q|3UlBs*uzALf4lboKk2eks z(7MT#24?HSw;`)lipK#Lg>>kF`%U!y)Lf3;uz0XwPotbL7spyL>j8@%yfP}mkYtvNo1(8Xm~1f0kI z89JFD#UelFayM1t8pTit3QfK-V-Z_xD-j0ejE$puHJce)C>uO!VnCY;H0DJ3 zYN82vLs1$o4KV$Yn{ht?VBgfLLpK1+haQ%*o>ekE6yyo$e=@Pf+Dr^0K!@OfsOjt; zAHdAj$QrRpJ(IxudhSl0DP)a`Ah9*JxX+9T-fcZXpWW80#T>cNtF%B*MKu*)fN|lI;Tj`vVgnGrKx}oJ>;-qm;C?$_FvLf)^v!naA(}Er+P_U1JS1C_47GF92oQOi10d#n% z6vQz%OD|dt(8aQ;qPYyHuje{E>Hl#2angVdPZ+y^UH2NPoZzcjIts7xNpZDJe|O?8 z&H}_m#=(6({z+b=b{!*76#Wl}y4R>S(`(H3frB!x>=kb(U~u<6=W5Ck+c(2?hircX z*(Mh1VlK0;xkTyj>RN{_?TM&+z%EALF{EM@FUCc|@=&^U5l zELC4Vy!I6z9P1O(mOrAyWBf{@p8#CKaSw-h9q;xPcg#E{2jq zLGNE-G_5l&VEKe@beLu&YhEb^BAe>E{+-)y1c$C|O2MmJ&JVn4=6K%RPUyNVO~^67 zup(k`($-9kigS^EOM8c&Q|(@ za<*<|8d4R|mRtQ|`t(Cs-#C@;coV8`_GYx@u#g9c16yN-j2qZ{0Gre$gO~vV=Rv^+ zi4jjH(kXWsSZ+I`!A&`+S)uBd3#9U0Rz<~M#!1_nVxWLzDFrYc<_R*_BOQUWIS#{8XiggCD1A3bJcBxc=j=I2qanX=l32<`B!6d- zj+b4akwyzC45P4y)fS5y9RXQPXkuW$+0OU>_5MJxZEzYqQgeFgVrpkMbV%YW`**Jo zv-McJJPHg=ukqLtjY}yMFl+*CLT&nxv}xM>1+OkSoJzK~7{2o^1D4RBRSW?r7SR#T zF$T!`o!@L<{r2G+ey3CxviZF@am)E?<}m9WV4x(N1p3+>y9eyTSYSTAWF#)In*!9S zpJoGl%O`&gh0Nk8`cXw3jI z0lnf$g^dh4R(mzx53m_m@F=3<6OQ z0hb0-0_jj6>L=G|>c^@H`k`Y~(PFZgPlL+#RzWbGB;bKS8TOa}!(XLilJ>2l{kerJ zZi$Yymwrlv)O(U6y53lIn9zdhik_~JxNr9wr9xZB5-z)z(^(UhO7d4l`XiGfA$+(3 zLLhVdEpWG#>8+HG_eyAIz%d87(%-xw*5{Q`*o4J#oAAgK$|l(B-i(O?tIRI=?molSbQiRxR1vo3*|cQ#W$)rKNk1Oy;yoef2hV6RLVmFPn*jw>l4 znSViB(~}1M=zMaPKb+2^*2rKUScc@y|N6`eFtf71;vf?3EtbpGJ8vBAcj5-FT-oiN zWuI}wvkgUUX)C;;m{GdbJXrtf$Sn5o{gpRu9_~VR$r+h>CCLT?1qcrcV1zsRq5^o) z5!af5iQEd4X0Bn@>uk!+{1;eyt+rAHjOE`PN^T;6R`G^CPnNl63~Uhlf`uL@Y;OpPU048ZSG4u$ zGn|8bK^^H>azMali?GFFY7-ERxX?K_!hLEf8oaHhYwF062L|{O`GQl|^5P~o{)eF7-Hy3iPV8 z<#J({#R9lEDlG4X-nR*z1eAyMVIxYoFQn5+gmWrIZeEDfDHIkPKxjF>!sxnwLVpPN z+TYsS$tF62NM~rN1Ak*~G1yt>`)PGtsr&;58kCjW6Rn{fg)8Zg8yIDba+%@BnaCpSK+qAL8`*i(1IbcJB@|I{iNr`J3#1Aa7Z1Xf zpW-D!S7xe2NXl5EGue|WY%It-#Y)KaY3{yIn{Tt!^%+Yohl63+u+$hOB`-5sir<6Y z77Uh>Q+Ec$U@3CZrTAUWQY1}~f~BVHY6@AwQmU)HaA&E-2#r_O4=Cd-B~)sa?z6HK zItHFFkeizf#=7eWsU^V7gY7;~ z=Dn|Xso2?%k^L0~o1l%rCNTKr^|H4uo3V_}NYvK=%@zGxtqnX|Qh??@aYd))+5pk; zEn*^LYXdxubBXA`Mjhuu1Fbaoc@bC0^Dk(b-o~}58nzXCB1ahRvJHhods2mgDoYK7 z3@U2wYei$f;G0=D%3 z>bl=bsxlN3d3E5_{pEmJ3IgT+qMeTBl;VX>p>HAe|Ly^zB7 zz)3}qGqlvt5LZAGhEM5Rds=@>9SyWFGC+`e{w$u8Qn z@;i4zc++02wplW6Tg)V3=4-S$95w+}XXRRTF>DEuHHFwegPO@8xp0hcqr zc7K5aUv$K_CrN}Yn+7`C_$$#fE9Fl(jm(`trX_eV)`eHxaT&bN6P@^!jq&isM(l7k zN46*7SfWr-GF*k}sNvl^9Nk9kY!Kba@#fmdN^~~jNeh#WUi`wzz8&Ri5K?JchJOmXxF5 zZ{AyBp}95uC2of%cM-76@Nkplh%JrjJ^{Qkt()iuS_?2d1((t!I;jV`d_JGPk(TTf zqA7f?x%{|D;>DPg7)iVLgN{7O^b_Kcw3l0ThMiH8w7~I0c@}_e!L)t%eSI4&Sz2$x z$$I&HeNZ6p&H~P1%XIj!0TOwPFVIT@Uo&L(N6;D3X45R>%q=x4dt;Tv>2g+{_0Csi@r8XhVn3m<~nL3*w0#2@@ z!MBc;CTTvyK%fZ{ZAtHh{dLeY)cd=*@USjaXYBm_um^AZWVSDe+Bj*xh}t0f&}yv& z>!h{Rht7#`Bn!7uxJnK4A@X|CT4P|Sgo>E6K1$fuEg|$nssu|?_L1&flh-?l9^R)r zGg5PDxyASuon;n$6}k(1V%qB5cpl?+-G_FYAE`whEmBH2(QkSPG7 z2+yZ@Y`>&kRLPr5po(%?g)T9+fJZ^_S)=?>{g-FOlH51dWfeZ!)|0U1u2`|N*>K}d zqO3yIQb(I}O{i9rFWe;`8hn@I@Tgsd^IX#iml+b=_CMD35ehT;W}Le)olm*t^qu=P z9I4;j{5Dz1Nm&{WG&^{#V(*b-AvVo2%Xi+QzD{xKPog<#?r;6#h$fbjWtBdE%;#y> zW>D(w%1r-ypD?q!xJSf|o6|2Es>++sOjl>wWW{l$c0G)kP9@lch&W<}_z_ILET)NY z7z)Y}qV7fS)GxITqZ*2v=n~gPcjcJwHM4GPDPIjx;L4mi`>?hUH zLWh(&qKx7pGS}qYd`gBnq91Ml+w|D(I}!?b$Rt|}4)&2E^FLKiA}O^bUsXX%5n%bk zcQU4>;>9SB%vh>biZa4E6PHT#($-RARKOMU6r2xb>f26V<%NBHun@bdpE4>uXgPyw z>^*t(bGWxeO?4*d$7Trwx`+D#p>qwT*+l^lVy>ogp-L} zE6n2rD!9_)-uQUA24sCD7dU=OCScn(nc!>14>_@Trpc$R9*@;^Y4P|x8LR8xEQ1$% zpSep2o8er~E0j^{26UX?udNLB8uTM^Am5ZOF|@I-8Nx%~e7Bu2*x6!%1Xz&35X`oq zxqW9#xFC-8!8D*?;c+QtBxFp^T?$oi$dFHte>O*xHYFOBtOWmki8T^jI1t5{Dbg32 z%CTd5n*4a8=*el*89EnHCQ!PC!V@e~Yl*#I=$d?H{Q6XZt{Sp?X6KeL7tidhdK+>_ zmwq`je{N3LGVN|=8rX9iy~@BeZh0Bt+@8L_msSYgJ{P$;t7?TjCQRsmQG)MMX&);2Lk2i$}A;1&)5K3y&WI+XCWMhWjZ&LZo+E7(uttoU?XS?UF|-oo6V zEf3$j0hwoQ%c;P4ok67L-~jB`vukWL6z3X{+w3)Vb{fggea3c|(Qi<4 z%ppc;=*(?N&I9`)U{-FlkcbgJoaa{Ub4amPXVa$*f<&ec*Zi7>B+G)7jMzruAj_Z7}8<@~@rUp?^=1NUt z?~Ko2+I2J6u~tzSap$6!coX3>|HNzXQEzv-u0RnTOBm48Hbvp%TP6cTQ^tUB=Ej?N zW9IX{Z6;sJcW~C1i#+8@V`YDWBgN?M318f_UBbacK#eC$y}NrGf6d`Be`AT>#8mq} z8FX3d6f#F*#AUqQ!{K~`r2*#IT|6wW`84FKjU<|ycI;XMO&z8AkKE#fzDCw9An^Bl zq1UTebMP>bad`i3Rsnl4bpSlw2p8BQr5(G}!z7z;xe~`O&~OxZj}0HteIuq*Iee}4 zz1O#~6tnB4Stu+4yBRn{G@;YzkV>CHD#4%|eAuvWAKb9V9W&LnQ(D<(+*=J(Ztqkh zH`QHEhJ0EkOqIV+9S5vFAZjn`fj>LA!+uZkEI}RinjSta15Nik zZSc!_1l}CgbiuHI6BnpYo3Utng+Olv_CH3=tyWvsHJWg|G$}f5He`UN(X&-Y&H4?o z`TE@Py}Me+#x=j%E0DxNT`Ul2HXB9(;+T>oKQFw^0lj~B1p(yjdXB3HBqOc^I|r_ z)MV9)ExP&cb2~lYK+*MjIvl8_&rNyYYBNPn z8?FVQaZM0qF#u6#De^>Q-Dlh`|H?rld$UT=p{oGs+y@b^1k@TiW_{Es7g`vK%yqD9 zOb&jzJmZuxC!AS@;qrOgVAyI2M~JStv4x)ueV_hk@{7qJH_p&?7zETc@@3X#pXlND z*07Zx!gTOb8-)2(>pay}A0`Bg^X>LtvkKxeZCC{fk#HERR7gU@FwZ`^oYz&`=*48s zz_q~H>_v`u+Xh9lbSCE1k>;9OU9^EjG~&GH-rQHoBR;QKAz%t|x7STFAk}4o6-J4` zaa2~ipQ<8m7}p*f!qcp&OO>SSCgsplnCdNoNi>k_XjLi=>m@sK!mudzBist{iDY)h3;}&?|gyJT7g3x7V1FpqUI$%U9yrhw@V0He+CqjxbO8n0SN&K zsZZU%Z!>+@8en)rjwfL3U6Y_|eZtXmutNIEV`v(_!})UJSuu*V#mLdw8gBrxqk-E%a5=f}2#*T&Qa}Hzbj^41mh>g-$wvlRhQi)AXf+O`4GlRy@?UVO=JJYCK=0 zHF>?DA*$SGas~x2;ncU?o~}9lAsza>{`2;w_?!Nq?X&(Ng~p!ngW-h#wzV759Ixa@ za2Gz)XH{+k43u+aJ%o~mohUHvCPjWinw~HxIYB77x{)t#nJ$|iZ#S;ob3TagJX6!y zLQYOHlv7-fK{7w``VBn#CCNj##h!e|OEw#@27|eQ&XaUN1ojdwu zLoIV_7Ee9cCq=H-t{w3B#CAKqb;@413Oi2gW;h^rs3rXg=E|>wKDz*`afN{B5$=dS z;~lP0e@7b+X9$R8L9!uUyUpPTHI5*wxKM5vx|;t0f+tY5=H}wLrd;#f?B_gdzH^oaVJi&pa8@7a&@cV1TmcK!`JC8AQd0jAP2PM@qN%n3=j>{0O*Ddi z`^DofjOEihG=SOJU^wZVWGn3MHc&9Srvey1trYAzsz|}CAXiC>SzU0+MT@-8@zi00 zbB!jo@r07M@t7854C8BTKbtG~S&1*9cJ9E)+CnNkgSOkpQ|^<^D3GkHF#A-&ZA*Uy>q&!{vxI@O?_g2rxJ`&hEx(DlS^3C%)f81?qth)vq? zq%(Y94dpxisvU)ZZ*#q-->qp_v#F*1gIth-4DCf=%l#JU6&Ba{+Q|qdfO2rfDMw#j z7^x(hN*I4kRgbaXXy0oK6mHAX{(CSpFNBMGEAbCLJoJg1GV zm*#K3Vl&3jTON+HVnPFVUv$_}PNDhg4%d>0f2%u8ZO+%{iFtz>r4q(3K&;c>-k~I? zNld}PSDR344nM6;7{Qg}1&eEJgfZxK98bVk1EO{{kK(a?qS3GR=BJ8x+-dm2@s7Ri z7_U5nsiQd2nG2C~2@s-ed7_ymY5wYklvVQK6#G3K=LL5keQ3NR*mdT5+AR4asZWcr zh-3~Jt$)i@MG?pyuZvn#f7lk(ZMPXl^Zfjhp4cL2BXyD;1y@bVoA;zxJ1J@X_T4(zJlCMf|;*p>S{S(0?)uRbWp zB8)FnjxC8$yL$Er4~-8r*AWlU;C;XaP_ax#W7N_gXO`Ibv_s+s(0sRi@?klAJ&xiv z$Lb)$%C7IRyyrC7bV&d=@?rCa0>i2pHA|~}v;cJbe8F~61dT28qa*5#eHa60dO||f z_g|?G>lB5y6AH}ei9$E1Eek;q;y`WS($L88eV~R#Qtlr>;iFb$tf*$pfXd(7s8``{ z2;CLkdoW2FXzd6vO^=d2shl0DAe-U;&F; zL2e03*jjR$Mm~22N-8F&DE)z3AtG?1C+_!0pM(|5I+kOopK4l`O~X9)(xw%Y-5VE) z4e<)F>YMe9uU!t2l^TOH3%2-cuPQZn1W8&h`eO`eT;*jU6?EG4R#-ZFUx~p&(xnIm zP!o_b)jC0CAjXKhzioQxujA z0LadRQWa6DR)RVWghR|MfQX41m07EzhyIk0*E?cTquPwkl^{4kPl^-Q{eHEQZ%!A}tPFn9 z&>5%_BFYnqUvjdaXzl_)y==rao_*~|4Pmzk0Z_rWi^AwyCjz9^wG7J4mSs_J#)*Cp zB#`9OlyqPAMm`Z;+L#vh-iy-lRiVLb^|XEF!*nNNV6nj{%{Iy%CEPF$7PY~2QI5tw z4-+UWvxc{w*vfg3Zow!u>fLOE0L)`-~j2hyj>AO{&-l zk|euxNJC8YaEC<&V#^^5rTlwXYW5R3q=8&){}ph^vi-Q7bLnsa5rc3ehb=;FbnH8sq@Lz?=NYEKdZE^R}{cCkmxyqY+BrN|-=j+cG^fzsBUnWObri zcxUm!S>n^xa%TM+izHiLw9<)k=*NIk?Ow}UL^7}=GH4{=$Xd>&= zVLQ+llPOzD%dw#Nd=kZ=@)Mcnugr_1K6EIbSYK4J1tNHGXpQo*J&mX2))GggpZ(q3 z#H9K(8$(gYV4C2jU*pV4`)nSshR^JZg7@!h(7b)thHK};uNu$XUc(Vn*=DJWJ|0|5 zzl0fa!-t>DLohZXxu_P2KXyM=^8i~MXWZ;j$ZCJ25K0AGiHfv>WeQ(}8HKWl; zrmS`HxQW!WghY<8+HN4kUYk~H`RN%R#o;PewHKz$*3nwjp&I=8Df@ZW>9a&*8f@+{ z>-CqeWK-Li!q)06Ay$K>$L-z`fiCxLs)#~4Bg>=sa(irjs!3Ui*3D_Apzo|QnudZ1 zjc1KuLy~O7=SPi^qNBw&42rS3?~I?%UszUuCavJEu>ww$>T+q32SpxwY@92lEmks) zl8+`Han4=11+WBl4By6umk06S+|6$P^dWF=f7+Z}Er!#uDhyR>y_wtH9;*hCy~lOH ztK|{o{x)uAu|BNq`MXQq&XU+UZIif(niBcOC!lT%&LSPW6@UVt^9tH#Afdy*(J^RD zomqC%20|BuPzWulqtVURmC*$(`DXaaF#6;e9UYJEHO`L*-O1q?6>|!a)&+p*UCYlY zfzEAOqnkRHLZr5Q2WF*ZcqMYp^DJ=U#N$q0uta7w^E*ZY3quwZ&iN|Qo+(E16)0{O zSfA>{xS6=k55wvph1zfxho!ao_J!rD>22L_zE{Vpw7&mpp<)5jJv5T1nwy8yZanRK zi=(-2$w;%)2h2$AZIia#w%2J_Q{)qwN?6YfFt182xj9%KwOz4jIQjxyvB)?-^B(tN zoAZV0iq~*7H~CtjYML--%~4?|-De0ELa_jiQAL9`vl{u8jb)GqNuOmzyz#Nnt}oVx zjoT#)O(C;(^;&JMC*+JuwKqm>p@PK0PCspTQX5Usxy>d-@$I#_lUo(UfG61cs_NTSH7)~jSM#>U+H9JScpj3iiARem zlyl<(N(rZt(Na>Ha7+P6*lFN98Hpyyv^BxWxVf~RsNB~awN3O|?|OY{Jc2+AKb1|X z?3=w`ICgomGwP0uxA3-4>b7VrV3!OZ6uXqW-LR;3TN6l~zpoGzAD8&GWkzvzBj?4T z`-#FtL-3B6=ZnQV9JL(q9on@a5p8wnQW%?i*uoWvOHC%Hv6ap9Bkg%&klzoLk#Y!= zrEb&pP|CD4lM58)^_I&GD8P0NTgzvSk~(U!>6)8V#1*32V8TM!(BGt>i*e_jOWV#) zvqIjfqt&$%ymgTD7uil-O^Uu#;gV`LZdH(V!c^EKAZ$nQQM*Z1uDj8TEfLI(PR&Z4 zj_uOhrk%c|Z2j=5mPEubm=TozzNq95GuBCICrn1Oa(olI4p%=r&gWNq0-P}6u}qN} z=N_M8C*7Os>2$(Cr`mtfUI1Mj)Gn4!sGdx5utqb^S6sOgc`)bMY7Nwy0Uk<<9v?l9 z6P)k1bGp?^C~ZE;uJTnO{_f0Y*wxqdt_K}NKrY!=)6+3z=uhmhb-m$b-TplGLaqSA zTIuC+gGD&0y`9KDGvXOYt60C>pmP??!LFQMf#kZDqSAmYls^C`R3aV-5w3A?&=K>a#9(X0xgXN!nQ_i`}pdg9%0cYscGofHW~Q#e(A2A@tS~dwT_``#Qq7xA5K4cj)YHChJmaPfeprUkHOg3=Rge7-` z^X?hCHldHxcO}VIX8B}PhQXou-CpaNX>VpK?@I?i*SrUBlpn#_B_?%&fWo5_rh6k! z`7FhuOPJ&!(%gVR0>o?BiWKt==2{;apYg`$h!66Rf0c7Spw@%t>p4~LVwExV&jPf^ zJ?ACWIl7}+fqgZ~z9}v@9L^Ue=zOlr+UL(VEZX^YRJ)&~ zPhKQspLXyCN1(4LBz|nfHh8@s8eu+IEvqA++Fh-XIE}b5ke_1kR(7ynadGl_yjq8x z8&btV1S2VjT?9j%dHK|!15Pe!kB-;8Z!mt>huUez%X(`?A zgR|>(C_56r_9%9-dCv?X`o1lyOdXsf%7ZmgtGbzUms@P&lI`xiPO|vWk z)MX{EW~tMc6uNr#7VZd}U#&bj%W}y00fp^t%N*mJ z!MIWQj@6Z|p+0oPWPm97LZY)Z}GC-Um0jR{gAlhF1K%W@${f8mb7q%G^ z;t1nxpw_k&Uxt^}5RPYBFO3tbotu#q-pe6P4>(2Pqu4R%1 z>=}~m=3k9*WU@mnPGNJ!fCWe*u&0)&_yM?vyNsDVOZjk<@w|=^Um+NR)V}5o`gyz^ zPA?$NTrV@G3}2@LeUgJv%n=V4266_?-S_%7!YOzi2-dXa%mF_7ko=+k5y_3AmK_e_ zk_@R^g}ae>00eMV$^n-zwwxmPJ8y;f;YTo;f$=o5#53^HVV8m072Z8Sl}V?xj%+Z~ zh)hPi7I;w_{e)Z7EHLAtaJ@+8=g--Y;?W&zD(yH#8DbtIy-_c z6cuV}Xh)$@Oh-E_WFXt0Qrz8!3Pd!)BsBBPQgsuR%9RXPIX)mozBv-k8z_kZvpWz> zutr~||xsk+LuS}UXm_E&cB9Oyb%55gm`cIwLVO*oP088|ms?>oN zZB;X7)@!tu-vekGClX3)vR=Wk;zyy??8X962uICibc+k*97*v&S9kcRfO4RY4eLR@ zyX_Y*v{(lm09U!uyg+f3Cq;(*&;y(q8&yuX=~}NqdhjpTC@wyE*mG1DUpTR-d0fuO zpTfJxZg}|mmfbh*5URU@A)@`q0exyBYziPmX*6GUh}ED2@a<^q+5E-wr0KPV`(_F` zSWCIh2ku?Vc`RL$huho3cW`>MRo;3`n=7kouEx^VVdN5kTz!s;rq=W}wI_-?mW$!? z$!C?0$>Gu<@kHkcp-%OgVX+)ORNy7__u&#aAoOM3awccMz(W(LD-P3VY$jH1-*E^T zuazV44o{W%5HbdV$}NAFlisM9x^J|1C4 z%YM60byLe0u9rq(-|M@h%xHUR+e)3T?)>DI?*RrffYzub@XyrZMZpzjRS)bsImCSauQY#hH#Mt;U#ULT+{_WJ^<=)<9rs9>ORp# zlE%mzvo>nEvTUe9npvkkk3Yi>U-_f1sggu?6*wHzs0&In%ADJ=BP)G)(f9h=bI&|M zP`lQZp@ui8;fJ;A_O&K_>3skBD ztey}C(X5|;!WB48ODryCYNJ!+XEC1+-I_Mj7D0f7KXh+ZfTJNpW)K*GErOT<8CxE(NW!5FwhXo$h9=53p>b*# zvB@-;*klmNU_exn3aW%jHkec*I*f~)Q;`h=CH}t^_Sr|>U*Gt>ci(-ztE6-G+G*{T z_dco9`QQ)kbUMGie&3G!+q_k;EOVfrOpr=5@Vqs?!pUzSmiG|`W` zzl(lZ_JPhxj4{^lchrxvAEDp3>qq)d{TL5;w$rJl@6!KuS@!vRstjDZ`enP{R_COt zejn;bd6xY)Iw$>J`hBQhT}B_I-&?=mLBAiWU$)D#A0^oD6hF%NeVcxy-$y@ak~I54 zI)|2|nSS)~L-eB!N6JaRuYR<7son1lW>yzh>(m-_r3l@0Yv zdLoO-hd)H;Kl~kKf2iQUvwlf4a7{dyI)}H33&*7OkJb5gyQK9WrZVR6k}Ul=!GENF zFX_sU7aY1UkEB`3{3^;`n)^>s*}G`=y|1+U!=o(c&e%DJKjM|LpQy5Tjkk_=FY)$| zjIzFtIlmn5kBUBPnkB9O=x7JMvt9D&kBPFE=J3ZxS@MthWuKcUdkN1!PG#?!-%om> zUC!Yrs|;ILOY-v5UTOEoM?2`1G}Ec2KSBS{;-#{m z9%V0$_cLB8+eX<-bNHDmgD&V};*$3IPZW%~*ZfPm{7Hh-j=I?{Y5lXJP0|y;lC=KW zI;W4{O}`&@xmQI7X#L|Lu3$)i70Wy~qt)$`j&Smf={m<4pt{#>0?H|KyXCSC4yPCnvR|SyWbmave`&OP3721{vJdsE6!j~oqP~KU~8%0_j9837wDH|w5!Yh!m5lp)@6UuD`kK2D`kI)%9ty3LvG*? z>8K9sw(@At9E~NRfa6q zef~97*)^>nUn%=*Un%?RsxtUrkM}EIDf{cIGIXhK_cy#!_BU2#I&HQ4o2oMOr0(-? zuF9@y_P11J*t@#jQ&omNtjqq^s_dHYe_K_C{?zUM_NwffM}J3EcFm)|^Odr{t181j z)#Lr$RoQi)e~-%01$2Tk@WB_7{$BkkOB?dL>OAe)AzqEbjCNV}59k~kclFCY)Asy>QI@#SE^+yXbPoQtuS&c0s|2U7{LwDcKdck@_L4pO zM+9eXX?MXl$NSYf$7iCK^vf~l{*US${1X?BiOWBx^TdN=jmtl-Jnbw-(ea}yMmZ`E zj@c*evd@1)=ZQo1ow)pyDnlpXCuPt*dHYZ49KIwynQPAPpVs-;^h;Y_H0=tTN8`qg-H&X}ZsQNMSU z{Y$Tu{mUx*P`{iz=h^4KqI2>umHn%NkE=4yv)!-NIWz=+el+$}rSIYkFSIYh!m3^pR_Q`pU zch))iltIo@2LD~1f23d11zeIY|K2NQ|Nbjw|AETrC;R+R=h^3f_)6J-q%v?!JmG)h z`5SZ&ud`2leD?Vpb+ zvj0P6^pkxuUe5jh)H(SqtLgH836A__8S~F}zg6edeW~pK7W`fE`Tx99_5-h!{l6*$ z&zEHI{}X(oU*b~J>>@b&mu1!bK4322p&#?&$9bd=kj39aztl}+JaqE|>|x!GxkmZ` z9#c2lA^+J9AN*bVB`)8o^PuMk_+7@!GWy6eWawS(u+#5q_d`_%o@qlk&pz=dA5~@0 zDDi~G%qi*eBbwOe1N4XSvaH6FScox_NAwXo{Q-2RZq5(7Brfo^ZpV4HgO~4`-;Yrl zb4$JDJap`X@76i}q`udEevjbLKJl#iuoN7;vt2!hA1gR>$aeMIe|)q{dsowJ^-8;+ zpfYevx^SL!`QB)kW%YPJ@s)P#SK9p~l_5(hpUge^{*!eMt+R~rvh1hm96qHiah`bo zRGsI%kqg>K`rt+<%qjb<=l9bDzouu`8-DQ9UupLg*}HV*XR7R7vh=f51}$Eq z_0JX@JhQBp-JRec>6bF`HJzvI{v4enKN-6r%Q?TFt8-|PdPKcQAN)L>O!P}y(=Pe& z^L1Xg<2=#_-=`B|n{3Biv)x|j@1n~uP}#fa@(Wc~(}nSp@4rarHC>oPmi=O#f2d#b zo%6)ym*|{+63@ENUn)5LB(3W{f7vVTe)%iy?p4Mday-rx&tIYQdJddt*{{?&^vpRR z^D&2S`?Wg9W~YCLM?XkErEmLn`g>Q|Z&29})-T)9XSVx|ao*Jtxu6W&ru1#UNq?-{ z_)!L37(?mXezX4SGH}eY@7Fo~XFOkz_gkV~mQ{23_FttkXp!>Cd8BXuH9A2DQs+5F z`Vbm}f9eDC41M?zI#Pz8px+~WVF;{4lb7xLUAO3Lty{nA*u(r>3%r)CVBig+{ z>kpaFyUNf7`pkCp$xrFS5B2vo{c?VcpYsF$uCk9*Mhr>6%n$hnXQdCnOMjfFoH5o1 z`YC<*qxA=0l4hfdX5TG1^v*tMpM8GMD`nrSGVmroNLs@er4N6#{unQDpelVDjQ-HE)OYHI{(XcGeuw^jL_P3fkBd1}^7#?`%eheo zPLV$PQ97Yr@{hR&|2|sloOU?}j)~_^=hS@(&z~)daxF}2d0ciJf*?h4Wb@~#YJNw^%ivO-!-F7;M%Vpl_ z950ter*nU~Ogo+3HfKU0U{9CJjg_8+h)|ncE)Sc_MKYs#?$t`j zb&MmLoR;;QIiL+}^G)yyP-o**u!M1+zcdP=&h zJBlocxQ{xKh@At{=?I&hGE=8}0e8CFTL@E zmlN{pDfn_Mq#53Mn=)rKoMhUeM#ADjLRAz%`CABX;^XCeW1h5*x}d6?9@RBL)r5zVcVx%wV%m_Zv3?jFl19JGC&K7KXJx7bK`lu>z$VfV z4OM$lxJU^_v-NsmJ!1gcNpr+NwUgB5V$^#Iwp+30wiXpgDWhh*Pf}#3-a5Mx9@sZg zPYh1uDqK%3>RD}wEn+5}Trk%FghdMq1!oZ6I@Ay*=HjP_Ehr*8)`2;ah1iJNVx}Q5 z5Ex@S7V1Id#)OYlFWOPNr1?hF%hcP+5I#0}gUbS0Iv}^1WI-d@paB*UFPr`dV^Ope zt#XNzNHksd&Otii-SC0BHjL^vP$o={K`SIQj6`iL;4ab95gEIKX)dK%lGY>haWtxg zkal;cvvu!U!S!;1+3(xGJHHBPO790B>|Rh94|ft5quYV9@Oh7mKlIa3>7+^>3!Uehcw> zE;-+vx}fUPq><0g6=v;YL3Eo%r=yC&^K~i4+yx<+f_Dj_Fv=t~ z3JFH`!mtRf6jk~UNfgpAoYE{Ra2oc89+Cl-m4I=f8Pv$xA}WDTg@yU#H29i(ni{Hv z$ePUMI5WXxf`T{V-&NPk$5b5rR~Xekq;-OJAagwcGD|`@QfrZo7tlmqqW6JL(_@Q+ zi6w#=I$L}1Qu)A6`J`zS%@-9wod?1_(M&m-sr(?HYPs?0Y?R4RGK49DB1l!tmi|OCj7AL7^FmRput>Z- zcfqzWf@XcX2~*~g#T*%sS(xp%Vzzk*APYBGGh?3B8T-2DV9}33`VKi6Q4BJ(6`6#H zfeqr(yzsPP=w4&>7IRVGhJkB^f|&R*O^XzwA$>Y6LLtJ4uWP|WHb**@NTVCUa4awK zCSQHIht2e2JcLe?KC`AF_+tavUmDASmutOj%(1_LOxL1esU&KB1HmFmYzupG`5j9S z>4K%m!dMWD?CJ6}L0uwy0}f5rdjBeCdrDoAxA$&-6HrKdawk3O|R%u6DhLTDO%&5#-!C0 z32#g?v!25NQWw2!((%=-h8x{HYOC#W zY;?;F1-*F!p(>7HD$T?&ifKK%bCfN@*&C5V=@?WG#L{6Tp1T;M*Pl!6as_5UTc>4x zLGU4!`@t4g5Q=;vxjI< z|9m)2IkwV5-nE?;!*M2hycvxft#vP{o|{zgDWI1jHFxAI)w5fq>7pb9)c7FPE-H>< zD}4-1He9OV z4_pP4qXz1uz-9+bPwt^)IOM(rAX50iF1;z0jTPzLY_(pyC=aosO`1eyZ=z0Z@|lBw zp?13C~U!14@RIhtp=-D3lx6WI*(JYj0<|Qt6FcA zZ^^K%#O?8PJm`{crs6TPp-F%mDmiB6(f8xA@y{d=Q8AJ*d1ebqqdjA41_YKtHL#Mg zrcOW*VL_0^2tqQ@0~_lI;qfxO{&~AY7>_YmwAoT&BOcIF@*T>EQT%x;>qg^S+<>~! z>T66vT+@_(R#}@fUMyLN}Z>bVzc0A!M!BKk_I?; zp~T4UAcr}Y@!G1HLYP!aTuzU7NL@_ZPRXVi7yDQQsxz8vW2<6hU!8Wv zg9pDDF`3eQKIXrt-7jC#734m}iPq^oXLA>Uyv*!>ipfU+#)boo4aNP-C=gL?p|Giv?u7JTzX!huk-|*$}F1cN-1$&_a?fTT@V;7R>}{amoo&T}c8T z#sLTuUcK=yKF|O2o}Z8Y9K%_?;bxW(>m;0_CP9Tkd$3q13HpJ$lW>usfNs4`b@3P<3%y6jyyY&wOtL6i5@TgO6)j_c0zrHZCQR$(l{H&hW%p;_g@d zM8dQ*HPuaHIvKZEMI^m!^wND=RP!puno_N}MaDH>XJd&1*qBH%(z`r2J*w7qlijw8 zm6}@5&wAT^)ebEvx@z{SC{ABRl^S7`tA>jRWy=7g?ft{!K8*n2LE7;{p%&A-9PUi8 zLJ}F~o(f&ejT;*^+|h$ldL~)jCi;`MfQqV>o{0}d(m{=~5oyHkDPyfp=fl(et}~|b z!CbD{BKRjH)^c(3SD3lI9I)tqx^VGrX_4oIX5!MpU~__!ovEP6<*)^wULqsW7jA;h z2;z<=9FFfX?$SqZR$Nwz(nL)f@pqW5*uovp z9@7yM)t&d-J)AFMYz|WZ5xVgM-Sw01u6x{OOYfCs(Y0Qi%v2$q)nuSXxdJ7EvL-Hd zU=X4`C%1H0?M3{1x=l*Zp4LkcXb^WhIbfkxhc{|1krA1zRff2Ta!p(95ipUTg?ZzY zL@zTAs6fu2)<$63C;81_K0ZA?VT!Xo)GjGDCL|eka=oPWYBE)tNIFBgs{pkGtF$hL z0Ao)3JQ`uMM%_BMsC#OVxT!KTo>&;4vk1!i?QuC@x)l{qNPJCMleE6B@UURk9iU<7 z8mYRR*0g0tC7op$0I+a&@`%0woV(_qmIeq50+IIy=+l{!q^S)MaxDOIaa(n28x?+C z>h|Vlb8F%#!K)E7hgJhlP!_=5ZnwSH(acPP=|XZQRRR!***!=73Sb*Bs~P|Uus_+v zR+P^GySfIFXJKoMvQ_>vpvFjB_(Sg8MH~S%No;BXaD5Qc)6=?Q?ez9Z`&N%zrc1JA zOH?%Wc_OW_MwFK(*j`pjB1G{c^&n9RR^1qGUvUshQw$$31M&6KEV5eTy=!>v?pe~ zC^H*kYlUOh(!G-OVDfZ1KRi4lYUV2K)*mvK+(d7zQ~=jDaL`R$+Mk@;0H&W((PGaV z{R~G?ON#k^0MbvBEQ^`|Ky_bTEL{W~ebbDd$wbhK7-Clgporfylhj0}r*xWtvCg+O z07bd00cicH1%QR05}+9!>Lz`S($YS*G}d(uOw_mnOq4%XlcNVkBBci9Fb}|}+vBcR zC0RxQnb=pY0Ul(gejamYtF;+9_4QeHakl-8%*i$*ntlmDJM*_>Ya#q%v!}r@Qn!u9 z{-vz;aV(v0-Y-_K&-Y|kJngDy8_7!_J#W&$BAAlzwYV^EbKx?8>`k(4a^e1=_r;R^ z^$F@;2TxDq_5>F%WY2^emW+e1_x$xK6&LD(#07Nf6>EqJ8R)n*p zlKHBYKNF?ruX5~;E>iWuI7SASIt()0W&(x_d2jjPpv|1|Hg;#@!sboBN_HF6bv~{T z;ohzMy1#0ER{p-{^Kt!G_$*+3)F&9xO{&ecu_+YKbgna}?%jh$4=1^zo$*=XS$0w| zM;R)YM4!mCi|3 z${w7p_8QT_5bryStqG+)Su`auJl^lk?)belDU`!b&n~%fLMR}q9H+8?3iVMm`^T` z97HHtb}a$f!>kRZ09m*h8XO}ETD7af&axd!!^;^DlE&6+jqUnDiYT=-Ra@)DiU$zW zwhnxKksynceEYS4*gx=DHXw_a)onu@znINtOH<3QYijZ}2w8~GyUZA?d>K?`OFbKH z^;FAL=b75-g+;0~>Mi>*)M#SqUOTqD+-5)mAEc`7SbAsvBbmj%QLj(6kaO6Uw}Scx zg^9C8DG_a%^m*J8+s<|oIv{70Mm+5~>u_CcK)>={jHTTZaav-s$DaY=y6gxef+!kf zrj3Z58a-jdy^hX~ni`MN2E+m->7aFCf41ABFtLIdx^d&1*Xi7zPeP!o6C(Mgg_I~4 z40$TDY(NK2`z>KJE-Rq1h8}-(j6V`WeGw?7)=n~$#4ac;$J}s4XE#l78gvh!N;`yv*MaTq3HebA<60Fk%WMavt>335JE z;~AFU=zLqQ?CNL+PKKZTp@qj<3!kf@Nm0x@2yCpZ6|pm>LQ4~0P{rrEXzkj{Sl?#p z8ooEv*H%a4Rx=Is(Qkh$FjL0o8p)=1iizr4h37hHX0>$XwcvNJz|_X^YOAGPW@zc< z(ww~vkteiH!me>m)dWN{u~0~11k+SP&8~FQB9NAH#z-`cREU}C+1NUDs7-k4o~ny2 zf6MGZ6UrmuFO*sr7rM*s_GZ?5cF8UFxx7VQ28a#0!#{NgX7d#1Qk*Cari5H>sRV=xdC!rVnuYS|nSmmTd&Eq`>vyl1Ip zs$)$XkgafNT7kyujZrI*shFAqDw-x5YE%fGg!U_TPAb2<{9!vaVXCgtO*L8_WvhIw zJ}!sFa5&jCFM(0DOkz#Z5W)JYU3nGLgYfF!LiH`0%J%4H-GW;XC0C8`4h*16E!n~* ztUArzWo(U;N_5%jx?VNCblCVz=6Fvqy6IH62q|BqP8eTwk|qkcnh|`xUgr^#p}z!1 zmF;0bQ3i+hbh~pU5&4;aB)@V48l>_>PH$S>y&Brt?3Beurnf2o3%4yL&&i^{y&-KF z(#~$0yN9k_9P@jFedA~#zft)%xM8A$)w5J@Fnw7zv%|EQ%2x*IOOrPf8zu>JU2Qbk z(lbmo!Sc`?sd-UsiCBR(kZIeq&1B)auc*ky7K7iQ8l}dhv7YMQU_+I}q!{1xTFuTa zU??mF&e%O0yVz+DD`I;pq6Df!VVN6Zj7>|f z0v2yb7a3isgSZcmF2YKVbsGD8bP)?h=#|K8I>bXtB3s!^WC3lK7@C%iLb@>Xio+?6 ziy+VVBBND0@Vhy*81aR(kDz}fO~KZ>)q&moAO^~=wnz>ChO}t8BLJ&h;g^nS%p$7Q zL3tZaD~c*RLM57vUd*mP(`j(^n4}pjx`@S=Sgg&gWQ5fM&>O2^OQJyC9&WCkki{h< z1fT_li}u)kFwF;_8Lc(XmYb8u653*GMSsgnX5>~|Q$GQ|9jO;aqFAfSDT zN-c@n7M%$1R7?0y2Y0r{+mR)~1>I3-lS(lJX?kSn&;zh{+arRwCR-D?A27`rjY&y0 zN43Pzu?~$m(Y0M_sq`Kcj+la4yTazSM9#M0uT;UK@f}lX5)5uDyPM0}+NicTPHJvD z77U}0)Kxl!Xs$c@D>l-skx-MUxl}PUT91};4Azu#te3O4kjh2gri{Rtc~)ygN?ZiB zLN)mCBs?P@PaVAY)}~#1W|qarCi592u?=N6st6EKo9MV13`e%=)_ju=`&+xM>}fUB{%fP) z=6P!6mLmu!$mEUTMh44Sv|Gi%W*^e1P(wuDMNJNp)SAICJPj?yQlX+Q%3`JKI7?z5 zmlUaNl3F2-rFw6OOHzv&*3h34aj961IR4`b@ycm*rt9^%V>jPxhXDm6m3QaNyIUne zTr*M%i&%d1o{T4xv3O`#W|?w1S#<9#-KQ{&Zg;iVAPk~I@n+;>iO`BAFpNsI_{t;k zj^Ikd$Eq=czl~v1-?E5U*|c4pV-!^q(of%J7soo88UpG&q*-!pBTyD|U<9O9JrvQv z3-@iDMmkL91z%g2_J>-G`t}5D0g{dBskD`f2(_T1R#$JAeIfNG^Vu9M&07;l5FXo1 z5IZ9a(V>}MxdW%&;wE&jKc3E~iT{Ml@g#dra#)#Q-W)onMW`(vtG!0XYD34^{Pwklku(d1UC(J&I0E{L*=m zAFJ3oYvG{fT?{8G@%mhYi#^btxoN$VhC(HOx3!<6zGpOvM1E9@_f_Q4h zQAJu$R%2!;`qLlJo)W0%7$|g?6WDsuJ;oJ#Z5` zi4Z)-Tp+x2HD`PD*~*~MQK1KKaG+v0UVhMWhO6Z!nQ3z$=~~D*5%g~ssOk9*nM3(A zNr=!e$;2&Th+HOPx)OD|QxTG=tTKTpOdYhz;1ohIvO1{|!!6gTc;L_doeqYu{xeZ3ufy&M;- zKrJN&Zb?%Ih&a`9Q7}!Xtx2B((3{QXM6}ri8>qBQK*4hFHB2%NyI2#=eNhXm2JlRH zP~s7^z2T0RE~lTch{uGs@Rm+tewiTvmI{UZ0Az;SHE7bR@vIM|y^JCr%<)LME}-_@ zb~52rsCCQ*V)$A`G_~2^@6=vm3Xz+)_7Pyi2Htc_=?aQ@cjL`^MK@KF)0vhz7HN10 zP<(!Xe#`>DuyU_aGTE z@h|pA1By-i(INZ$O5`j0*nDL1EUNO^ zN@k~1w{3$76bObs+`|?r5;nI<3wIbhzqGD9(56TuPvKg)hS(rkZuV4ySdIm7g_8IH zKua7T2?K!4n{DF6#FW8NRg~BSZK4zTB@8?*l+3mp)blou^2ap7M9aHDKcvogNL^^7 z0g|=o_4-<-j>k*^`_rVO5GbsQe|QOZE&|vBX?zb4Bwm5<8U;}_mlD&pqBHw zRwL%>OmJL2YhJ;H*;H@uc=9q1^7bMT!#Q3^uJcFfo8}v|-ite3?2J9A9&$5Q-a;mI zLqfz_-bf9;De~zG#qk9Kob(o3oi~HW$5`(n=q@(!+(j5l1#?$dFHms8NI%Y)y3_fw zNUD1jwZw{H)D+=`Jrhg5OlQRkHB@kgPxWai;j6+T=CFvqrc1>F(Vlb+LSSI z4cdHjp4VQ>;)>1?e~hV>z0`X}o-7_(#OhOEEuix&9`QP%{%ACoK1yt^Y==i)Db3Vy z{Z4s)Z;*w=I~ICA7S(;3_GpPhFlt5AR~`h!|4FgEH*ksOc)T`^6>lm5@J|epjaTb___~#oEm+) z5?a&=?u-GgY;Bm_!SY}FJ^65u@l^O`Zw5Xi?}6!z;&?Z=jf8m&Iaod6d_A0 zv0WXBKbCRr*QQj56^Hu5o)YW{!YW!24vK=}gM&bbog^*a1Q5*@WHq70S&F<9L>kY$ zG>hUuG6oqd@b5;fL=1xDzr`RTmXhfCatzYx&*t-4W!#^A#h}_FlF%txe0sX|9aI7s zGel-F%?3)~k?ja=h{Nyg+C}lO*yR3Lf8L*ZuvnbGv|7H7z_JwxbGT*0rh!P-+Z%M$ zX+yxxX5JnPt!m*jG&8(mem+B~74FlGyiJ)v*EWm}Hy)b%ZdJ912@O*9CaexO zhn0`f*eKQZC!(ucN3D^)Oc+|+Tb4hu2T~}-_NTnJ1E%U}M8U=Z&PX8sViBoK^CX5^`*D(z%n$z68m@Z zFE+Jm|IWz3nmG6GsPM7-cS&S(*sa-Wl-82TYP57IYZOb6fI`9q6n7}@+dg6)P5DkE zQ!M*;AY!X|WZGf}{MY5(`*+Aeyy@5X?>yYd{X6im{`2p>02CCJiP}I~UB?ztr#GEV z5jFESXqJKk6Z^c3?-vC!u0r71xwzc)d*j=?5bl&3BTr_mtQoh(Ln|xX_=e<)aM%WO zFB#y+;cPY?M~#6Tw6IHleu3U)y9u zUcPwZMW2>%JEYUrahsZ?0dd{Y7ldpbRP)xp&v1?oIIx6hCTiBTp}Kjh!9X8*wuJdQ z;}9QjmW!>BWu(}eAp`Q8A_ouhj7kGu5x@5Eko-i;GmeqO^x~NW`s7)yd>PWW1mYu0 z07wH1UHx4Dnoy6efqLunlMnQ%u=)&@Yi?jPlD+C`pe(B(eas9Nv#YLe!-N$rJNN?n ziZ1N#WglJim#gKBb9C2bL=t$u%+R!Cy4cuqVrlqN3ciea$Q1bZbvlPmZb$6-8M~}( z6Lwvky9e6lmGZeeUNur%DUF&U+DZ>5Ic9L@tK~dtu&L-LK{}lWU{EgYs0%IJW%SZF zfX~k3!a$RSu=IgYB@|wCx0qh^_1K;=Q(TZX4#H1k8byR|> ziUnk${dNI?gpxkmosFp^o8j-1D^f<-H<1!oN-31|4)tb!#ilj3C@wFQodo(ew@%nt z5>ze7I8-x;u(PB0eb%n+>3rtloyH%SJ>1A*vM7pV?2dI(1saNGl^J1N-X;lXs1L2{ zU^)0Af@*$@ES~sflfDO)qJZ}-EXEcf!!waa979SVq|mpI8LGKR$rlG7Az)WsiqmVA z>TE%Eb`>N)a0Qy%?ss5hAo0^~CpMwcv{W5gF&(xE3kzp9Si5AX+u$~a-H0bFV&Y8N zq)qb*2Y^En4pT{N61}tMEeiAWAhUwuN-4__g7`w;-5Q~(oDE{D2?Ffw~9#vV5iHaXYFHzMJbo5R3kVhm@ zBT5wh~QM0NQ_% z7C_UMxOsYR0YK@w1>nt@#lpR00T7h*Jkj@a3xGg0!eG_ZZ!DIh72})WM&2w*>t2e^ zSXCr?o_M)4Z5oTUzZ_5v=o`s|tkDBO4Y#ukZdB?j%FPCL?D-W2iz&1jdwpBiz^BYe zB-j9XBRCbx=KHBI*griqw~^5xFuu*N0t$7lXQoa2PYK$i=#*;?r2!a1m6u zE0&enh6o6VpMAQ3wY^K5cAJ%{w%d zNd+%BjrnjIoxXgE#fiF%5Oo_Hh*<2Hx4kRFou>v(V~13PsgeOb=hTOdT{W#t`iYAv zyKpcD28UOXyh1(fEX|Tnl9v3cfN&QkrVzAC{Okh}w|YU$NJi}02gTK>^?~vCk(W^J z^+v=MkMe~8VNXM>?bJCq!9|zQN6k{S#{z#wnpMqGW5uKNGKhQ#vANKA0W-``pRg5o z-7o696rn$375iJ_>mW%o5xx=nN4Hlj{G{xjsRysy7mH1H{1wB7Icgph+3KWx5l!L! zZ0TC49o{`A&;6PhQY4$_&pO_zj3EAZ&8$$FahxW?~k z?w#){!$3iIG^y-izl4aLUfB$gjp!2roB}PhFlnZ-)@WF8jOoS}As+tlO3}LMaH6WA zF}wwH)v3_v4jY7rNtc+?^A_Lq0?SGwB8!_6XBb9$wNVQ*|FA*<>4R;j zNg;#3!Cal%J3;MZZpx5^w9T7yJo(sz&BMU@8_GAKM2dX;gAD3ll@Qn*4|+kPIuC_1 zFOy^Poq2U<`j&Zdzg13u2vnAn$LeL?I3ucL-smY0U-0Xz!Q~*mI;a&}_=ujRTbTw> z9Y>ynxtZqcgZb{CuC9NcygTlwGj0axpvP zxP&D8`g1v+-yD*=5~)<8lm%%)>&AKEfDUDGpd`Y(VJj$7>l!3wGn>;?(oCO$q+oR| zBe5f1d$@oUTdp7p5K&SXMn?H$BffydCjvp!^aL>{wbNU3Lwg3=c`M&bJ8$&OLkZ-- zmlhzK$v$OpSkG>-MxJ;B`_%fJ5eG`jeU8Yd<#ZmEnU`AvBE5;lThWzkizO6)~h!O&1N-V(^FEfP{B1}BE?hiVboVCYR0Cpx*@ zijaP%zHE>ZwU$ ztP#3_IJ5iq>UT-+smE!*F-U3TK}~YV)c8fxjIdv=q%r(MVI~B2qi@Qwx_H5mfzq{c z`&=;pHjrW5`7H6ZaJ-xCb_hZ%Egv41D*IG%xoCQ)88I~vP*mdiJxFR9mnIx$vL_mphnF99HC7>{OtED>}6l5cT zQg>p(QUFiK%cF;c$3|q>={r4I%qKjuCcM(N5RqUj$P+YssA8+z%V}?ZQSJv-8JKT5 zUY;ZoA_!u-U*4Os7wK=%2hlaPRHw|sx0K~h(MO&UP-o%^We2$6x7{O{*wBHFxl3f9 zL~;%GF#i7b_6|y)OVH7%TuZlm8_ik$Z&Ow}{nfo5J7f|YN|YqAn#O^by%H%aJhIJE zP!m#pu~Db}8|z4?$kv4^*xO(4`tXI%#z9(H3OilfMbEw6v`%$tfxmQYb+)~L(WD@* zRy~)UZo%>Bj{1-RZ%7Pg4no=1?acj=sWUT?)FY*4$j~5JxTy{n>W_62_pq2hhPIk@ zPY1u*khuv7e5E6y`N3k>6o%B9Xv0DLCSlHM9AZ7`_w72b;4FqTdRHUJB%$W%nXn6E zL8RnJP=se7FDnG{&H@;PRbhHIeGTrnaqjfo`17x3hVrO(r0ef`mX4VRNrZ@@Ja348 zQIOcv%bq)Q=WZ?eBdKct-Yk=DfrhYc%OqBdeLKNx%j8;M zn%-C@I6P-BM*`7UCO0f=cR9r}2`XifmaA@Kndkw9Hq|ed2`I_9UMv$(*>jiNVwnUz zVo~rI64S6u2E`o7Mpl-|OdN`ApHWWB5q}UN6R!C>zR$KG#;7C zK!dAvwcB1w2i?6ttA6zl38xRo(<5Ye)1fv@QufVWaD`%P!c*HSICrJ0W=o`XjAhNF zlYQxmDXK_4z`ot}c#c$N1*2jK!{O`xQ`iB$#ZcXrG`zbbYO9ij=1NV(oGS(VY!IQG zvEIlvO8h~4vYkGmzv%Z!)1CCK+H?tPMc2@KRucL=o>C*D<8 zH}%IGJ9Kxy1s4NpXq{kY6(xDm&K+}aW&+Y(S>dfx$rkydAADK)p@Iw9u3;Ff#-2B7nc0*lRAbD?FV=FEk zt3J`7}SYG(+A+!W!P`1G-HQ%TB-E?0t zzJ+GzI?k0hR1|sesQcN+H)nV`jIo$9oHhlWntJ=g2KGd_Di6nF*ZFt`H6ngyVKf?* zO-D&1Av%$V4oaw^<~G(rV~`j}u9;DH2C&;=gsU*KAYDMwj5RLq%;?}jxTr&jkAs#h zE8Y?zZNCuCSP%|n(Lc918VU3m$pF{5;PQnn4QOaPD}-gJl(9J$6zr|ppqM0~C2~4i z@Lq_ob#U(@0uyzp-Hr~`{=jYY@4J^H%ohxo0iG20t9rIRm!m|Nih*CkawKu(-rMEsH&bh zsD>5Z(pYdMW#M(&1Hl2MMxbbq?kTm~3&*z)jE9&bd_@^BVN+2pkH&$l5xX4*GgBaQ z+f#!|(J&aF`vc=KfDY^}my1II1~qI|oxrf(NwzXPO3~G*P2*IH(t-9H-K-YKJ5LDZ z+$J|w-h@^}O`~oW{!!Oza5X6yc$<>qf{(GR0DWK0Eb3~)S5WOaC>P6G?D9NC(zuYq znnwd>jcnok5+?6gXs5EZ$6VNkjM&{i4T&5|1fbNq{DlMDj`dgcQAS_Uz}CZzq_O#B z^Cl9#%H`ziQJS}-`A}~{>)TgQ1Gi_SgVssVZ*8HS9?ypxLX}nCSyA?iaYC5uao=ybE8W$llZ zkE|jVzmYJSD9+>17*OIr<%rxHv)sKuKgs2HAI^Ebw(0u$*_(X6$>%HbDS=r%JZ!Gz zMuA7HzMB$V&g4TDlH4lYU}5K#$WpdrX|=in%4cmQ&sRg;Gti~#kW<9I#9vwFTXiok znkwDO)>jJ2)g47z}+>X2A zHrvS1s=7o>EmzK>h17E8(tAto_|su8#-G@e&lZ2OAfa{QVS6taoM-W;7ScUc%-C2} z*2;cii>B&>?d1;mtNZhEvBS7cN@x&EAB|JWeKKgRWIS;C@h@VZC4E;=&G04V^ z&S-c(>#rVd57bf(rIx1(IuT^4JIo}R6*T2sI8;#iINOJ4LC18!%v(_Wl})h)l>+-l zj-dHXX4^DzlOSlOIbP6Ly5JItC#wS=28c9sx=(NUSmk3pmY}WRX1?xZO}Da!n>FNSe%jP#!1p^_CI}l+X@mMjk!pkDTuT9UY&F-b%PnGBMQdsa zsVj(N^9u63PK)9;7<6@c^RXSD41pbnAlbqqtC*Hw4JN_7n%Gp3yv)URv|5|v@ad25 z3|)4FHQk2??uqx!kK8{epIaaP(1x=4K}dBrL=NmBfr1yDFGkd$y}1OdST3(9Gf?jX z-q^^E>GmybUTWQ>(P|Z9-L@6(O8-80Hq4YPRkw}C{-ta@yLZwfRafHo^~|P8 z>FIVjWWGuE*2^Z#ZR%A@b%y87euSCUqQGJFp09<1!n;Ni;NsX{0w#|8)C=tM`oY>!Y3cL$@z$*~S*&^IT0!`99D z*yww5Sx;#;>5aeNDE^Mly0f}mHZ#lLOBN9=G#AgX`=z2SGD}64G3|vdUHEduO!gFk z$;88+C7rr=5BGZ0kUrvf|FE->g+$~2mC2=?8NIJerYlb?Pk5&%^1EnNCVxIQaz_vU zJQwbDF6*1Ymo-dc5n(15(8vr)spN|Ukyl*A^gc_o%D2}1d1Dr&`i#uF5vxwNz;mN0 zMtC6WyD_d@XxWUlk}8fl_mxwh8#&Evs%+Qhmzd?YQ=ajSSwWj(DLxak=Dx)|UyA&) zX59KhBr~^71H~+?%shM-FNk3EoZiEkJ(B*@`MzEp37u*q=8Zoox}T3fowaTsv-^?m z?Al$dLT(1yM?y=g4GVS|$3Q2xoHpAxd^9ULym@#i%aTM)M?F?ouI(!@nZn>SlR7^O z_Y$J&{7Bw+ZafmVd@T4&d0b;`@@4m%6ZhqV(Q56*dSvUC-U}W3*N8fA%VeO}fe6)Kyo}PA1vvNuFF|^;;LFzhDK#DH=$%H8xZ^xXNO=nh|xh1hNz*7PsdX~iy zJ$A?XOJbN!vNy#PDW-VO2)^J_SI7Ymbyj;S>S*8Ir4)qMOjoob*WM!oB2RTyM`N`i zj~c7G?~C0V@G1A&;Gy>6;GCM!e>>2h2|O?wjM%ix%{Bx_6WHhwe4&cOo7uUr;5e;1 zl#Ayj%y6qe+C|EcXckU4->kr}Lp^lR`W`dD$JXjr0JAkCiXx5Zy3iY-FprmxM-?H^ z-lNonni~eA()Gb)>~Q-gV_$6>6HLlpCs^^CKvjE&6AHn)Hk|E1hYRqO8&Zcr@XxEHQWDh5+!;_6Ti9=)y=3(6V?85_bDzAD7#mjM1bh4 zC5w>ldYuCZmc_C&Gcl(F7)W;w#IROs zHxW1heB)+y0DEm0lyP^LlO#S@lRjVlH%T9^PNfQfpjFm8jyT9YAZr@OvU)UV`FSY0WYr zU@xl<83$QHp?1hshgOm@AjmX7VMPy$O31~kL!<0e0K``vg!;@Hh}x^wCip2xcxz3` zX3eSt((~~OGs1>9Mv5CBY~uhTZf)VE6AOr#fPJ|~M~1eW7_{nGD<4y%ie%N+vDPof z%v`81bsv3?!3LO86v^e=3jxKdgWrM z8pHy|Y|n9d)q=HhTIHx0QDRTm+_I&%vh1a*vD$&E^~=}E*I%yqmd(eS&E`*N9y=8? z=!G1|VjT4y+5=*Ic)`qxqzYY-Qu&u_@v|;l2KC!x%G-j>3&R|~SFPnEbrfN`QWnAsqwld4PiTB zuP+c%Oida#Q%T6qcu#FP3;;F}8NoFLlj8Oo>ChI8-iAOdPT<7*0{{&<&JJ;OG}D~{#*b$@qplpT8fV&wr#31 z!^+2dfnrt*Rhw!SX?&?+FX1ds`PNiSWOS>y#2xDQ6d6e%LB7?<$PR$y47FJ5X3)0} zN$u#$?ng8~#;vDj(4b>DN39|(Sc3<_VX^3*hL}a$Ju`P{LNp7|2u^$O6`-*Ixe9cU zNm)km4q}j^01o26>;yZgFHm_Gx`TY82X7l7dxBq8k*)xhDb!)ZQB#V^okM+^C z>}--R7_u)i4-;Ya$hDubj+f(od1YotD>f4ryeMK*%o-M;Fr7iJ^6<8l_XZ>0TVna~ z&iF=u$`4A$@~k=}x(~Y*VcOgTNB(Y{IcO-V#Q*kjt@*RXx4TQ>sV;vrg-L9XYH7T z0sA+b_ITalbnY+1R{0zM{1e5H_%rfv?5`(F4p=Zy?v!w+r_R$c5(KaX5{pu5-`G8) zYwJJ?gsB<}Yyz=~FAI!r?8Uj%>5s*~RGc^deNO&OR{qMfu0O0{-jk0W-k8V3G?Na} zxt(aQ;uU6`gjV^-&(=gfrmy*(i(dJl2Npy_AnV?e)DBtIVH0Iu*+i2kOqxQmT{wNUu!E?%(X==d_Q#@oYB6+jOV187d~0 z*$0Be)LUByhAK)kuM*oJ__s%o|8#cCiU8U0H}AV8_0TutFco4=i8r+nE-O{P9g6V@ zjvNnV2&-%jhoN@OmV}Ind3oEY4jwr1WxQ6B#Eca3MY2yA=&{#XL~wU}M5J0966X=% z=4gy;M#h%Ff}Rb+9}~9VjLF$$7@(|aOi013OcgVwH|%#EIsAU7r_Xd5+7?=>{PM6S z!mYl7GAB0mq%JL1)aQg`(yU!97JAFoI+Sp{TCa*e2o(jJ<0K&O#I*|y%Vs4W1t#Z|m>xo_m zS6!@xKu{vLB&-I)wr=`!Qbm`2gvBSnU*FuRZ&39KtC^B9aa7n4%LWO*%GTAVwBU2Y zemJPkg7iMP`Y7wA&h?X{%pxCMpnB`6(avN(n>TG$O!b!Wv+E_TEdkqtY~K~iysGtu z`q{*ao*_NWHZ`p@^3>EmN`o>F!BG1G1gOMR{h5phzgh#rh_v0#fLV|xp%%e?2sSe$ zgL~`&+*K~xW_h&5+R>i`6-9LgTz_@)r$SDlyE;6@%b@~g4%adTpt32d0e+@=*$Sm> z^AChmkcP;Op{6f(Z*~vTISa+n>rBqDd8niGJxM=WZPx4hJ2ndR#o%Hk)H8HyNwE-a zseu?*?Wp;Eauy0D{-RZDKAp{`S}a_<~0+5`oHMyz$n^W0vtf=&e*;ma?mt z4|v!)5zoX|yt10?>K{dDK%A$qm$zj4mlrvLY0amyYX&g5c4p^_eQ zu%+fcTigwAE*BQz#QLTQa~}LH_Gf*-#uGR1SUT#xRW;eHOa1NR#WQB zehvvo=QAG*8=ud|KEdD4zp!JU6_$=M)g8+VNfTF}#`>y*g+-&5lWYmsSC&>HS8o~b z=bqXH5yVH|r`IdxeVv$+L42u5O#*knv;e}_Kr^#ZBZ5x5XNvFnTIyF}oh|hyfX8~p zQ`aJ04KnkqT3kT!H1~y_GIp=1oR}F3eP>sS3?laO*)RxW{iR)#3yz1_o^_Sl~1 z?T-cb{?vorE81M)jXqoaH6L)x5+W(+t1e`yfr!fO>!aXibZ?JEq}0M^*xZ=wD|{^? zZH;91*`^E~Z3%O@xiNd~F;=W<)L~)TB#f`UfkUlG+%s6dmE#~$4(8jsE+N*khS0r* z<5>f&4wgMHu=<}Wf}p=sL6>6Jl52w!*5)Y*41aj(f2pLYnO_E)PpZuBEN5a?=F_kyUE(M z4$~|vDbst7a5yaQN;;c z{krfJ;)`dkOA7uZ{M7m4{}u$zYKSc>Dt@V~ceBks+E&eXWa0~b{@F|Yf0{4!@ohd& z&!UcZjAr2e&F%_A;`iFLc(|8>YK`zt?X7GCUSi)$_D#(egiL?EZc~k`CFSx;pNmLD zJfTi0^MxN(bm|x0EmS-C=Ws13Ezv1^FRkd*;yZd`AHt$R4ZWjUiB2gQ5Ms_UI#oRT zXe7v+?qIWKp#MEuE>cO6W7VCpsQM)Sq>lH)(DKbCI$dE8aQ7AoJ3gucEAR?KyXjF& zAf%8PrnjYfwehDI>Q)RLH$zbFm%*z0``iY$6hwN~YSCHVK)2`VtM=7J*dDZl_;Z-#DrUDK z*d2rl_wwnaxk*L!)kV9rOKp_wtBdYUl#8z}LP32Fu6%VdDLQE1Q)c%}XF#bsI4KW2 ztif2>nm;lP^*Tdx)UuL`cQ8+Vz41?^{Ji|L)nlbUGA}iM+!~aJ1K9fE;m(vZor;(G zcNR+Z>_m%6Q@O>B2glvb&6Ryd6yEp;t(&i&etP|@_c5Vpy_ZQIv#i_0GTcHi!HX?bi!j@OFbQcVhzVov9R~y?fYk>8&p9Y#| z8||!O{w*yor!(JUjb)=?>P~kXC_YGY43@i=gJmJ2APOsB`faLjw!Lg0QD**mtrLp^ zWfc4dI%Z%9%jC!8wa<$yYm+Vf;F7v3^>PtTR@XA_aPFvyrjE zcYirp$Q41V1~F5d7rbm(!|mMK>Fo|jO$)2!*ENL9V;S$%j@HShacB<<)nYYY%1kv|_D4Y0V3w)?%cE)*#IIFy797}74UfSR>EK&D@yZ zz@XXOB)tfP$?Du9sZ?rvlvMR>j1X9xBrt}X~9pE?nWjqkI-t3oa3IE8@C%0dx^JR)2wd@yy zSuR~?&xmv}SP4Y6TKlwCAg8d)8qHDaP}H9mbv0cmP=xv$tSDT zNvB=Y{PVTgd4zT)alOTQ*={?#-R+9|VPIsvCD&sBwMq;C#Cpk4wPy+BDoV1CW0|i^ z(DdoyQ5Nj=G~V3Z-`}nZg7&fl28)&UAUu#k&=12zM7q1D1cGftqET2VKo{v zFJ9l^#@c$K9;7tXp_aw)WlI5wIq}>N0T2(hw8X|^*?X7j=>cAhg@Dri=H_1J4@kAS zrvifnhpc9agSzwm)8X)VJ8vn;4c|GeA!}OI#50+nGEgL&aS4zGw7C=k6Tn2MHQlZr z@OW;)v&T4&wvSJb5Bv2bqPd}MTlg%Do*p7Oz}SGmh#~te&t{?5_@m3ovF$Am5=n$t zxBWHA=F?&r+-VD$NZX=;M{zB^@2N`LDVd#W)iFqm4t5D+*C3-awpLr~R-Z&2rANTH z$#y-F((TjJyx;4ORu4uEw@!3NGAoB=E6D{n9&-hHEIm%v+wErA+-bMn-9p60?QR`| zLZp!yvVxhYbVi9A#UCq2s#xtTYUvehRhUtw{^R3A&7-O)Pv7hql=vjJ?pw`{9nWU< zwC2lY>{0@@vF93#do&#vc$f0z@A?Tf2_V88d&^l3gI~L4!FAC;OJ6>|*)gY!8RKFt z42JwRanF0UV}p3xpgxI|W*Oh5#W>MPaRF?T%n_MbrGu#9*$5OMb87X5ieR*AI||wJ z^SM1|8aHX87q*g4$Hz^W$(E6RG)HQrqjOJ~PXn!1%Qd2`B)kmvZvfm*Eu`AzE< zJ{jm(ea~aHUK1$H*6R{`sbjswgX%?|kijQBf8%n?)9RJa^_YTSwx_S~?9{J6qF`RP zujUaYj!(w}Znpwi-7gr_YerPuvfOOe3y2>`@Su1m19g1`A20)jIv%_#Alta~3szWd zfjHzQag0c_q?FIG6{gJ@T_CK?b7wPYaM;7hw=LI2*qzg$2Vhdr2-O<2q9 z&A4RuHrKtaY9a*nE!n-#(1alrejmaAdT1N8&_dI$h;>3d1hSPP<6aKELi^}M;T+hz zM2$Av_KSkYX`D_^7XSHlTlVR^2_npFgz^_MYEW6J)vc`>V;>x7XxRj~pI1<~u14S* zYFpSADz>0ziV@rv)QE^xZ$qIc9=r|R2r5!tL8-IvhL~ZcjhR4i`})gdss{A&Md+ck zSXxxi9gY^(S`Qj+sy4;inD=;&1HS1w6qELB7AAtvW(>RR>3&8nqtSsaqH1Wf7HXh9 zb0r>10maDO(pt$Ec?NX={~-`H_0O9RG7QLNWe*E~cFRAvzbtSp$C zn|EB1ZSA8`Mq>H8*`u2VdXb43^jnIOKE)Gp4-W zLSCRy;{>Y>YKkhICmx~<}|8Si$qeRz6$ zT$i1U=Dj%))Gg^ClC3r-mU+5y$yY5?A-nwCXLzZ+sfXhU#+R|hvKt@KN^hsY6K^v1 z!HdgyYH30bPlU;>#K$$->13Ac{-H_MPinW1NI&h(O`AiRv(VWyi8jgVlbYtGP~BZ(^f|>B3)fgIsA~e65Qg!n?zG<)$MppOh^0 z9rt2ZV~4dS==yTb%?_VR`G2!yZPA0+60MTnN519^{eJ>W2D?cuOQyV8vf*lJRz?ri zgn>e-CCx~=$6#(3=J z^^#@l&Th8bwLcSE-k?EvMf$S8b!9G7SYQ7zE1dzWC~Cef1zPzvld2ln%Cj=+s6p#% zs(PX^??ioBczX(oT2{Xg+3LD)fNvB%E*bCbZg*YSP^ZDi0>U)P(dvD2RoFM9n_Xe? zn5>+7BwJVH(!_(nDrUUC$i6xqj%{0+{pk2aV4{?3n$*gqr$;dwJ>+dNSHfb~^4Gh{ zUyI{gzD=)BLXV4HeLIb}^Hbl`*;v=)oeR+4)8Wf!D<=N*X_@m(nC>)<0yo<>-Ft|M@?;+w7MKG>MJd;ul>Bbe*yDz<6eGOtfA+Vb>j_(G1&mo%3+TA5su)DoGCJ3Le%B!)tC;h-HB2+0 zo!y^~r)E*}a60k|o$3xK<$NJm_T0rThm@sDfs{v68c6JZvi#2lVeGUy#J0|omrb1r zd!yBvopl$j>}M>96DJ`(Td=XYl@Qx*w>u{iGVm8YNX`c_b+u(cGAkoIApKF z6X4zkW07xnUzCkv8-~9^lLnHCQ6ObwwXgbi;l+a+5dY?YAZt4#Mc@pl^HZ0)841cO z!E;TGh&_cvk=w;S($&aDTurP@Z%>t!+%0%l5U*v%c=+q=?C=`x|2K>DEo+hV%GD(X ze7;4F&bOFn!4+Cg@xEc=s3~)G#NpM} zNY}y^)U9opUv+E0hO4)@y}R4zMGzae1h02_mChWYWR;Yg!#HC}uYZ=&?|ZkMkw+R4 z=@`~#NyAN>os}~}4RV%tF;-Ndx1EiyKPsHuKNs|2-^Fe(tR4;#87?=t)<%ge^xiXt zifAaCU1&}1(;yi1Cmd;dhJabz@kwA@3cs$$#z7UyGRC3VOtAR@Gh8bCn1a0+teTrq zgdnHctv6zhEc7aY4A(r>3euPFjS#lTy&1{k0;us6V%n8mBNv0l^-(i3r|lMcW{732 zEw8_{K=uXz10FJ}P@ki%uE{^`vXV_xQi=H+td^Ca61Q#$_!QQZq}Z9u(v|z=Lhcqu zR-|OsJ-L*MLfrYZXXfkD7sl{B)D6O|H|AEw<#c@eq_m$FK&M}>)|a_Sr<&x*I4Iu$ z>=;_~Z=xlPl%(z!v_dAW z79nqg_S}71K-_$!yF;s5iC5Kqfaq_IyQ5qs+pim*Q6yO;mYQ`@h6kDlx5LJW;mVXC*gD+A1l6hkqJZC=6U!M z)76LgaPW@a*$TuuVt;hh&EF`e%pq0LU{nyJj&bke#!RB7mUFG{)6fj4+>~(!eVFkz zYg;=)_VP(M#KnAss8rH|x&`VNxb#W5Qdd1#ze2+orPgnbX3&Cz#x@Kcn)nVh7E|@a z+{}0h@hU_(L?tzHZRV43ow0J4+qElIeiH6lr>J8+PMl@;d53v^KU&}TvM)zZ^wM)< zVB*plUvC)2Qaz>CE1JpNmPVXFp4R$Zw83v7yiMvdt9lKuqK!6>YERPCE@%13$nkWz zx2FVDBGOjL!kQ~s!~UnGo*F@Bly=cJ49n7hqAdO8EUj;8LJc#)oL<40&P(;KV6YgO zsrySxR4_0!%UodEnN>1b0mePL77T=kHW+Xve>~a8a7g3FsrNKr5QP+Z1O^Rc=1Ob_ z3>x@Wsyl>)`C}IDsS3<*zBh(8FvQz!TLZHQ$n>&;8A&nDH4Iv%8%usTk~gh-fuzNp z#Ys4lB|FtpPu*uSUT-pIy_E%Ds8%D0CgT_)Pkqp;`r65eTt!q_Rc2~5GS@l0(LU4t z%?P72C@+M*++l8dHc@)L?8!p|7_2|ble-(3#mhVv5IiDpxHkEnjZfbCPaCCsbSL!R z7#wp78R1(a$|bTTeZBM0ryif!sm@CxWtWIv@|HqSMM@=)5U#}AcDwx^39Mo&oS>yv zpE#N@^kw44^dfZuUS9l-45ikylQ;VmcIVAL6(91ted;g$2FJzH7hptdGFy$JVyjoI z9@EW69DPXPv(-qgCg?$HNwzzmuSGc;zuBjna360EKi)nCVY@@63F~bm->`BSJM8Z) z)*pmYM`STr-D?P{q-*hRv7@sX!VVVX^=gRS&fThGuD{)n8R@5b79L2nt}J@EcFFJ0 zGKfVr!l7~O9t8+=YR2qZoFiDZ7nQHqsA)U%kh!Hegy794i%kq3)m;flsAkcdRp5_R zPkWBzXAo5U(5p78j4QWuU4Rb04b4$moTL55+szJ-f+iEA`x6vzE&bcxKa_m^E|*`>6)BvzGNpa9mm_pgWh~{ zyNZx%;&Ws;r(kQY(A3S}X@7Iex6z<`ZU6d9%qEgi&&L(L=60-{{Iz?5SQysBvJqkH z8eAR&ZVWaDHT;J|cplNi^VdB@cS`4YtkE&?IyjRngb_=+0>&v!*Eow$U zl+K6v8s&YE$HDr?z6@?W;<1|R7@{{`Y;Lx@`W<=Q=@(=-B0g^HM%e+i!NH~_7$!SS z08S;uD^YcfZ4M1*1T%!b>aVd9 z?7w+xc6)kX2P-kWwh|A%X_MH9^Ww*F+gOPbd-f&^LHF%XmdivZJN;;mxV5=6v(3Gl zY^o_ESt)t%v}32R*wxrcV(+g>v+e#azHu$!=yde;-rdpf;}mW?!PT+zkzjgf{x}3I zRlV@V=h$$a7R?2kX5c)VX{h7jVLP=BBSxUjR5i-xxbi9=13xT=!^!3eDZ(k#RMFTC z<9)i-?9FmlCdoHMYyGk~scPX5Og=VLwoj4>g)&<=k%D9-*vVI5HH_#Q_v&2&dtqct zjWGvJr(%Ti6(WXe%K*xJHzWA1Wpy6P3_H_6)QpfQ1GAoPcNE$#lJm-Pd|9?LOV4{w z&(NFl9CGf)^ycw`H+>sG)fFqBkR=6L7Kh7S=o;x#{doh$dnZV`QyrzL4b%j3ZvM0H zPFGJ_Y^pi;dG~S{wt;yf+Ve5i^d;o|B_@~i-FA0>;#LDD7ru}6f~J^r0S9FXUosI3 zZ9|d;BVyDLxer=4H%?oosTm}FQtEmO4>u}a*gFu79M;4))MFYz;A}sNbig`)Vxrz+=v}ZD;E_8#LUhuM>If~r3e4S2{uus-S`Lk%JA zu1}uv7YBj0?O*y(%_Q8~Rg?508?~D28?+*s)9g!19qpAqMN`{Md^Ib2mIk?%BC#fA` z`gb+TOhZ(5h>Bk%2pz|IdK&OLSB%KxHlA4PwiaY6k%4#tGRo~XSmlB?A#mGKq*nr5x^>W!UV^UcAuDE6f`;}VqArGj){ zz%K=~RuRL_9LzI(9r5Y1QeXqI$ZZAlA?n_3SbFO+Y#(Zf6*Mh&b6CvOLUzK9W&t%f zBo>eqFSIy7UHXc71gI}anvJQ>>GjU=Y+3r78(I4|OP}2S^p;+vB^CGaqNN|Nw>PWW z(qCOc(8s3KM{QeSpHgKmwI-Mh{VlLAibOm__1nnmAl|dot{}E|)7pjU@UU#XN!B#y zjJxJjZe+{jIiALAYvE!~iZsZ|jeW~Q8u}zP8lMJ)1#Y1jt9g5pra<8Kkris;94_~1 ztH0u|@xK1buBmg(RzPF7EXFarlSJ`@2PKE?#yv3+t=SrNV9AlCb5Ez}P<-u`Y%llyfeVCnS~d=318nqo$2xsJSTrVr+UqM7cB+4)Ayl8}b#jeeNIr}g z!fLi?n21nz6~>;k2Ac?WCvg*HY685nv#BCPuI?h%l!n{{S++#Fr}G_gXxr14LEfxZ zk|OO-N=x%R;&VvR9lM`ZEvqf6Z*r^EGkH0mi$TRIZm@$58IUho-e#d96SBptHliwZ z=}V*=QI)N`qpQXw_ExKYXB6*1eX~(6hhG{Sr7PfIq=!>eK{{i}`Mqr#H+P zE>d8u@y$4e*scO83kjV2{W1Z?D%&w9)bU3_lFW)(B9oxD>WO0TS#>C^Xk1~=-cht;+jyOd=5?p5beweIhEfvs~G(CF?~I! zU&3*Z5?!wGV!T*7g=h9(il59~092RBCY=SlUP%Q)HV4d9pR8c&NqI-L&MM(oH=Har zttdu1z+@yA>h8aQTU7oc+%%9}bhodf8yO82^>PJ%5pG&%F0{>ebpK|!-|+jIj~6=} z_qN%ZROC{<`O2VWTT8ArOk)^4x~_h+1Erdd(orpryV7wkfMlo1DonZaw1oijv$#+~ zuxmRgGNa}M59DxX9SSy9GnubSdiuTqze1Mw#EYJKAq~}*J7J7>oMmz4$-ZON4V_tyyPVS<~nKnmZ8wb;KrUtR4+R7oBm}-zLythU+J{&?obaX%Y@7qVc z@qfRWANi5Ef4GlYKH5#CJF=f(w!W1oCM*_SOXkn^FpruK71A#k@KLdR`zU&m7+Qa% zkK&Rw9TeW!mewHXXApH5e6qJ;06sEV4GQ93u!={@CPI=6%u=E_9KcrhTlDo`RN^b( z+ile*B}RX{tvQ~2hJ%{m6xEbXaQncRD_r?G0Y?3f*;Waao&`lurWsY0ZE0RNtaNeo znHNnfxGugOS!A)_tc#ZaBOO^0$M}TZhL`NR_ybl-Sq`O=#Vx=hecD(y80%R%ugd93 z)DnW3cvhwd7;^W@5#qftGEpS`c{Zw94BDdPSdR1dd5u|P7d_&;89FpL=EJ0fnw|8X z*DTDwi=rD0p1a;Y4lokzielCT$(dSfsk0Iyj|k>K`V4qSF;-dn6mxN8t53 zUk;fQoF^BVz&bb<0y=W&0_4~dYe!uz!HYysl3{Ovnk9q$ru$*fwZWQ6l%EI z?R3&p({|jy{Nf+<=}{?A{cyz81G^m%z`U>Lynk1 z0+uqDZ7@D;c3|Idw~IdK&DldXe-~-z5?11aWMy8cjdZVzX;)ev0sEm8O4selGCpz$VV$~O3unIAg*~Md|s|LWZ49V~b9#HKuEyq^rcsI`T`2dFrgN75b8>kZGBP3$q-nfb@T}+tm~kL~3Q@b-CVFo|b6vO0S8p zygdpm5fs1xg;{a%DhHq*VVNhE>1d!8wN%Icccc1RSM56>YPOphbm%$7llf%fb}}7( z(0772w8?TWlNbMuKnbT$d{*f=qP(z^fMi)t8xxR@BZo+MPH{;KvdJP)lm5_@5pMkS zs7gFZh@vqE$ZuA#BOFg4mNFP%f5DqFd?!($`0{>)gcmO#d{;>6j;oc>^(6^+x|3cTVLRneC4IXsw7sP>>gxX2r>Z~)U7KLZNfC)zV`!-1Xov<7@TI0FeN ztjQzX?c^T4%J#JdWsqRQ&%J`Jy<%eZv3>Aqk?HNR{}^04#*$TwH=)Y}t?Ok6p znf91`cpc?Y=89tvQ9dU+@Qn|(Kz5M8j>3QrkH|gLhvu^F0-ZCLzzbg)#Eg^Xyhs6$ zLSE>Lf6yDmYjk5O?!ceBM(jb2bt(hc#U)TJgg+zJw`7_{|UZMO4^+COwKJY8v`1yQ*T*TQsX8mSa zNgLpsWNG1gh(pm13wW*De2?SNrZxzSFFSHV`s4l4*BFoYukq|*pU>Sd9?zbSKtJ$k zdK^!(9}N(eU0wI>?dR;X|2x{JBvklu${YNNm+@j@W+wl0g`%K2ODk8WuUmvsAmK)%tz{;2P=I^mQT83-) zXy%sY?Hx8lWeiNo9#n&*Epazi6Q98vZ?;5PZlpBZ_Sv0-OZ34r_d{{La-dDDn0CX9 zRRukqlrF`&0&1WxA_@4$l(Q6SGx`KPWXJeCJ2 zmSP|i<2Ik{)1N;N!8e#{6)l*v!nKR$! zs9;K9cOx0Ol~16N%g$KML)gq9wuv8u)y7}2J;mdHBGP`!Y+JnS>^99&PGa^3yj>hz0C2&)(}91^D`|{7z^C&sVBaILUP@CapV*a3UN2~mHoLrfCgXI z8tTp8*-Xx96^K)wg|(w8`N+UI*F%cIUD*s@ecDEmIt^rI>DXAxIkkNwPIbx@Le)5S z(afHOgJTok(ie0p-O*kqnv6(&&cnV;t{y;*QUOcC`WD7f;wCyY%~V~e+b}g^4i@4s z7?>qY$<}k#VqTy(&pebfIUj%)LK5tc&nk;^+qI9|-ZccU8P(d0#3)1wl0-q-VqmlBf{DBhkb%K; z9r5EdB7W*`7>BydW}_>8j8QF!N3aI4LX|*UhL7_;m&5q$ZVM8J{rJcq))I(y+R zKW)m%_z`?@tLnkQK*Fsaz9`HiUbxn18 zyVpQf!(;YU^9H?i2;&v-6OL!o2QIa~+ONrR_iI{&x0*l?;-U2h?BtO~GkU(k%sD%m zWl16Gjbs4AtB>WCd@naE05l`wsO3RbZHTK*5)LN6S8(TACC674>g%F{*mj`c((G60 zdT>}H%{LHJGQypheP7V?8|ky8D1i90$fCHrryr;;5-7Q1ry_CjPRi)MEJ>gLlLmg^ zJ3=2<(!!IZ#P!>mTlG+!S z&WzmJQ@VR=LzOafVQV)#YJ`O!7+y9KSk{w`*gC5z=TU5*{tGK>usvO(0QvwWxFYUE z8^9d#Tz5L~ptTnn-Z9O~P$8F&ocU5l+@@WXN%16J``q-K*-`F1!dwME3sNLZnX{D} zE{IK#;>o@t$vINQzYlH{dBF@%3!GP7WC~Bc`|JX*kYGAimwv6^T3#`^iiDDszinOIk5yIc z!ZHJLh`nTtHdf-0s?oShxU!ZE$XolGKItsNJc3}lj9_W1$*7-#kT<21iuct4rYp=* z#;d{A^rHeDP3_Z_o%KZo6@GQ=Z7A;!x;cwnR1M`cv|tuMAtXCt9~WlQedgL2`op&y zz+c8DUESkWb-zGFZ=xpI(^mzwL{`(|qtL+&da@E2N@f{!)#tB99p-%*(XT=cm3v1u z4E2|zrsyh$7$<=`sN@9MpWp%YXhT~wy$Vz_;-gTvh&suZ%%L)&t0tm8;#?+33MLEG z9)z740Kh=e2>vJ(c#>y@+JA$(aTXV-)(;RN?;q8ul_>Dh?i#fvb%E;KEpzKHs6Dyu zqXrh%?xO~-{r!!yr#_~iX-f;AQgpyf1k6xrH9dS#A|Qu8 zM&}svH>d)50K*1@rfIgygoRYurz0oDSPOyt4@ufQqp6Y;{`?*bD87aZVTd2#Oa(*3B(T^`kYirum;Va_v{W8 zhk(uNkgyky6HUrM-wb(-QY^%{^2CPdFs(>cg&o%w3AnD})c5tj#}6oE#ZPEYy8hfw z1`JL~w2WOWE?I?CT*6^k87&Xz%dXOmX)`w`mg)>3FO+tZ9Npp$Pmv0iiJ%&%SIeN@ z>E*8Y(q7ne2OXlTA8%njUN-j}6a2-zy&YcPi^7a*3&e40jW0C?K2+UsbJy3S_c z#gXyF0_M~~1#Y~TXCOg|(>%*X>OcuWnBnd8$|O;YuJHdrUsIJ6->t$zC}%_2i8Cdu zxeBjQXEXEwO{AYw(L8q(W{TTqS+D)q-ZO&Ly{UDJPtgUt7@i4RJ%c-_}P+JM@V) zLXEWU;+7^Y&WD@J-)5_@>^0=k=p0Nk|4t&U%Tv)yiwb2dH5s`@*tJ&;0TtMy43I6l zG(cRi42CUV@ZjaS7tJJ0<&+$YT^{XqhSn0FjV&*vYv{gh4KV;Nq58!KnL!tR*zxUM z5uPz1993fsC4hpUeX&E0~Xcj25i*OTM`dq7F4s!e zRiFSwT@|o!Qvpl?`shfabGXz7DPQm%Z1uEM;r-y>=c{f^i4WbFyq_*Jj8gO zMoP~inUlZC#G7mTc;FQnpJ|_>WuxMy8E9m!IHpZMtI>3^MqNQhsBRt=eF#EZu6swH zE>qGIWcs|5p0cM2^;$vdj#;OcsUVfM{69cyuJ&a5$3LC^`j@}|?a%)>{o^Bi|HD54 D5eNwF diff --git a/java/examples/Books/Getting Started/media/clouds.gif b/java/examples/Books/Getting Started/media/clouds.gif deleted file mode 100644 index ad52b85a1cc1f336f360b4d82742723411ea6380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138979 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 O`1qCtq+BdO68;BrT0@Nh diff --git a/java/examples/Books/Getting Started/media/network.svg b/java/examples/Books/Getting Started/media/network.svg deleted file mode 100644 index 5ecd8d159..000000000 --- a/java/examples/Books/Getting Started/media/network.svg +++ /dev/null @@ -1,4056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/media/robot1.svg b/java/examples/Books/Getting Started/media/robot1.svg deleted file mode 100644 index e44805f1c..000000000 --- a/java/examples/Books/Getting Started/media/robot1.svg +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Getting Started/media/robot2.svg b/java/examples/Books/Getting Started/media/robot2.svg deleted file mode 100644 index e44805f1c..000000000 --- a/java/examples/Books/Getting Started/media/robot2.svg +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Connection.pde b/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Connection.pde deleted file mode 100644 index 0dcfe7a67..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Connection.pde +++ /dev/null @@ -1,65 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Connection { - // Connection is from Neuron A to B - Neuron a; - Neuron b; - - // Connection has a weight - float weight; - - // Variables to track the animation - boolean sending = false; - PVector sender; - - // Need to store the output for when its time to pass along - float output = 0; - - Connection(Neuron from, Neuron to, float w) { - weight = w; - a = from; - b = to; - } - - - // The Connection is active - void feedforward(float val) { - output = val*weight; // Compute output - sender = a.location.get(); // Start animation at Neuron A - sending = true; // Turn on sending - } - - // Update traveling sender - void update() { - if (sending) { - // Use a simple interpolation - sender.x = lerp(sender.x, b.location.x, 0.1); - sender.y = lerp(sender.y, b.location.y, 0.1); - float d = PVector.dist(sender, b.location); - // If we've reached the end - if (d < 1) { - // Pass along the output! - b.feedforward(output); - sending = false; - } - } - } - - // Draw line and traveling circle - void display() { - stroke(0); - strokeWeight(1+weight*4); - line(a.location.x, a.location.y, b.location.x, b.location.y); - - if (sending) { - fill(0); - strokeWeight(1); - ellipse(sender.x, sender.y, 16, 16); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Exercise_10_5_LayeredNetworkAnimation.pde b/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Exercise_10_5_LayeredNetworkAnimation.pde deleted file mode 100644 index 87958e675..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Exercise_10_5_LayeredNetworkAnimation.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -Network network; - -void setup() { - size(640,360); - // Create the Network object - network = new Network(width/2, height/2); - - int layers = 3; - int inputs = 2; - - Neuron output = new Neuron(250, 0); - for (int i = 0; i < layers; i++) { - for (int j = 0; j < inputs; j++) { - float x = map(i, 0, layers, -250, 300); - float y = map(j, 0, inputs-1, -75, 75); - Neuron n = new Neuron(x, y); - if (i > 0) { - for (int k = 0; k < inputs; k++) { - Neuron prev = network.neurons.get(network.neurons.size()-inputs+k-j); - network.connect(prev, n, random(1)); - } - } - if (i == layers-1) { - network.connect(n, output, random(1)); - } - network.addNeuron(n); - } - } - network.addNeuron(output); -} - -void draw() { - background(255); - // Update and display the Network - network.update(); - network.display(); - - // Every 30 frames feed in an input - if (frameCount % 30 == 0) { - network.feedforward(random(1),random(1)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Network.pde b/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Network.pde deleted file mode 100644 index 68a9f597f..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Network.pde +++ /dev/null @@ -1,68 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Network { - - // The Network has a list of neurons - ArrayList neurons; - - // The Network now keeps a duplicate list of all Connection objects. - // This makes it easier to draw everything in this class - ArrayList connections; - PVector location; - - Network(float x, float y) { - location = new PVector(x, y); - neurons = new ArrayList(); - connections = new ArrayList(); - } - - // We can add a Neuron - void addNeuron(Neuron n) { - neurons.add(n); - } - - // We can connection two Neurons - void connect(Neuron a, Neuron b, float weight) { - Connection c = new Connection(a, b, weight); - a.addConnection(c); - // Also add the Connection here - connections.add(c); - } - - // Sending an input to the first Neuron - // We should do something better to track multiple inputs - void feedforward(float input1, float input2) { - Neuron n1 = neurons.get(0); - n1.feedforward(input1); - - Neuron n2 = neurons.get(1); - n2.feedforward(input2); - - } - - // Update the animation - void update() { - for (Connection c : connections) { - c.update(); - } - } - - // Draw everything - void display() { - pushMatrix(); - translate(location.x, location.y); - for (Neuron n : neurons) { - n.display(); - } - - for (Connection c : connections) { - c.display(); - } - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Neuron.pde b/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Neuron.pde deleted file mode 100644 index 819fe6750..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/Exercise_10_5_LayeredNetworkAnimation/Neuron.pde +++ /dev/null @@ -1,64 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Neuron { - // Neuron has a location - PVector location; - - // Neuron has a list of connections - ArrayList connections; - - // We now track the inputs and sum them - float sum = 0; - - // The Neuron's size can be animated - float r = 32; - - Neuron(float x, float y) { - location = new PVector(x, y); - connections = new ArrayList(); - } - - // Add a Connection - void addConnection(Connection c) { - connections.add(c); - } - - // Receive an input - void feedforward(float input) { - // Accumulate it - sum += input; - // Activate it? - if (sum > 1) { - fire(); - sum = 0; // Reset the sum to 0 if it fires - } - } - - // The Neuron fires - void fire() { - r = 64; // It suddenly is bigger - - // We send the output through all connections - for (Connection c : connections) { - c.feedforward(sum); - } - } - - // Draw it as a circle - void display() { - stroke(0); - strokeWeight(1); - // Brightness is mapped to sum - float b = map(sum,0,1,255,0); - fill(b); - ellipse(location.x, location.y, r, r); - - // Size shrinks down back to original dimensions - r = lerp(r,32,0.1); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Connection.pde b/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Connection.pde deleted file mode 100644 index 4d3c6d365..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Connection.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Connection { - float weight; - Neuron a; - Neuron b; - - Connection(Neuron from, Neuron to,float w) { - weight = w; - a = from; - b = to; - } - - void display() { - stroke(0); - strokeWeight(weight*4); - line(a.location.x, a.location.y, b.location.x, b.location.y); - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/LayeredNetworkViz.pde b/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/LayeredNetworkViz.pde deleted file mode 100644 index e9a8f2de2..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/LayeredNetworkViz.pde +++ /dev/null @@ -1,16 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Network network; - -void setup() { - size(640, 360); - network = new Network(4,3,1); -} - -void draw() { - background(255); - network.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Network.pde b/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Network.pde deleted file mode 100644 index ec87c6e37..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Network.pde +++ /dev/null @@ -1,47 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Network { - ArrayList neurons; - PVector location; - Network(int layers, int inputs, int outputs) { - location = new PVector(width/2, height/2); - - neurons = new ArrayList(); - - Neuron output = new Neuron(250, 0); - for (int i = 0; i < layers; i++) { - for (int j = 0; j < inputs; j++) { - float x = map(i, 0, layers, -200, 200); - float y = map(j, 0, inputs-1, -100, 100); - println(j + " " + y); - Neuron n = new Neuron(x, y); - - if (i > 0) { - for (int k = 0; k < inputs; k++) { - Neuron prev = neurons.get(neurons.size()-inputs+k-j); - prev.connect(n); - } - } - - if (i == layers-1) { - n.connect(output); - } - neurons.add(n); - } - } - neurons.add(output); - } - - - void display() { - pushMatrix(); - translate(location.x, location.y); - for (Neuron n : neurons) { - n.display(); - } - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Neuron.pde b/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Neuron.pde deleted file mode 100644 index e500dcb2b..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/LayeredNetworkViz/Neuron.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Neuron { - PVector location; - - ArrayList connections; - - Neuron(float x, float y) { - location = new PVector(x, y); - connections = new ArrayList(); - } - - void connect(Neuron n) { - Connection c = new Connection(this, n, random(1)); - connections.add(c); - } - - void display() { - stroke(0); - strokeWeight(1); - fill(0); - ellipse(location.x, location.y, 16, 16); - - for (Connection c : connections) { - c.display(); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/NOC_10_01_SimplePerceptron.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/NOC_10_01_SimplePerceptron.pde deleted file mode 100644 index 93148cea1..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/NOC_10_01_SimplePerceptron.pde +++ /dev/null @@ -1,90 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Perceptron Example -// See: http://en.wikipedia.org/wiki/Perceptron - -// Code based on text "Artificial Intelligence", George Luger - -// A list of points we will use to "train" the perceptron -Trainer[] training = new Trainer[2000]; -// A Perceptron object -Perceptron ptron; - -// We will train the perceptron with one "Point" object at a time -int count = 0; - -// Coordinate space -float xmin = -400; -float ymin = -100; -float xmax = 400; -float ymax = 100; - -// The function to describe a line -float f(float x) { - return 0.4*x+1; -} - -void setup() { - size(640, 360); - - // The perceptron has 3 inputs -- x, y, and bias - // Second value is "Learning Constant" - ptron = new Perceptron(3, 0.00001); // Learning Constant is low just b/c it's fun to watch, this is not necessarily optimal - - // Create a random set of training points and calculate the "known" answer - for (int i = 0; i < training.length; i++) { - float x = random(xmin, xmax); - float y = random(ymin, ymax); - int answer = 1; - if (y < f(x)) answer = -1; - training[i] = new Trainer(x, y, answer); - } - smooth(); -} - - -void draw() { - background(255); - translate(width/2,height/2); - - // Draw the line - strokeWeight(4); - stroke(127); - float x1 = xmin; - float y1 = f(x1); - float x2 = xmax; - float y2 = f(x2); - line(x1,y1,x2,y2); - - // Draw the line based on the current weights - // Formula is weights[0]*x + weights[1]*y + weights[2] = 0 - stroke(0); - strokeWeight(1); - float[] weights = ptron.getWeights(); - x1 = xmin; - y1 = (-weights[2] - weights[0]*x1)/weights[1]; - x2 = xmax; - y2 = (-weights[2] - weights[0]*x2)/weights[1]; - line(x1,y1,x2,y2); - - - - // Train the Perceptron with one "training" point at a time - ptron.train(training[count].inputs, training[count].answer); - count = (count + 1) % training.length; - - // Draw all the points based on what the Perceptron would "guess" - // Does not use the "known" correct answer - for (int i = 0; i < count; i++) { - stroke(0); - strokeWeight(1); - fill(0); - int guess = ptron.feedforward(training[i].inputs); - if (guess > 0) noFill(); - - ellipse(training[i].inputs[0], training[i].inputs[1], 8, 8); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Perceptron.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Perceptron.pde deleted file mode 100644 index 0eec0da5b..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Perceptron.pde +++ /dev/null @@ -1,60 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://natureofcode.com - -// Simple Perceptron Example -// See: http://en.wikipedia.org/wiki/Perceptron - -// Perceptron Class - -class Perceptron { - float[] weights; // Array of weights for inputs - float c; // learning constant - - // Perceptron is created with n weights and learning constant - Perceptron(int n, float c_) { - weights = new float[n]; - // Start with random weights - for (int i = 0; i < weights.length; i++) { - weights[i] = random(-1,1); - } - c = c_; - } - - // Function to train the Perceptron - // Weights are adjusted based on "desired" answer - void train(float[] inputs, int desired) { - // Guess the result - int guess = feedforward(inputs); - // Compute the factor for changing the weight based on the error - // Error = desired output - guessed output - // Note this can only be 0, -2, or 2 - // Multiply by learning constant - float error = desired - guess; - // Adjust weights based on weightChange * input - for (int i = 0; i < weights.length; i++) { - weights[i] += c * error * inputs[i]; - } - } - - // Guess -1 or 1 based on input values - int feedforward(float[] inputs) { - // Sum all values - float sum = 0; - for (int i = 0; i < weights.length; i++) { - sum += inputs[i]*weights[i]; - } - // Result is sign of the sum, -1 or 1 - return activate(sum); - } - - int activate(float sum) { - if (sum > 0) return 1; - else return -1; - } - - // Return weights - float[] getWeights() { - return weights; - } -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Trainer.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Trainer.pde deleted file mode 100644 index 69db5371c..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_01_SimplePerceptron/Trainer.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Perceptron Example -// See: http://en.wikipedia.org/wiki/Perceptron - -// A class to describe a training point -// Has an x and y, a "bias" (1) and known output -// Could also add a variable for "guess" but not required here - -class Trainer { - - float[] inputs; - int answer; - - Trainer(float x, float y, int a) { - inputs = new float[3]; - inputs[0] = x; - inputs[1] = y; - inputs[2] = 1; - answer = a; - } -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/NOC_10_02_SeekingNeural.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/NOC_10_02_SeekingNeural.pde deleted file mode 100644 index de91587f1..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/NOC_10_02_SeekingNeural.pde +++ /dev/null @@ -1,63 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A Vehicle controlled by a Perceptron - -Vehicle v; - -PVector desired; - -ArrayList targets; - -void setup() { - size(640, 360); - // The Vehicle's desired location - desired = new PVector(width/2,height/2); - - - // Create a list of targets - makeTargets(); - - // Create the Vehicle (it has to know about the number of targets - // in order to configure its brain) - v = new Vehicle(targets.size(), random(width), random(height)); -} - -// Make a random ArrayList of targets to steer towards -void makeTargets() { - targets = new ArrayList(); - for (int i = 0; i < 8; i++) { - targets.add(new PVector(random(width), random(height))); - } -} - -void draw() { - background(255); - - // Draw a circle to show the Vehicle's goal - stroke(0); - strokeWeight(2); - fill(0, 100); - ellipse(desired.x, desired.y, 36, 36); - - // Draw the targets - for (PVector target : targets) { - noFill(); - stroke(0); - strokeWeight(2); - ellipse(target.x, target.y, 16, 16); - line(target.x,target.y-16,target.x,target.y+16); - line(target.x-16,target.y,target.x+16,target.y); - } - - // Update the Vehicle - v.steer(targets); - v.update(); - v.display(); -} - -void mousePressed() { - makeTargets(); -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Perceptron.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Perceptron.pde deleted file mode 100644 index f52c726b3..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Perceptron.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Perceptron Example -// See: http://en.wikipedia.org/wiki/Perceptron - -// Perceptron Class - -class Perceptron { - float[] weights; // Array of weights for inputs - float c; // learning constant - - // Perceptron is created with n weights and learning constant - Perceptron(int n, float c_) { - weights = new float[n]; - c = c_; - // Start with random weights - for (int i = 0; i < weights.length; i++) { - weights[i] = random(0, 1); - } - } - - // Function to train the Perceptron - // Weights are adjusted based on vehicle's error - void train(PVector[] forces, PVector error) { - for (int i = 0; i < weights.length; i++) { - weights[i] += c*error.x*forces[i].x; - weights[i] += c*error.y*forces[i].y; - weights[i] = constrain(weights[i], 0, 1); - } - } - - // Give me a steering result - PVector feedforward(PVector[] forces) { - // Sum all values - PVector sum = new PVector(); - for (int i = 0; i < weights.length; i++) { - forces[i].mult(weights[i]); - sum.add(forces[i]); - } - return sum; - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Vehicle.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Vehicle.pde deleted file mode 100644 index efd9bf287..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_02_SeekingNeural/Vehicle.pde +++ /dev/null @@ -1,102 +0,0 @@ -// Seek -// Daniel Shiffman - -// The "Vehicle" class - -class Vehicle { - - // Vehicle now has a brain! - Perceptron brain; - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(int n, float x, float y) { - brain = new Perceptron(n,0.001); - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - location = new PVector(x,y); - r = 3.0; - maxspeed = 4; - maxforce = 0.1; - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelerationelertion to 0 each cycle - acceleration.mult(0); - - location.x = constrain(location.x,0,width); - location.y = constrain(location.y,0,height); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Here is where the brain processes everything - void steer(ArrayList targets) { - // Make an array of forces - PVector[] forces = new PVector[targets.size()]; - - // Steer towards all targets - for (int i = 0; i < forces.length; i++) { - forces[i] = seek(targets.get(i)); - } - - // That array of forces is the input to the brain - PVector result = brain.feedforward(forces); - - // Use the result to steer the vehicle - applyForce(result); - - // Train the brain according to the error - PVector error = PVector.sub(desired, location); - brain.train(forces,error); - - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - - return steer; - } - - void display() { - - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + PI/2; - fill(175); - stroke(0); - strokeWeight(1); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(CLOSE); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Connection.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Connection.pde deleted file mode 100644 index 5e183e58f..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Connection.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A static drawing of a Neural Network - -class Connection { - - // Connection is from Neuron A to B - Neuron a; - Neuron b; - - // Connection has a weight - float weight; - - Connection(Neuron from, Neuron to,float w) { - weight = w; - a = from; - b = to; - } - - // Drawn as a line - void display() { - stroke(0); - strokeWeight(weight*4); - line(a.location.x, a.location.y, b.location.x, b.location.y); - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/NOC_10_03_NetworkViz.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/NOC_10_03_NetworkViz.pde deleted file mode 100644 index c368b9966..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/NOC_10_03_NetworkViz.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A static drawing of a Neural Network - -Network network; - -void setup() { - size(640, 360); - // Create the Network object - network = new Network(width/2,height/2); - - // Create a bunch of Neurons - Neuron a = new Neuron(-200,0); - Neuron b = new Neuron(0,75); - Neuron c = new Neuron(0,-75); - Neuron d = new Neuron(200,0); - - // Connect them - network.connect(a,b); - network.connect(a,c); - network.connect(b,d); - network.connect(c,d); - - // Add them to the Network - network.addNeuron(a); - network.addNeuron(b); - network.addNeuron(c); - network.addNeuron(d); -} - -void draw() { - background(255); - // Draw the Network - network.display(); - noLoop(); -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Network.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Network.pde deleted file mode 100644 index 44b94a80f..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Network.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A static drawing of a Neural Network - -class Network { - - // The Network has a list of neurons - ArrayList neurons; - PVector location; - - Network(float x, float y) { - location = new PVector(x,y); - neurons = new ArrayList(); - } - - // We can add a Neuron - void addNeuron(Neuron n) { - neurons.add(n); - } - - // We can connection two Neurons - void connect(Neuron a, Neuron b) { - Connection c = new Connection(a, b, random(1)); - a.addConnection(c); - } - - // We can draw the network - void display() { - pushMatrix(); - translate(location.x, location.y); - for (Neuron n : neurons) { - n.display(); - } - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Neuron.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Neuron.pde deleted file mode 100644 index d14ed2a5e..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_03_NetworkViz/Neuron.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A static drawing of a Neural Network - -class Neuron { - - // Neuron has a location - PVector location; - - // Neuron has a list of connections - ArrayList connections; - - Neuron(float x, float y) { - location = new PVector(x, y); - connections = new ArrayList(); - } - - // Add a Connection - void addConnection(Connection c) { - connections.add(c); - } - - // Draw Neuron as a circle - void display() { - stroke(0); - strokeWeight(1); - fill(0); - ellipse(location.x, location.y, 16, 16); - - // Draw all its connections - for (Connection c : connections) { - c.display(); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Connection.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Connection.pde deleted file mode 100644 index 0dcfe7a67..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Connection.pde +++ /dev/null @@ -1,65 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Connection { - // Connection is from Neuron A to B - Neuron a; - Neuron b; - - // Connection has a weight - float weight; - - // Variables to track the animation - boolean sending = false; - PVector sender; - - // Need to store the output for when its time to pass along - float output = 0; - - Connection(Neuron from, Neuron to, float w) { - weight = w; - a = from; - b = to; - } - - - // The Connection is active - void feedforward(float val) { - output = val*weight; // Compute output - sender = a.location.get(); // Start animation at Neuron A - sending = true; // Turn on sending - } - - // Update traveling sender - void update() { - if (sending) { - // Use a simple interpolation - sender.x = lerp(sender.x, b.location.x, 0.1); - sender.y = lerp(sender.y, b.location.y, 0.1); - float d = PVector.dist(sender, b.location); - // If we've reached the end - if (d < 1) { - // Pass along the output! - b.feedforward(output); - sending = false; - } - } - } - - // Draw line and traveling circle - void display() { - stroke(0); - strokeWeight(1+weight*4); - line(a.location.x, a.location.y, b.location.x, b.location.y); - - if (sending) { - fill(0); - strokeWeight(1); - ellipse(sender.x, sender.y, 16, 16); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/NOC_10_04_NetworkAnimation.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/NOC_10_04_NetworkAnimation.pde deleted file mode 100644 index 4c2d2ed6c..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/NOC_10_04_NetworkAnimation.pde +++ /dev/null @@ -1,50 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -Network network; - -void setup() { - size(640, 360); - // Create the Network object - network = new Network(width/2, height/2); - - // Create a bunch of Neurons - Neuron a = new Neuron(-275, 0); - Neuron b = new Neuron(-150, 0); - Neuron c = new Neuron(0, 75); - Neuron d = new Neuron(0, -75); - Neuron e = new Neuron(150, 0); - Neuron f = new Neuron(275, 0); - - // Connect them - network.connect(a, b,1); - network.connect(b, c,random(1)); - network.connect(b, d,random(1)); - network.connect(c, e,random(1)); - network.connect(d, e,random(1)); - network.connect(e, f,1); - - // Add them to the Network - network.addNeuron(a); - network.addNeuron(b); - network.addNeuron(c); - network.addNeuron(d); - network.addNeuron(e); - network.addNeuron(f); -} - -void draw() { - background(255); - // Update and display the Network - network.update(); - network.display(); - - // Every 30 frames feed in an input - if (frameCount % 30 == 0) { - network.feedforward(random(1)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Network.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Network.pde deleted file mode 100644 index 5506414c9..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Network.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Network { - - // The Network has a list of neurons - ArrayList neurons; - - // The Network now keeps a duplicate list of all Connection objects. - // This makes it easier to draw everything in this class - ArrayList connections; - PVector location; - - Network(float x, float y) { - location = new PVector(x, y); - neurons = new ArrayList(); - connections = new ArrayList(); - } - - // We can add a Neuron - void addNeuron(Neuron n) { - neurons.add(n); - } - - // We can connection two Neurons - void connect(Neuron a, Neuron b, float weight) { - Connection c = new Connection(a, b, weight); - a.addConnection(c); - // Also add the Connection here - connections.add(c); - } - - // Sending an input to the first Neuron - // We should do something better to track multiple inputs - void feedforward(float input) { - Neuron start = neurons.get(0); - start.feedforward(input); - } - - // Update the animation - void update() { - for (Connection c : connections) { - c.update(); - } - } - - // Draw everything - void display() { - pushMatrix(); - translate(location.x, location.y); - for (Neuron n : neurons) { - n.display(); - } - - for (Connection c : connections) { - c.display(); - } - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Neuron.pde b/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Neuron.pde deleted file mode 100644 index 89bc6c822..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/NOC_10_04_NetworkAnimation/Neuron.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An animated drawing of a Neural Network - -class Neuron { - // Neuron has a location - PVector location; - - // Neuron has a list of connections - ArrayList connections; - - // We now track the inputs and sum them - float sum = 0; - - // The Neuron's size can be animated - float r = 32; - - Neuron(float x, float y) { - location = new PVector(x, y); - connections = new ArrayList(); - } - - // Add a Connection - void addConnection(Connection c) { - connections.add(c); - } - - // Receive an input - void feedforward(float input) { - // Accumulate it - sum += input; - // Activate it? - if (sum > 1) { - fire(); - sum = 0; // Reset the sum to 0 if it fires - } - } - - // The Neuron fires - void fire() { - r = 64; // It suddenly is bigger - - // We send the output through all connections - for (Connection c : connections) { - c.feedforward(sum); - } - } - - // Draw it as a circle - void display() { - stroke(0); - strokeWeight(1); - // Brightness is mapped to sum - float b = map(sum,0,1,255,0); - fill(b); - ellipse(location.x, location.y, r, r); - - // Size shrinks down back to original dimensions - r = lerp(r,32,0.1); - } -} - diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/Landscape.pde b/java/examples/Books/Nature of Code/chp10_nn/xor/Landscape.pde deleted file mode 100755 index 07bc45c54..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/Landscape.pde +++ /dev/null @@ -1,75 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// "Landscape" example - -class Landscape { - - int scl; // size of each cell - int w,h; // width and height of thingie - int rows, cols; // number of rows and columns - float zoff = 0.0; // perlin noise argument - float[][] z; // using an array to store all the height values - - Landscape(int scl_, int w_, int h_) { - scl = scl_; - w = w_; - h = h_; - cols = w/scl; - rows = h/scl; - z = new float[cols][rows]; - } - - - // Calculate height values (based off a neural netork) - void calculate(Network nn) { - float x = 0; - float dx = (float) 1.0 / cols; - for (int i = 0; i < cols; i++) - { - float y = 0; - float dy = (float) 1.0 / rows; - for (int j = 0; j < rows; j++) - { - float[] input = new float[2]; - input[0] = x; - input[1] = y; - float result = nn.feedForward(input); - z[i][j] = z[i][j]*0.95 + 0.05*(float)(result*280.0f-140.0); - y += dy; - } - x += dx; - } - - } - - // Render landscape as grid of quads - void render() { - // Every cell is an individual quad - // (could use quad_strip here, but produces funny results, investigate this) - for (int x = 0; x < z.length-1; x++) - { - for (int y = 0; y < z[x].length-1; y++) - { - // one quad at a time - // each quad's color is determined by the height value at each vertex - // (clean this part up) - noStroke(); - pushMatrix(); - beginShape(QUADS); - translate(x*scl-w/2,y*scl-h/2,0); - fill(z[x][y]+127,220); - vertex(0,0,z[x][y]); - fill(z[x+1][y]+127,220); - vertex(scl,0,z[x+1][y]); - fill(z[x+1][y+1]+127,220); - vertex(scl,scl,z[x+1][y+1]); - fill(z[x][y+1]+127,220); - vertex(0,scl,z[x][y+1]); - endShape(); - popMatrix(); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Connection.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Connection.java deleted file mode 100644 index d8415d2a6..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Connection.java +++ /dev/null @@ -1,47 +0,0 @@ -// Daniel Shiffman -// The Nature of Code, Fall 2006 -// Neural Network - -// Class to describe a connection between two neurons - -package nn; - -public class Connection { - - private Neuron from; // Connection goes from. . . - private Neuron to; // To. . . - private float weight; // Weight of the connection. . . - - // Constructor builds a connection with a random weight - public Connection(Neuron a_, Neuron b_) { - from = a_; - to = b_; - weight = (float) Math.random()*2-1; - } - - // In case I want to set the weights manually, using this for testing - public Connection(Neuron a_, Neuron b_, float w) { - from = a_; - to = b_; - weight = w; - } - - public Neuron getFrom() { - return from; - } - - public Neuron getTo() { - return to; - } - - public float getWeight() { - return weight; - } - - // Changing the weight of the connection - public void adjustWeight(float deltaWeight) { - weight += deltaWeight; - } - - -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/HiddenNeuron.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/HiddenNeuron.java deleted file mode 100644 index 3c8d7945d..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/HiddenNeuron.java +++ /dev/null @@ -1,20 +0,0 @@ -//Daniel Shiffman -//The Nature of Code, Fall 2006 -//Neural Network - -// Hidden Neuron Class -// So far not necessary to differentiate these - -package nn; - -public class HiddenNeuron extends Neuron { - - public HiddenNeuron() { - super(); - } - - public HiddenNeuron(int i) { - super(i); - } - -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/InputNeuron.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/InputNeuron.java deleted file mode 100644 index a2191632f..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/InputNeuron.java +++ /dev/null @@ -1,23 +0,0 @@ -//Daniel Shiffman -//The Nature of Code, Fall 2006 -//Neural Network - -// Input Neuron Class -// Has additional functionality to receive beginning input - -package nn; - -public class InputNeuron extends Neuron { - public InputNeuron() { - super(); - } - - public InputNeuron(int i) { - super(i); - } - - public void input(float d) { - output = d; - } - -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Network.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Network.java deleted file mode 100644 index c0854712d..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Network.java +++ /dev/null @@ -1,143 +0,0 @@ -// Daniel Shiffman -// The Nature of Code, Fall 2006 -// Neural Network - -// Class to describe the entire network -// Arrays for input neurons, hidden neurons, and output neuron - -// Need to update this so that it would work with an array out outputs -// Rather silly that I didn't do this initially - -// Also need to build in a "Layer" class so that there can easily -// be more than one hidden layer - -package nn; - -import java.util.ArrayList; - -public class Network { - - // Layers - InputNeuron[] input; - HiddenNeuron[] hidden; - OutputNeuron output; - - public static final float LEARNING_CONSTANT = 0.5f; - - // Only One output now to start!!! (i can do better, really. . .) - // Constructor makes the entire network based on number of inputs & number of neurons in hidden layer - // Only One hidden layer!!! (fix this dood) - - public Network(int inputs, int hiddentotal) { - - input = new InputNeuron[inputs+1]; // Got to add a bias input - hidden = new HiddenNeuron[hiddentotal+1]; - - // Make input neurons - for (int i = 0; i < input.length-1; i++) { - input[i] = new InputNeuron(); - } - - // Make hidden neurons - for (int i = 0; i < hidden.length-1; i++) { - hidden[i] = new HiddenNeuron(); - } - - // Make bias neurons - input[input.length-1] = new InputNeuron(1); - hidden[hidden.length-1] = new HiddenNeuron(1); - - // Make output neuron - output = new OutputNeuron(); - - // Connect input layer to hidden layer - for (int i = 0; i < input.length; i++) { - for (int j = 0; j < hidden.length-1; j++) { - // Create the connection object and put it in both neurons - Connection c = new Connection(input[i],hidden[j]); - input[i].addConnection(c); - hidden[j].addConnection(c); - } - } - - // Connect the hidden layer to the output neuron - for (int i = 0; i < hidden.length; i++) { - Connection c = new Connection(hidden[i],output); - hidden[i].addConnection(c); - output.addConnection(c); - } - - } - - - public float feedForward(float[] inputVals) { - - // Feed the input with an array of inputs - for (int i = 0; i < inputVals.length; i++) { - input[i].input(inputVals[i]); - } - - // Have the hidden layer calculate its output - for (int i = 0; i < hidden.length-1; i++) { - hidden[i].calcOutput(); - } - - // Calculate the output of the output neuron - output.calcOutput(); - - // Return output - return output.getOutput(); - } - - public float train(float[] inputs, float answer) { - float result = feedForward(inputs); - - - // This is where the error correction all starts - // Derivative of sigmoid output function * diff between known and guess - float deltaOutput = result*(1-result) * (answer-result); - - - // BACKPROPOGATION - // This is easier b/c we just have one output - // Apply Delta to connections between hidden and output - ArrayList connections = output.getConnections(); - for (int i = 0; i < connections.size(); i++) { - Connection c = (Connection) connections.get(i); - Neuron neuron = c.getFrom(); - float output = neuron.getOutput(); - float deltaWeight = output*deltaOutput; - c.adjustWeight(LEARNING_CONSTANT*deltaWeight); - } - - // ADJUST HIDDEN WEIGHTS - for (int i = 0; i < hidden.length; i++) { - connections = hidden[i].getConnections(); - float sum = 0; - // Sum output delta * hidden layer connections (just one output) - for (int j = 0; j < connections.size(); j++) { - Connection c = (Connection) connections.get(j); - // Is this a connection from hidden layer to next layer (output)? - if (c.getFrom() == hidden[i]) { - sum += c.getWeight()*deltaOutput; - } - } - // Then adjust the weights coming in based: - // Above sum * derivative of sigmoid output function for hidden neurons - for (int j = 0; j < connections.size(); j++) { - Connection c = (Connection) connections.get(j); - // Is this a connection from previous layer (input) to hidden layer? - if (c.getTo() == hidden[i]) { - float output = hidden[i].getOutput(); - float deltaHidden = output * (1 - output); // Derivative of sigmoid(x) - deltaHidden *= sum; // Would sum for all outputs if more than one output - Neuron neuron = c.getFrom(); - float deltaWeight = neuron.getOutput()*deltaHidden; - c.adjustWeight(LEARNING_CONSTANT*deltaWeight); - } - } - } - - return result; - } -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Neuron.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Neuron.java deleted file mode 100644 index 234780016..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/Neuron.java +++ /dev/null @@ -1,81 +0,0 @@ -//Daniel Shiffman -//The Nature of Code, Fall 2006 -//Neural Network - -//Generic Neuron Class -//Can be a bias neuron (true or false) - -package nn; - -import java.util.ArrayList; - -public class Neuron { - - protected float output; - protected ArrayList connections; - protected boolean bias = false; - - // A regular Neuron - public Neuron() { - output = 0; - // Using an arraylist to store list of connections to other neurons - connections = new ArrayList(); - bias = false; - } - - // Constructor for a bias neuron - public Neuron(int i) { - output = i; - connections = new ArrayList(); - bias = true; - } - - // Function to calculate output of this neuron - // Output is sum of all inputs*weight of connections - public void calcOutput() { - if (bias) { - // do nothing - } else { - float sum = 0; - float bias = 0; - //System.out.println("Looking through " + connections.size() + " connections"); - for (int i = 0; i < connections.size(); i++) { - Connection c = (Connection) connections.get(i); - Neuron from = c.getFrom(); - Neuron to = c.getTo(); - // Is this connection moving forward to us - // Ignore connections that we send our output to - if (to == this) { - // This isn't really necessary - // But I am treating the bias individually in case I need to at some point - if (from.bias) { - bias = from.getOutput()*c.getWeight(); - } else { - sum += from.getOutput()*c.getWeight(); - } - } - } - // Output is result of sigmoid function - output = f(bias+sum); - } - } - - void addConnection(Connection c) { - connections.add(c); - } - - float getOutput() { - return output; - } - - // Sigmoid function - public static float f(float x) { - return 1.0f / (1.0f + (float) Math.exp(-x)); - } - - public ArrayList getConnections() { - return connections; - } - - -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/OutputNeuron.java b/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/OutputNeuron.java deleted file mode 100644 index abe8daee4..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/code/src/OutputNeuron.java +++ /dev/null @@ -1,7 +0,0 @@ -package nn; - -public class OutputNeuron extends Neuron { - public OutputNeuron() { - super(); - } -} diff --git a/java/examples/Books/Nature of Code/chp10_nn/xor/xor.pde b/java/examples/Books/Nature of Code/chp10_nn/xor/xor.pde deleted file mode 100644 index dd73eef29..000000000 --- a/java/examples/Books/Nature of Code/chp10_nn/xor/xor.pde +++ /dev/null @@ -1,112 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// XOR Multi-Layered Neural Network Example -// Neural network code is all in the "code" folder - -import nn.*; - -ArrayList inputs; // List of training input values -Network nn; // Neural Network Object -int count; // Total training interations -Landscape land; // Solution space -float theta = 0.0; // Angle of rotation -PFont f; // Font - - -void setup() { - - size(400,400,P3D); - - // Create a landscape object - land = new Landscape(20,300,300); - - f = createFont("Courier",12,true); - - nn = new Network(2,4); - - // Create a list of 4 training inputs - inputs = new ArrayList(); - float[] input = new float[2]; - input[0] = 1; - input[1] = 0; - inputs.add((float []) input.clone()); - input[0] = 0; - input[1] = 1; - inputs.add((float []) input.clone()); - input[0] = 1; - input[1] = 1; - inputs.add((float []) input.clone()); - input[0] = 0; - input[1] = 0; - inputs.add((float []) input.clone()); -} - -void draw() { - - int trainingIterationsPerFrame = 5; - - for (int i = 0; i < trainingIterationsPerFrame; i++) { - // Pick a random training input - int pick = int(random(inputs.size())); - // Grab that input - float[] inp = (float[]) inputs.get(pick); - // Compute XOR - float known = 1; - if ((inp[0] == 1.0 && inp[1] == 1.0) || (inp[0] == 0 && inp[1] == 0)) known = 0; - // Train that sucker! - float result = nn.train(inp,known); - count++; - } - - // Ok, visualize the solution space - background(175); - pushMatrix(); - translate(width/2,height/2+20,-160); - rotateX(PI/3); - rotateZ(theta); - - // Put a little BOX on screen - pushMatrix(); - stroke(50); - noFill(); - translate(-10,-10,0); - box(280); - - // Draw the landscape - popMatrix(); - land.calculate(nn); - land.render(); - theta += 0.0025; - popMatrix(); - - // Display overal neural net stats - networkStatus(); - -} - - -void networkStatus() { - float mse = 0.0; - - textFont(f); - fill(0); - text("Your friendly neighborhood neural network solving XOR.",10,20); - text("Total iterations: " + count,10,40); - - for (int i = 0; i < inputs.size(); i++) { - float[] inp = (float[]) inputs.get(i); - float known = 1; - if ((inp[0] == 1.0 && inp[1] == 1.0) || (inp[0] == 0 && inp[1] == 0)) known = 0; - float result = nn.feedForward(inp); - //System.out.println("For: " + inp[0] + " " + inp[1] + ": " + result); - mse += (result - known)*(result - known); - } - - float rmse = sqrt(mse/4.0); - text("Root mean squared error: " + nf(rmse,1,5), 10,60); - -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/Mover.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/Mover.pde deleted file mode 100644 index 44b00fefe..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/Mover.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - // The Mover tracks location, velocity, and acceleration - PVector location; - PVector velocity; - PVector acceleration; - // The Mover's maximum speed - float topspeed; - - Mover() { - // Start in the center - location = new PVector(width/2,height/2); - velocity = new PVector(0,0); - topspeed = 5; - } - - void update() { - - // Compute a vector that points from location to mouse - PVector mouse = new PVector(mouseX,mouseY); - PVector acceleration = PVector.sub(mouse,location); - // Set magnitude of acceleration - //acceleration.setMag(0.2); - acceleration.normalize(); - acceleration.mult(0.2); - - // Velocity changes according to acceleration - velocity.add(acceleration); - // Limit the velocity by topspeed - velocity.limit(topspeed); - // Location changes by velocity - location.add(velocity); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x,location.y,48,48); - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/NOC_1_10_motion101_acceleration.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/NOC_1_10_motion101_acceleration.pde deleted file mode 100644 index baf4b6522..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_10_motion101_acceleration/NOC_1_10_motion101_acceleration.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A Mover object -Mover mover; - -void setup() { - size(800,200); - mover = new Mover(); -} - -void draw() { - background(255); - - // Update the location - mover.update(); - // Display the Mover - mover.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/Mover.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/Mover.pde deleted file mode 100644 index b0713e6ed..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/Mover.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - // The Mover tracks location, velocity, and acceleration - PVector location; - PVector velocity; - PVector acceleration; - // The Mover's maximum speed - float topspeed; - - Mover() { - // Start in the center - location = new PVector(random(width),random(height)); - velocity = new PVector(0,0); - topspeed = 5; - } - - void update() { - - // Compute a vector that points from location to mouse - PVector mouse = new PVector(mouseX,mouseY); - PVector acceleration = PVector.sub(mouse,location); - // Set magnitude of acceleration - //acceleration.setMag(0.2); - acceleration.normalize(); - acceleration.mult(0.2); - - // Velocity changes according to acceleration - velocity.add(acceleration); - // Limit the velocity by topspeed - velocity.limit(topspeed); - // Location changes by velocity - location.add(velocity); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127,200); - ellipse(location.x,location.y,48,48); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/NOC_1_11_motion101_acceleration_array.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/NOC_1_11_motion101_acceleration_array.pde deleted file mode 100644 index 40e9b48d6..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_11_motion101_acceleration_array/NOC_1_11_motion101_acceleration_array.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Demonstration of the basics of motion with vector. -// A "Mover" object stores location, velocity, and acceleration as vectors -// The motion is controlled by affecting the acceleration (in this case towards the mouse) - -Mover[] movers = new Mover[20]; - -void setup() { - size(800,200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(); - } -} - -void draw() { - - background(255); - - for (int i = 0; i < movers.length; i++) { - movers[i].update(); - movers[i].display(); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_1_bouncingball_novectors/NOC_1_1_bouncingball_novectors.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_1_bouncingball_novectors/NOC_1_1_bouncingball_novectors.pde deleted file mode 100644 index 09b4224a8..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_1_bouncingball_novectors/NOC_1_1_bouncingball_novectors.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example 1-1: Bouncing Ball, no vectors -float x = 100; -float y = 100; -float xspeed = 2.5; -float yspeed = 2; - -void setup() { - size(800, 200); - smooth(); -} - -void draw() { - background(255); - - - // Add the current speed to the location. - x = x + xspeed; - y = y + yspeed; - - if ((x > width) || (x < 0)) { - xspeed = xspeed * -1; - } - if ((y > height) || (y < 0)) { - yspeed = yspeed * -1; - } - - - // Display circle at x location - stroke(0); - strokeWeight(2); - fill(127); - ellipse(x, y, 48, 48); -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_2_bouncingball_vectors/NOC_1_2_bouncingball_vectors.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_2_bouncingball_vectors/NOC_1_2_bouncingball_vectors.pde deleted file mode 100644 index 232de4c48..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_2_bouncingball_vectors/NOC_1_2_bouncingball_vectors.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example 1-2: Bouncing Ball, with PVector! -PVector location; -PVector velocity; - -void setup() { - size(200,200); - background(255); - location = new PVector(100,100); - velocity = new PVector(2.5,5); -} - -void draw() { - noStroke(); - fill(255,10); - rect(0,0,width,height); - - // Add the current speed to the location. - location.add(velocity); - - if ((location.x > width) || (location.x < 0)) { - velocity.x = velocity.x * -1; - } - if ((location.y > height) || (location.y < 0)) { - velocity.y = velocity.y * -1; - } - - // Display circle at x location - stroke(0); - fill(175); - ellipse(location.x,location.y,16,16); -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_3_vector_subtraction/NOC_1_3_vector_subtraction.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_3_vector_subtraction/NOC_1_3_vector_subtraction.pde deleted file mode 100644 index a9659a409..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_3_vector_subtraction/NOC_1_3_vector_subtraction.pde +++ /dev/null @@ -1,26 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example 1-3: Vector subtraction - -void setup() { - size(800,200); - smooth(); -} - -void draw() { - background(255); - - PVector mouse = new PVector(mouseX,mouseY); - PVector center = new PVector(width/2,height/2); - mouse.sub(center); - - translate(width/2,height/2); - strokeWeight(2); - stroke(0); - line(0,0,mouse.x,mouse.y); - -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_4_vector_multiplication/NOC_1_4_vector_multiplication.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_4_vector_multiplication/NOC_1_4_vector_multiplication.pde deleted file mode 100644 index 3f7f76b3f..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_4_vector_multiplication/NOC_1_4_vector_multiplication.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example 1-4: Vector multiplication - -void setup() { - size(800,200); - smooth(); -} - -void draw() { - background(255); - - PVector mouse = new PVector(mouseX,mouseY); - PVector center = new PVector(width/2,height/2); - mouse.sub(center); - - // Multiplying a vector! The vector is now half its original size (multiplied by 0.5). - mouse.mult(0.5); - - translate(width/2,height/2); - strokeWeight(2); - stroke(0); - line(0,0,mouse.x,mouse.y); -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_5_vector_magnitude/NOC_1_5_vector_magnitude.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_5_vector_magnitude/NOC_1_5_vector_magnitude.pde deleted file mode 100644 index 53d0b99a1..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_5_vector_magnitude/NOC_1_5_vector_magnitude.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example 1-5: Vector magnitude - -void setup() { - size(800,200); - smooth(); -} - -void draw() { - background(255); - - PVector mouse = new PVector(mouseX,mouseY); - PVector center = new PVector(width/2,height/2); - mouse.sub(center); - - float m = mouse.mag(); - fill(0); - noStroke(); - rect(0,0,m,10); - - translate(width/2,height/2); - stroke(0); - strokeWeight(2); - line(0,0,mouse.x,mouse.y); - -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_6_vector_normalize/NOC_1_6_vector_normalize.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_6_vector_normalize/NOC_1_6_vector_normalize.pde deleted file mode 100644 index 659d8a512..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_6_vector_normalize/NOC_1_6_vector_normalize.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Demonstration of normalizing a vector. -// Normalizing a vector sets its length to 1. - -void setup() { - size(800,200); - smooth(); -} - -void draw() { - background(255); - - // A vector that points to the mouse location - PVector mouse = new PVector(mouseX,mouseY); - // A vector that points to the center of the window - PVector center = new PVector(width/2,height/2); - // Subtract center from mouse which results in a vector that points from center to mouse - mouse.sub(center); - - // Normalize the vector - mouse.normalize(); - - // Multiply its length by 50 - mouse.mult(150); - - translate(width/2,height/2); - // Draw the resulting vector - stroke(0); - strokeWeight(2); - line(0,0,mouse.x,mouse.y); - -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/Mover.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/Mover.pde deleted file mode 100644 index 8d7abe902..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/Mover.pde +++ /dev/null @@ -1,43 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - - Mover() { - location = new PVector(random(width), random(height)); - velocity = new PVector(random(-2, 2), random(-2, 2)); - } - - void update() { - location.add(velocity); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x, location.y, 48, 48); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } - else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - location.y = 0; - } - else if (location.y < 0) { - location.y = height; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/NOC_1_7_motion101.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/NOC_1_7_motion101.pde deleted file mode 100644 index 9f968a254..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_7_motion101/NOC_1_7_motion101.pde +++ /dev/null @@ -1,19 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover mover; - -void setup() { - size(800,200); - mover = new Mover(); -} - -void draw() { - background(255); - - mover.update(); - mover.checkEdges(); - mover.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/Mover.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/Mover.pde deleted file mode 100644 index fdf9f5093..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/Mover.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float topspeed; - - Mover() { - location = new PVector(width/2, height/2); - velocity = new PVector(0, 0); - acceleration = new PVector(-0.001, 0.01); - topspeed = 10; - } - - void update() { - velocity.add(acceleration); - velocity.limit(topspeed); - location.add(velocity); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x, location.y, 48, 48); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } - else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - location.y = 0; - } - else if (location.y < 0) { - location.y = height; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/NOC_1_8_motion101_acceleration.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/NOC_1_8_motion101_acceleration.pde deleted file mode 100644 index 3d1668104..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_8_motion101_acceleration/NOC_1_8_motion101_acceleration.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover mover; - -void setup() { - size(800,200); - mover = new Mover(); -} - -void draw() { - background(255); - - mover.update(); - mover.checkEdges(); - mover.display(); -} - - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/Mover.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/Mover.pde deleted file mode 100644 index d5644bff2..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/Mover.pde +++ /dev/null @@ -1,52 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float topspeed; - - Mover() { - location = new PVector(width/2, height/2); - velocity = new PVector(0, 0); - topspeed = 6; - } - - void update() { - - acceleration = PVector.random2D(); - acceleration.mult(random(2)); - - velocity.add(acceleration); - velocity.limit(topspeed); - location.add(velocity); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x, location.y, 48, 48); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } - else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - location.y = 0; - } - else if (location.y < 0) { - location.y = height; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/NOC_1_9_motion101_acceleration.pde b/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/NOC_1_9_motion101_acceleration.pde deleted file mode 100644 index 30e22723f..000000000 --- a/java/examples/Books/Nature of Code/chp1_vectors/NOC_1_9_motion101_acceleration/NOC_1_9_motion101_acceleration.pde +++ /dev/null @@ -1,18 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover mover; - -void setup() { - size(800,200); - mover = new Mover(); -} - -void draw() { - background(255); - mover.update(); - mover.checkEdges(); - mover.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Attractor.pde b/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Attractor.pde deleted file mode 100644 index bff0c1f5c..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Attractor.pde +++ /dev/null @@ -1,75 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - PVector location; // Location - boolean dragging = false; // Is the object being dragged? - boolean rollover = false; // Is the mouse over the ellipse? - PVector drag; // holds the offset for when object is clicked on - - Attractor() { - location = new PVector(width/2,height/2); - mass = 10; - drag = new PVector(0.0,0.0); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float d = force.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (g * mass * m.mass) / (d * d); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - ellipseMode(CENTER); - stroke(0); - if (dragging) fill (50); - else if (rollover) fill(100); - else fill(0); - ellipse(location.x,location.y,mass*6,mass*6); - } - - // The methods below are for mouse interaction - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - drag.x = location.x-mx; - drag.y = location.y-my; - } - } - - void rollover(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - rollover = true; - } - else { - rollover = false; - } - } - - void stopDragging() { - dragging = false; - } - - - - void drag() { - if (dragging) { - location.x = mouseX + drag.x; - location.y = mouseY + drag.y; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Exercise_2_10_attractrepel.pde b/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Exercise_2_10_attractrepel.pde deleted file mode 100644 index 03eefdbc6..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Exercise_2_10_attractrepel.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -Attractor a; - -float g = 1; - -void setup() { - size(800,200); - a = new Attractor(); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(4,12),random(width),random(height)); - } -} - -void draw() { - background(255); - - a.display(); - - - for (int i = 0; i < movers.length; i++) { - for (int j = 0; j < movers.length; j++) { - if (i != j) { - PVector force = movers[j].repel(movers[i]); - movers[i].applyForce(force); - } - } - - PVector force = a.attract(movers[i]); - movers[i].applyForce(force); - movers[i].update(); - movers[i].display(); - } - - - -} - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Mover.pde deleted file mode 100644 index 0725db4c9..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/Exercise_2_10_attractrepel/Mover.pde +++ /dev/null @@ -1,73 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x , float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - fill(175,200); - ellipse(location.x,location.y,mass*2,mass*2); - } - - PVector repel(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float distance = force.mag(); // Distance between objects - distance = constrain(distance,1.0,10000.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction - - float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude - force.mult(-1*strength); // Get force vector --> magnitude * direction - return force; - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } - else if (location.x < 0) { - location.x = 0; - velocity.x *= -1; - } - - if (location.y > height) { - location.y = height; - velocity.y *= -1; - } - else if (location.y < 0) { - location.y = 0; - velocity.y *= -1; - } - - } - -} - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Extra_instantforce.pde b/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Extra_instantforce.pde deleted file mode 100644 index ac2636abd..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Extra_instantforce.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover m; - -float t = 0.0; - -void setup() { - size(640, 360); - m = new Mover(); -} - -void draw() { - background(255); - - // Perlin noise wind - float wx = map(noise(t),0,1,-1,1); - PVector wind = new PVector(wx, 0); - t += 0.01; - line(width/2,height/2,width/2+wind.x*100,height/2+wind.y*100); - m.applyForce(wind); - - // Gravity - PVector gravity = new PVector(0, 0.1); - //m.applyForce(gravity); - - // Shake force - //m.shake(); - - // Boundary force - if (m.location.x > width - 50) { - PVector boundary = new PVector(-1,0); - m.applyForce(boundary); - } else if (m.location.x < 50) { - PVector boundary = new PVector(1,0); - m.applyForce(boundary); - } - - - - - m.update(); - m.display(); - //m.checkEdges(); -} - -// Instant Force -void mousePressed() { - PVector cannon = PVector.random2D(); - cannon.mult(5); - m.applyForce(cannon); -} - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Mover.pde deleted file mode 100644 index 681cfed16..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/Extra_instantforce/Mover.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover() { - location = new PVector(width/2,height/2); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - mass = 1; - } - - void shake() { - PVector force = PVector.random2D(); - force.mult(0.7); - applyForce(force); - - - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - - // Simple friction - velocity.mult(0.95); - - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x,location.y,48,48); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - velocity.x *= -1; - location.x = 0; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Attractor.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Attractor.pde deleted file mode 100644 index a242a2ef2..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Attractor.pde +++ /dev/null @@ -1,42 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - PVector location; // Location - float g; - - Attractor() { - location = new PVector(0,0); - mass = 20; - g = 0.4; - } - - - PVector attract(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float distance = force.mag(); // Distance between objects - distance = constrain(distance,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - stroke(255); - noFill(); - pushMatrix(); - translate(location.x,location.y,location.z); - sphere(mass*2); - popMatrix(); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Mover.pde deleted file mode 100644 index 5a5b3dcdf..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/Mover.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x, float y, float z) { - mass = m; - location = new PVector(x,y,z); - velocity = new PVector(1,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - noStroke(); - fill(255); - pushMatrix(); - translate(location.x,location.y,location.z); - sphere(mass*8); - popMatrix(); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } - else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/NOC_02forces_many_attraction_3D.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/NOC_02forces_many_attraction_3D.pde deleted file mode 100644 index 5faf4dca0..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_attraction_3D/NOC_02forces_many_attraction_3D.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -import processing.opengl.*; - -Mover[] movers = new Mover[10]; - -Attractor a; - -float angle = 0; - -void setup() { - size(800,200,OPENGL); - background(255); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.1,2),random(-width/2,width/2),random(-height/2,height/2),random(-100,100)); - } - a = new Attractor(); -} - -void draw() { - background(0); - sphereDetail(8); - lights(); - translate(width/2,height/2); - rotateY(angle); - - - a.display(); - - for (int i = 0; i < movers.length; i++) { - PVector force = a.attract(movers[i]); - movers[i].applyForce(force); - - movers[i].update(); - movers[i].display(); - } - - angle += 0.003; - -} - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/Mover.pde deleted file mode 100644 index ed666c5f0..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/Mover.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x, y); - velocity = new PVector(0, 0); - acceleration = new PVector(0, 0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force, mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - fill(175, 200); - ellipse(location.x, location.y, mass*16, mass*16); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location, m.location); // Calculate direction of force - float distance = force.mag(); // Distance between objects - distance = constrain(distance, 5.0, 25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction - - float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - void boundaries() { - - float d = 50; - - PVector force = new PVector(0, 0); - - if (location.x < d) { - force.x = 1; - } - else if (location.x > width -d) { - force.x = -1; - } - - if (location.y < d) { - force.y = 1; - } - else if (location.y > height-d) { - force.y = -1; - } - - force.normalize(); - force.mult(0.1); - - applyForce(force); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/NOC_02forces_many_mutual_boundaries.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/NOC_02forces_many_mutual_boundaries.pde deleted file mode 100644 index caf6d8b63..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_02forces_many_mutual_boundaries/NOC_02forces_many_mutual_boundaries.pde +++ /dev/null @@ -1,47 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -float g = 0.4; - -void setup() { - size(800,200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(1,2),random(width),random(height)); - } -} - -void draw() { - background(255); - - - for (int i = 0; i < movers.length; i++) { - for (int j = 0; j < movers.length; j++) { - if (i != j) { - PVector force = movers[j].attract(movers[i]); - movers[i].applyForce(force); - } - } - - movers[i].boundaries(); - - movers[i].update(); - movers[i].display(); - } - -} - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/Mover.pde deleted file mode 100644 index 839b1afdc..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/Mover.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover() { - location = new PVector(30,30); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - mass = 1; - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x,location.y,48,48); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - velocity.x *= -1; - location.x = 0; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/NOC_2_1_forces.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/NOC_2_1_forces.pde deleted file mode 100644 index 92713efaa..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_1_forces/NOC_2_1_forces.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover m; - -void setup() { - size(640,360); - m = new Mover(); -} - -void draw() { - background(255); - - PVector wind = new PVector(0.01,0); - PVector gravity = new PVector(0,0.1); - m.applyForce(wind); - m.applyForce(gravity); - - - m.update(); - m.display(); - m.checkEdges(); - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/Mover.pde deleted file mode 100644 index 6b008918c..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/Mover.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x , float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0,127); - ellipse(location.x,location.y,mass*16,mass*16); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - velocity.x *= -1; - location.x = 0; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/NOC_2_2_forces_many.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/NOC_2_2_forces_many.pde deleted file mode 100644 index db74a7634..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_2_forces_many/NOC_2_2_forces_many.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -void setup() { - size(800,200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.1,4),0,0); - } -} - -void draw() { - background(255); - - for (int i = 0; i < movers.length; i++) { - - PVector wind = new PVector(0.01,0); - PVector gravity = new PVector(0,0.1); - - movers[i].applyForce(wind); - movers[i].applyForce(gravity); - - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } - -} - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/Mover.pde deleted file mode 100644 index 6b008918c..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/Mover.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x , float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0,127); - ellipse(location.x,location.y,mass*16,mass*16); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - velocity.x *= -1; - location.x = 0; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/NOC_2_3_forces_many_realgravity.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/NOC_2_3_forces_many_realgravity.pde deleted file mode 100644 index c3ecd8488..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_3_forces_many_realgravity/NOC_2_3_forces_many_realgravity.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -void setup() { - size(800, 200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(1, 4), 0, 0); - } -} - -void draw() { - background(255); - - for (int i = 0; i < movers.length; i++) { - - PVector wind = new PVector(0.01, 0); - PVector gravity = new PVector(0, 0.1*movers[i].mass); - - movers[i].applyForce(wind); - movers[i].applyForce(gravity); - - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } -} - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/Mover.pde deleted file mode 100644 index 263724c51..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/Mover.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x , float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0,127); - ellipse(location.x,location.y,mass*16,mass*16); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - location.x = 0; - velocity.x *= -1; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/NOC_2_4_forces_friction.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/NOC_2_4_forces_friction.pde deleted file mode 100644 index 02c417066..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_friction/NOC_2_4_forces_friction.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[5]; - -void setup() { - size(383, 200); - randomSeed(1); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(1, 4), random(width), 0); - } -} - -void draw() { - background(255); - - for (int i = 0; i < movers.length; i++) { - - PVector wind = new PVector(0.01, 0); - PVector gravity = new PVector(0, 0.1*movers[i].mass); - - float c = 0.05; - PVector friction = movers[i].velocity.get(); - friction.mult(-1); - friction.normalize(); - friction.mult(c); - - movers[i].applyForce(friction); - movers[i].applyForce(wind); - movers[i].applyForce(gravity); - - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } -} - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/Mover.pde deleted file mode 100644 index 263724c51..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/Mover.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x , float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(0,0); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0,127); - ellipse(location.x,location.y,mass*16,mass*16); - } - - void checkEdges() { - - if (location.x > width) { - location.x = width; - velocity.x *= -1; - } else if (location.x < 0) { - location.x = 0; - velocity.x *= -1; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/NOC_2_4_forces_nofriction.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/NOC_2_4_forces_nofriction.pde deleted file mode 100644 index 029236deb..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_4_forces_nofriction/NOC_2_4_forces_nofriction.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[5]; - -void setup() { - size(383, 200); - randomSeed(1); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(1, 4), random(width), 0); - } -} - -void draw() { - background(255); - - for (int i = 0; i < movers.length; i++) { - - PVector wind = new PVector(0.01, 0); - PVector gravity = new PVector(0, 0.1*movers[i].mass); - - float c = 0.05; - PVector friction = movers[i].velocity.get(); - friction.mult(-1); - friction.normalize(); - friction.mult(c); - - //movers[i].applyForce(friction); - movers[i].applyForce(wind); - movers[i].applyForce(gravity); - - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } -} - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Liquid.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Liquid.pde deleted file mode 100644 index b0ea9b736..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Liquid.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - - // Liquid class - class Liquid { - - - // Liquid is a rectangle - float x,y,w,h; - // Coefficient of drag - float c; - - Liquid(float x_, float y_, float w_, float h_, float c_) { - x = x_; - y = y_; - w = w_; - h = h_; - c = c_; - } - - // Is the Mover in the Liquid? - boolean contains(Mover m) { - PVector l = m.location; - if (l.x > x && l.x < x + w && l.y > y && l.y < y + h) { - return true; - } - else { - return false; - } - } - - // Calculate drag force - PVector drag(Mover m) { - // Magnitude is coefficient * speed squared - float speed = m.velocity.mag(); - float dragMagnitude = c * speed * speed; - - // Direction is inverse of velocity - PVector dragForce = m.velocity.get(); - dragForce.mult(-1); - - // Scale according to magnitude - // dragForce.setMag(dragMagnitude); - dragForce.normalize(); - dragForce.mult(dragMagnitude); - return dragForce; - } - - void display() { - noStroke(); - fill(50); - rect(x,y,w,h); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Mover.pde deleted file mode 100644 index 791e90954..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/Mover.pde +++ /dev/null @@ -1,58 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - // location, velocity, and acceleration - PVector location; - PVector velocity; - PVector acceleration; - - // Mass is tied to size - float mass; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x, y); - velocity = new PVector(0, 0); - acceleration = new PVector(0, 0); - } - - // Newton's 2nd law: F = M * A - // or A = F / M - void applyForce(PVector force) { - // Divide by mass - PVector f = PVector.div(force, mass); - // Accumulate all forces in acceleration - acceleration.add(f); - } - - void update() { - - // Velocity changes according to acceleration - velocity.add(acceleration); - // Location changes by velocity - location.add(velocity); - // We must clear acceleration each frame - acceleration.mult(0); - } - - // Draw Mover - void display() { - stroke(0); - strokeWeight(2); - fill(127, 200); - ellipse(location.x, location.y, mass*16, mass*16); - } - - // Bounce off bottom of window - void checkEdges() { - if (location.y > height) { - velocity.y *= -0.9; // A little dampening when hitting the bottom - location.y = height; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/NOC_2_5_fluidresistance.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/NOC_2_5_fluidresistance.pde deleted file mode 100644 index ff9573d6d..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance/NOC_2_5_fluidresistance.pde +++ /dev/null @@ -1,72 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Forces (Gravity and Fluid Resistence) with Vectors - -// Demonstration of multiple force acting on bodies (Mover class) -// Bodies experience gravity continuously -// Bodies experience fluid resistance when in "water" - -// Five moving bodies -Mover[] movers = new Mover[11]; - -// Liquid -Liquid liquid; - -void setup() { - size(800, 200); - reset(); - // Create liquid object - liquid = new Liquid(0, height/2, width, height/2, 0.1); -} - -void draw() { - background(255); - - // Draw water - liquid.display(); - - for (int i = 0; i < movers.length; i++) { - - // Is the Mover in the liquid? - if (liquid.contains(movers[i])) { - // Calculate drag force - PVector dragForce = liquid.drag(movers[i]); - // Apply drag force to Mover - movers[i].applyForce(dragForce); - } - - // Gravity is scaled by mass here! - PVector gravity = new PVector(0, 0.1*movers[i].mass); - // Apply gravity - movers[i].applyForce(gravity); - - // Update and display - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } - - fill(0); - text("click mouse to reset",10,30); - -} - -void mousePressed() { - reset(); -} - -// Restart all the Mover objects randomly -void reset() { - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.5, 3), 40+i*70, 0); - } -} - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Liquid.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Liquid.pde deleted file mode 100644 index bce05cc7c..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Liquid.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - - // Liquid class - class Liquid { - - - // Liquid is a rectangle - float x,y,w,h; - // Coefficient of drag - float c; - - Liquid(float x_, float y_, float w_, float h_, float c_) { - x = x_; - y = y_; - w = w_; - h = h_; - c = c_; - } - - // Is the Mover in the Liquid? - boolean contains(Mover m) { - PVector l = m.location; - if (l.x > x && l.x < x + w && l.y > y && l.y < y + h) { - return true; - } - else { - return false; - } - } - - // Calculate drag force - PVector drag(Mover m) { - // Magnitude is coefficient * speed squared - float speed = m.velocity.mag(); - float dragMagnitude = c * speed * speed; - - // Direction is inverse of velocity - PVector dragForce = m.velocity.get(); - dragForce.mult(-1); - - // Scale according to magnitude - // dragForce.setMag(dragMagnitude); - dragForce.normalize(); - dragForce.mult(dragMagnitude); - return dragForce; - } - - void display() { - noStroke(); - fill(50); - rect(x,y,w,h); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Mover.pde deleted file mode 100644 index d45e3b664..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/Mover.pde +++ /dev/null @@ -1,58 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - // location, velocity, and acceleration - PVector location; - PVector velocity; - PVector acceleration; - - // Mass is tied to size - float mass; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x, y); - velocity = new PVector(0, 0); - acceleration = new PVector(0, 0); - } - - // Newton's 2nd law: F = M * A - // or A = F / M - void applyForce(PVector force) { - // Divide by mass - PVector f = PVector.div(force, mass); - // Accumulate all forces in acceleration - acceleration.add(f); - } - - void update() { - - // Velocity changes according to acceleration - velocity.add(acceleration); - // Location changes by velocity - location.add(velocity); - // We must clear acceleration each frame - acceleration.mult(0); - } - - // Draw Mover - void display() { - stroke(0); - strokeWeight(2*2.25); - fill(127,200); - ellipse(location.x, location.y, mass*16, mass*16); - } - - // Bounce off bottom of window - void checkEdges() { - if (location.y > height) { - velocity.y *= -0.9; // A little dampening when hitting the bottom - location.y = height; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/NOC_2_5_fluidresistance_sequence.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/NOC_2_5_fluidresistance_sequence.pde deleted file mode 100644 index 99d47915b..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_5_fluidresistance_sequence/NOC_2_5_fluidresistance_sequence.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Forces (Gravity and Fluid Resistence) with Vectors - -// Demonstration of multiple force acting on bodies (Mover class) -// Bodies experience gravity continuously -// Bodies experience fluid resistance when in "water" - -// Five moving bodies -Mover[] movers = new Mover[5]; - -// Liquid -Liquid liquid; - -void setup() { - size(450, 450); - randomSeed(1); - reset(); - // Create liquid object - liquid = new Liquid(0, height/2, width, height/2, 0.1); -} - -void draw() { - background(255); - - // Draw water - liquid.display(); - - for (int i = 0; i < movers.length; i++) { - - // Is the Mover in the liquid? - if (liquid.contains(movers[i])) { - // Calculate drag force - PVector dragForce = liquid.drag(movers[i]); - // Apply drag force to Mover - movers[i].applyForce(dragForce); - } - - // Gravity is scaled by mass here! - PVector gravity = new PVector(0, 0.1*movers[i].mass); - // Apply gravity - movers[i].applyForce(gravity); - - // Update and display - movers[i].update(); - movers[i].display(); - movers[i].checkEdges(); - } - - fill(255); - //text("click mouse to reset",10,30); - - if (frameCount % 20 == 0) saveFrame("ch2_05_####.png"); -} - -void mousePressed() { - reset(); -} - -// Restart all the Mover objects randomly -void reset() { - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.5*2.25,3*2.25), 20*2.25+i*40*2.25, 0); - } -} - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Attractor.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Attractor.pde deleted file mode 100644 index 556605cb7..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Attractor.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - float G; // Gravitational Constant - PVector location; // Location - boolean dragging = false; // Is the object being dragged? - boolean rollover = false; // Is the mouse over the ellipse? - PVector dragOffset; // holds the offset for when object is clicked on - - Attractor() { - location = new PVector(width/2,height/2); - mass = 20; - G = 1; - dragOffset = new PVector(0.0,0.0); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float d = force.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (G * mass * m.mass) / (d * d); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - ellipseMode(CENTER); - strokeWeight(4); - stroke(0); - if (dragging) fill (50); - else if (rollover) fill(100); - else fill(175,200); - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void hover(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - rollover = true; - } - else { - rollover = false; - } - } - - void stopDragging() { - dragging = false; - } - - - - void drag() { - if (dragging) { - location.x = mouseX + dragOffset.x; - location.y = mouseY + dragOffset.y; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Mover.pde deleted file mode 100644 index 7c35ead44..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/Mover.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover() { - location = new PVector(400,50); - velocity = new PVector(1,0); - acceleration = new PVector(0,0); - mass = 1; - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x,location.y,16,16); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/NOC_2_6_attraction.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/NOC_2_6_attraction.pde deleted file mode 100644 index d2ab1284a..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_6_attraction/NOC_2_6_attraction.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover m; -Attractor a; - -void setup() { - size(640,360); - m = new Mover(); - a = new Attractor(); -} - -void draw() { - background(255); - - PVector force = a.attract(m); - m.applyForce(force); - m.update(); - - a.drag(); - a.hover(mouseX,mouseY); - - a.display(); - m.display(); -} - -void mousePressed() { - a.clicked(mouseX,mouseY); -} - -void mouseReleased() { - a.stopDragging(); -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Attractor.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Attractor.pde deleted file mode 100644 index 556605cb7..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Attractor.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - float G; // Gravitational Constant - PVector location; // Location - boolean dragging = false; // Is the object being dragged? - boolean rollover = false; // Is the mouse over the ellipse? - PVector dragOffset; // holds the offset for when object is clicked on - - Attractor() { - location = new PVector(width/2,height/2); - mass = 20; - G = 1; - dragOffset = new PVector(0.0,0.0); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float d = force.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (G * mass * m.mass) / (d * d); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - ellipseMode(CENTER); - strokeWeight(4); - stroke(0); - if (dragging) fill (50); - else if (rollover) fill(100); - else fill(175,200); - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void hover(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - rollover = true; - } - else { - rollover = false; - } - } - - void stopDragging() { - dragging = false; - } - - - - void drag() { - if (dragging) { - location.x = mouseX + dragOffset.x; - location.y = mouseY + dragOffset.y; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Mover.pde deleted file mode 100644 index 245dd0c3e..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/Mover.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x, y); - velocity = new PVector(1, 0); - acceleration = new PVector(0, 0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force, mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0,100); - ellipse(location.x, location.y, mass*25, mass*25); - } -} - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/NOC_2_7_attraction_many.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/NOC_2_7_attraction_many.pde deleted file mode 100644 index e7f5b1c5b..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_7_attraction_many/NOC_2_7_attraction_many.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[10]; - -Attractor a; - -void setup() { - size(800, 200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.1, 2), random(width), random(height)); - } - a = new Attractor(); - } - -void draw() { - background(255); - - a.display(); - a.drag(); - a.hover(mouseX, mouseY); - - for (int i = 0; i < movers.length; i++) { - PVector force = a.attract(movers[i]); - movers[i].applyForce(force); - - movers[i].update(); - movers[i].display(); - } -} - -void mousePressed() { - a.clicked(mouseX, mouseY); -} - -void mouseReleased() { - a.stopDragging(); -} - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/Mover.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/Mover.pde deleted file mode 100644 index 63b9dbc67..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/Mover.pde +++ /dev/null @@ -1,52 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x, y); - velocity = new PVector(0, 0); - acceleration = new PVector(0, 0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force, mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(0, 100); - ellipse(location.x, location.y, mass*24, mass*24); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location, m.location); // Calculate direction of force - float distance = force.mag(); // Distance between objects - distance = constrain(distance, 5.0, 25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction - - float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - -} - - - diff --git a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/NOC_2_8_mutual_attraction.pde b/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/NOC_2_8_mutual_attraction.pde deleted file mode 100644 index 3a6ef45a8..000000000 --- a/java/examples/Books/Nature of Code/chp2_forces/NOC_2_8_mutual_attraction/NOC_2_8_mutual_attraction.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -float g = 0.4; - -void setup() { - size(800,200); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.1,2),random(width),random(height)); - } -} - -void draw() { - background(255); - - - for (int i = 0; i < movers.length; i++) { - for (int j = 0; j < movers.length; j++) { - if (i != j) { - PVector force = movers[j].attract(movers[i]); - movers[i].applyForce(force); - } - } - - movers[i].update(); - movers[i].display(); - } - -} - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/AdditiveWave/AdditiveWave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/AdditiveWave/AdditiveWave.pde deleted file mode 100644 index 2636374b8..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/AdditiveWave/AdditiveWave.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Additive Wave -// Create a more complex wave by adding two waves together. - -// Maybe better for this answer to be OOP??? - -int xspacing = 8; // How far apart should each horizontal location be spaced -int w; // Width of entire wave -int maxwaves = 5; // total # of waves to add together - -float theta = 0.0; -float[] amplitude = new float[maxwaves]; // Height of wave -float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing -float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) - -void setup() { - size(640,360); - colorMode(RGB, 255, 255, 255, 100); - w = width + 16; - - for (int i = 0; i < maxwaves; i++) { - amplitude[i] = random(10,30); - float period = random(100,300); // How many pixels before the wave repeats - dx[i] = (TWO_PI / period) * xspacing; - } - - yvalues = new float[w/xspacing]; -} - -void draw() { - background(0); - calcWave(); - renderWave(); -} - -void calcWave() { - // Increment theta (try different values for 'angular velocity' here - theta += 0.02; - - // Set all height values to zero - for (int i = 0; i < yvalues.length; i++) { - yvalues[i] = 0; - } - - // Accumulate wave height values - for (int j = 0; j < maxwaves; j++) { - float x = theta; - for (int i = 0; i < yvalues.length; i++) { - // Every other wave is cosine instead of sine - if (j % 2 == 0) yvalues[i] += sin(x)*amplitude[j]; - else yvalues[i] += cos(x)*amplitude[j]; - x+=dx[j]; - } - } -} - -void renderWave() { - // A simple way to draw the wave with an ellipse at each location - noStroke(); - fill(255,50); - ellipseMode(CENTER); - for (int x = 0; x < yvalues.length; x++) { - ellipse(x*xspacing,height/2+yvalues[x],16,16); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/AttractionArrayWithOscillation.pde b/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/AttractionArrayWithOscillation.pde deleted file mode 100644 index 8f58c9712..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/AttractionArrayWithOscillation.pde +++ /dev/null @@ -1,46 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction Array with Oscillating objects around each Crawler - -// Click and drag attractive body to move throughout space - -Crawler[] crawlers = new Crawler[6]; -Attractor a; - -void setup() { - size(640,360); - // Some random bodies - for (int i = 0; i < crawlers.length; i++) { - crawlers[i] = new Crawler(); - } - // Create an attractive body - a = new Attractor(new PVector(width/2,height/2),20,0.4); -} - -void draw() { - background(255); - a.rollover(mouseX,mouseY); - a.go(); - - for (int i = 0; i < crawlers.length; i++) { - // Calculate a force exerted by "attractor" on "Crawler" - PVector f = a.attract(crawlers[i]); - // Apply that force to the Crawler - crawlers[i].applyForce(f); - // Update and render - crawlers[i].update(); - crawlers[i].display(); - } - - -} - -void mousePressed() { - a.clicked(mouseX,mouseY); -} - -void mouseReleased() { - a.stopDragging(); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Attractor.pde b/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Attractor.pde deleted file mode 100644 index 4e97f0cab..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Attractor.pde +++ /dev/null @@ -1,82 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - float G; // Gravitational Constant - PVector loc; // Location - boolean dragging = false; // Is the object being dragged? - boolean rollover = false; // Is the mouse over the ellipse? - PVector drag; // holds the offset for when object is clicked on - - Attractor(PVector l_,float m_, float g_) { - loc = l_.get(); - mass = m_; - G = g_; - drag = new PVector(0.0,0.0); - } - - void go() { - render(); - drag(); - } - - PVector attract(Crawler c) { - PVector dir = PVector.sub(loc,c.loc); // Calculate direction of force - float d = dir.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - dir.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float force = (G * mass * c.mass) / (d * d); // Calculate gravitional force magnitude - dir.mult(force); // Get force vector --> magnitude * direction - return dir; - } - - // Method to display - void render() { - ellipseMode(CENTER); - stroke(0,100); - if (dragging) fill (50); - else if (rollover) fill(100); - else fill(175,50); - ellipse(loc.x,loc.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - void clicked(int mx, int my) { - float d = dist(mx,my,loc.x,loc.y); - if (d < mass) { - dragging = true; - drag.x = loc.x-mx; - drag.y = loc.y-my; - } - } - - void rollover(int mx, int my) { - float d = dist(mx,my,loc.x,loc.y); - if (d < mass) { - rollover = true; - } else { - rollover = false; - } - } - - void stopDragging() { - dragging = false; - } - - - - void drag() { - if (dragging) { - loc.x = mouseX + drag.x; - loc.y = mouseY + drag.y; - } - } - -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Crawler.pde b/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Crawler.pde deleted file mode 100644 index 7c03641ee..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Crawler.pde +++ /dev/null @@ -1,58 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction - -// A class to describe a thing in our world, has vectors for location, velocity, and acceleration -// Also includes scalar values for mass, maximum velocity, and elasticity - -class Crawler { - PVector loc; - PVector vel; - PVector acc; - float mass; - - Oscillator osc; - - Crawler() { - acc = new PVector(); - vel = new PVector(random(-1,1),random(-1,1)); - loc = new PVector(random(width),random(height)); - mass = random(8,16); - osc = new Oscillator(mass*2); - } - - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acc.add(f); - } - - // Method to update location - void update() { - vel.add(acc); - loc.add(vel); - // Multiplying by 0 sets the all the components to 0 - acc.mult(0); - - osc.update(vel.mag()/10); - } - - // Method to display - void display() { - float angle = vel.heading2D(); - pushMatrix(); - translate(loc.x,loc.y); - rotate(angle); - ellipseMode(CENTER); - stroke(0); - fill(175,100); - ellipse(0,0,mass*2,mass*2); - - osc.display(loc); - popMatrix(); - - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Oscillator.pde b/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Oscillator.pde deleted file mode 100644 index 2f4d4506d..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/AttractionArrayWithOscillation/Oscillator.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction Array with Oscillating objects around each thing - -class Oscillator { - - // Because we are going to oscillate along the x and y axis we can use PVector for two angles, amplitudes, etc.! - float theta; - float amplitude; - - Oscillator(float r) { - - // Initialize randomly - theta = 0; - amplitude = r; - - } - - // Update theta and offset - void update(float thetaVel) { - theta += thetaVel; - } - - // Display based on a location - void display(PVector loc) { - float x = map(cos(theta),-1,1,0,amplitude); - - stroke(0); - fill(50); - line(0,0,x,0); - ellipse(x,0,8,8); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_01_exercise_baton/Exercise_3_01_exercise_baton.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_01_exercise_baton/Exercise_3_01_exercise_baton.pde deleted file mode 100644 index 590ea83ab..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_01_exercise_baton/Exercise_3_01_exercise_baton.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle = 0; - -void setup() { - size(750, 150); - smooth(); -} - -void draw() { - background(255); - - fill(127); - stroke(0); - rectMode(CENTER); - translate(width/2, height/2); - rotate(angle); - line(-50, 0, 50, 0); - stroke(0); - strokeWeight(2); - fill(127); - ellipse(50, 0, 16, 16); - ellipse(-50, 0, 16, 16); - angle += 0.05; -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/CannonBall.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/CannonBall.pde deleted file mode 100644 index 80a9ca8ba..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/CannonBall.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class CannonBall { - // All of our regular motion stuff - PVector location; - PVector velocity; - PVector acceleration; - - // Size - float r = 8; - - float topspeed = 10; - - CannonBall(float x, float y) { - location = new PVector(x,y); - velocity = new PVector(); - acceleration = new PVector(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.limit(topspeed); - location.add(velocity); - acceleration.mult(0); - } - - void applyForce(PVector force) { - acceleration.add(force); - } - - - void display() { - stroke(0); - strokeWeight(2); - pushMatrix(); - translate(location.x,location.y); - ellipse(0,0,r*2,r*2); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/Exercise_3_03_cannon.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/Exercise_3_03_cannon.pde deleted file mode 100644 index 72313eaa9..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_03_cannon/Exercise_3_03_cannon.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - - -// All of this stuff should go into a Cannon class -float angle = -PI/4; -PVector location = new PVector(50, 300); -boolean shot = false; - -CannonBall ball; - -void setup() { - size(640, 360); - ball = new CannonBall(location.x, location.y); -} - -void draw() { - background(255); - - pushMatrix(); - translate(location.x, location.y); - rotate(angle); - rect(0, -5, 50, 10); - popMatrix(); - - if (shot) { - PVector gravity = new PVector(0, 0.2); - ball.applyForce(gravity); - ball.update(); - } - ball.display(); - - if (ball.location.y > height) { - ball = new CannonBall(location.x, location.y); - shot = false; - } -} - -void keyPressed() { - if (key == CODED && keyCode == RIGHT) { - angle += 0.1; - } - else if (key == CODED && keyCode == LEFT) { - angle -= 0.1; - } - else if (key == ' ') { - shot = true; - PVector force = PVector.fromAngle(angle); - force.mult(10); - ball.applyForce(force); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_04_spiral/Exercise_3_04_spiral.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_04_spiral/Exercise_3_04_spiral.pde deleted file mode 100644 index 90b7fea95..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_04_spiral/Exercise_3_04_spiral.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A Polar coordinate, radius now starts at 0 to spiral outwards -float r = 0; -float theta = 0; - -void setup() { - size(750,200); - background(255); - smooth(); -} - -void draw() { - // Polar to Cartesian conversion - float x = r * cos(theta); - float y = r * sin(theta); - - // Draw an ellipse at x,y - noStroke(); - fill(0); - // Adjust for center of window - ellipse(x+width/2, y+height/2, 16, 16); - - // Increment the angle - theta += 0.01; - // Increment the radius - r += 0.05; -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Exercise_3_05_asteroids.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Exercise_3_05_asteroids.pde deleted file mode 100644 index d0340916f..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Exercise_3_05_asteroids.pde +++ /dev/null @@ -1,41 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Chapter 3: Asteroids exercise - -// Mover object -Spaceship ship; - -void setup() { - size(640, 360); - ship = new Spaceship(); -} - -void draw() { - background(255); - - // Update location - ship.update(); - // Wrape edges - ship.wrapEdges(); - // Draw ship - ship.display(); - - - fill(0); - //text("left right arrows to turn, z to thrust",10,height-5); - - // Turn or thrust the ship depending on what key is pressed - if (keyPressed) { - if (key == CODED && keyCode == LEFT) { - ship.turn(-0.03); - } else if (key == CODED && keyCode == RIGHT) { - ship.turn(0.03); - } else if (key == 'z' || key == 'Z') { - ship.thrust(); - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Spaceship.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Spaceship.pde deleted file mode 100644 index 3a8682da7..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_05_asteroids/Spaceship.pde +++ /dev/null @@ -1,99 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Chapter 3: Asteroids - -class Spaceship { - // All of our regular motion stuff - PVector location; - PVector velocity; - PVector acceleration; - - // Arbitrary damping to slow down ship - float damping = 0.995; - float topspeed = 6; - - // Variable for heading! - float heading = 0; - - // Size - float r = 16; - - // Are we thrusting (to color boosters) - boolean thrusting = false; - - Spaceship() { - location = new PVector(width/2,height/2); - velocity = new PVector(); - acceleration = new PVector(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.mult(damping); - velocity.limit(topspeed); - location.add(velocity); - acceleration.mult(0); - } - - // Newton's law: F = M * A - void applyForce(PVector force) { - PVector f = force.get(); - //f.div(mass); // ignoring mass right now - acceleration.add(f); - } - - // Turn changes angle - void turn(float a) { - heading += a; - } - - // Apply a thrust force - void thrust() { - // Offset the angle since we drew the ship vertically - float angle = heading - PI/2; - // Polar to cartesian for force vector! - PVector force = new PVector(cos(angle),sin(angle)); - force.mult(0.1); - applyForce(force); - // To draw booster - thrusting = true; - } - - void wrapEdges() { - float buffer = r*2; - if (location.x > width + buffer) location.x = -buffer; - else if (location.x < -buffer) location.x = width+buffer; - if (location.y > height + buffer) location.y = -buffer; - else if (location.y < -buffer) location.y = height+buffer; - } - - - // Draw the ship - void display() { - stroke(0); - strokeWeight(2); - pushMatrix(); - translate(location.x,location.y+r); - rotate(heading); - fill(175); - if (thrusting) fill(255,0,0); - // Booster rockets - rect(-r/2,r,r/3,r/2); - rect(r/2,r,r/3,r/2); - fill(175); - // A triangle - beginShape(); - vertex(-r,r); - vertex(0,-r); - vertex(r,r); - endShape(CLOSE); - rectMode(CENTER); - popMatrix(); - - thrusting = false; - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Exercise_3_10_OOPWave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Exercise_3_10_OOPWave.pde deleted file mode 100644 index f8b759970..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Exercise_3_10_OOPWave.pde +++ /dev/null @@ -1,32 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Sine Wave - -// Two wave objects -Wave wave0; -Wave wave1; - -void setup() { - size(750,200); - // Initialize a wave with starting point, width, amplitude, and period - wave0 = new Wave(new PVector(50,75),100,20,500); - wave1 = new Wave(new PVector(300,100),300,40,220); - -} - -void draw() { - background(255); - - // Update and display waves - wave0.calculate(); - wave0.display(); - - wave1.calculate(); - wave1.display(); - - -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Wave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Wave.pde deleted file mode 100644 index df88f7cd0..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_10_OOPWave/Wave.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Wave { - - int xspacing = 8; // How far apart should each horizontal location be spaced - int w; // Width of entire wave - - PVector origin; // Where does the wave's first point start - float theta = 0.0; // Start angle at 0 - float amplitude; // Height of wave - float period; // How many pixels before the wave repeats - float dx; // Value for incrementing X, to be calculated as a function of period and xspacing - float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) - - Wave(PVector o, int w_, float a, float p) { - origin = o.get(); - w = w_; - period = p; - amplitude = a; - dx = (TWO_PI / period) * xspacing; - yvalues = new float[w/xspacing]; - } - - - void calculate() { - // Increment theta (try different values for 'angular velocity' here - theta += 0.02; - - // For every x value, calculate a y value with sine function - float x = theta; - for (int i = 0; i < yvalues.length; i++) { - yvalues[i] = sin(x)*amplitude; - x+=dx; - } - } - - void display() { - // A simple way to draw the wave with an ellipse at each location - for (int x = 0; x < yvalues.length; x++) { - stroke(0); - fill(0,50); - ellipseMode(CENTER); - ellipse(origin.x+x*xspacing,origin.y+yvalues[x],48,48); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_11_AdditiveWave/Exercise_3_11_AdditiveWave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_11_AdditiveWave/Exercise_3_11_AdditiveWave.pde deleted file mode 100644 index ccf0975a3..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_11_AdditiveWave/Exercise_3_11_AdditiveWave.pde +++ /dev/null @@ -1,66 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Additive Wave -// Create a more complex wave by adding two waves together. - -int xspacing = 8; // How far apart should each horizontal location be spaced -int w; // Width of entire wave -int maxwaves = 5; // total # of waves to add together - -float theta = 0.0; -float[] amplitude = new float[maxwaves]; // Height of wave -float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing -float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) - -void setup() { - size(750,200); - w = width + 16; - - for (int i = 0; i < maxwaves; i++) { - amplitude[i] = random(10,30); - float period = random(100,300); // How many pixels before the wave repeats - dx[i] = (TWO_PI / period) * xspacing; - } - - yvalues = new float[w/xspacing]; -} - -void draw() { - background(255); - calcWave(); - renderWave(); -} - -void calcWave() { - // Increment theta (try different values for 'angular velocity' here - theta += 0.02; - - // Set all height values to zero - for (int i = 0; i < yvalues.length; i++) { - yvalues[i] = 0; - } - - // Accumulate wave height values - for (int j = 0; j < maxwaves; j++) { - float x = theta; - for (int i = 0; i < yvalues.length; i++) { - // Every other wave is cosine instead of sine - if (j % 2 == 0) yvalues[i] += sin(x)*amplitude[j]; - else yvalues[i] += cos(x)*amplitude[j]; - x+=dx[j]; - } - } -} - -void renderWave() { - // A simple way to draw the wave with an ellipse at each location - stroke(0); - fill(127,50); - ellipseMode(CENTER); - for (int x = 0; x < yvalues.length; x++) { - ellipse(x*xspacing,height/2+yvalues[x],48,48); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Exercise_3_16_springs.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Exercise_3_16_springs.pde deleted file mode 100644 index 9f0d74795..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Exercise_3_16_springs.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Mover object -Bob b1; -Bob b2; -Bob b3; - -Spring s1; -Spring s2; -Spring s3; - -void setup() { - size(640, 360); - // Create objects at starting location - // Note third argument in Spring constructor is "rest length" - b1 = new Bob(width/2, 100); - b2 = new Bob(width/2, 200); - b3 = new Bob(width/2, 300); - - s1 = new Spring(b1,b2,100); - s2 = new Spring(b2,b3,100); - s3 = new Spring(b1,b3,100); -} - -void draw() { - background(255); - - s1.update(); - s2.update(); - s3.update(); - - s1.display(); - s2.display(); - s3.display(); - - b1.update(); - b1.display(); - b2.update(); - b2.display(); - b3.update(); - b3.display(); - - b1.drag(mouseX, mouseY); -} - - - -void mousePressed() { - b1.clicked(mouseX, mouseY); -} - -void mouseReleased() { - b1.stopDragging(); -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Mover.pde deleted file mode 100644 index 368aa20d2..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Mover.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Bob class, just like our regular Mover (location, velocity, acceleration, mass) - -class Bob { - PVector location; - PVector velocity; - PVector acceleration; - float mass = 12; - - // Arbitrary damping to simulate friction / drag - float damping = 0.95; - - // For mouse interaction - PVector dragOffset; - boolean dragging = false; - - // Constructor - Bob(float x, float y) { - location = new PVector(x,y); - velocity = new PVector(); - acceleration = new PVector(); - dragOffset = new PVector(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.mult(damping); - location.add(velocity); - acceleration.mult(0); - } - - // Newton's law: F = M * A - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acceleration.add(f); - } - - - // Draw the bob - void display() { - stroke(0); - strokeWeight(2); - fill(175); - if (dragging) { - fill(50); - } - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - - // This checks to see if we clicked on the mover - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void stopDragging() { - dragging = false; - } - - void drag(int mx, int my) { - if (dragging) { - location.x = mx + dragOffset.x; - location.y = my + dragOffset.y; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Spring.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Spring.pde deleted file mode 100644 index 0f4060e13..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs/Spring.pde +++ /dev/null @@ -1,52 +0,0 @@ -// Nature of Code 2011 -// Daniel Shiffman -// Chapter 3: Oscillation - -// Class to describe an anchor point that can connect to "Bob" objects via a spring -// Thank you: http://www.myphysicslab.com/spring2d.html - -class Spring { - - // Location - PVector anchor; - - // Rest length and spring constant - float len; - float k = 0.2; - - Bob a; - Bob b; - - // Constructor - Spring(Bob a_, Bob b_, int l) { - a = a_; - b = b_; - len = l; - } - - // Calculate spring force - void update() { - // Vector pointing from anchor to bob location - PVector force = PVector.sub(a.location, b.location); - // What is distance - float d = force.mag(); - // Stretch is difference between current distance and rest length - float stretch = d - len; - - // Calculate force according to Hooke's Law - // F = k * stretch - force.normalize(); - force.mult(-1 * k * stretch); - a.applyForce(force); - force.mult(-1); - b.applyForce(force); - } - - - void display() { - strokeWeight(2); - stroke(0); - line(a.location.x, a.location.y, b.location.x, b.location.y); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Exercise_3_16_springs_array.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Exercise_3_16_springs_array.pde deleted file mode 100644 index 01a0bcad4..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Exercise_3_16_springs_array.pde +++ /dev/null @@ -1,50 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Mover object -Bob[] bobs = new Bob[5]; - -Spring[] springs = new Spring[4]; - -void setup() { - size(640, 360); - // Create objects at starting location - // Note third argument in Spring constructor is "rest length" - for (int i = 0; i < bobs.length; i++) { - bobs[i] = new Bob(width/2, i*40); - } - for (int i = 0; i < springs.length; i++) { - springs[i] = new Spring(bobs[i], bobs[i+1],40); - } -} - -void draw() { - background(255); - - for (Spring s : springs) { - s.update(); - s.display(); - } - - for (Bob b : bobs) { - b.update(); - b.display(); - b.drag(mouseX, mouseY); - } -} - - - -void mousePressed() { - for (Bob b : bobs) { - b.clicked(mouseX, mouseY); - } -} - -void mouseReleased() { - for (Bob b : bobs) { - b.stopDragging(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Mover.pde deleted file mode 100644 index 7f5e0fcc5..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Mover.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Bob class, just like our regular Mover (location, velocity, acceleration, mass) - -class Bob { - PVector location; - PVector velocity; - PVector acceleration; - float mass = 8; - - // Arbitrary damping to simulate friction / drag - float damping = 0.95; - - // For mouse interaction - PVector dragOffset; - boolean dragging = false; - - // Constructor - Bob(float x, float y) { - location = new PVector(x,y); - velocity = new PVector(); - acceleration = new PVector(); - dragOffset = new PVector(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.mult(damping); - location.add(velocity); - acceleration.mult(0); - } - - // Newton's law: F = M * A - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acceleration.add(f); - } - - - // Draw the bob - void display() { - stroke(0); - strokeWeight(2); - fill(175,120); - if (dragging) { - fill(50); - } - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - - // This checks to see if we clicked on the mover - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void stopDragging() { - dragging = false; - } - - void drag(int mx, int my) { - if (dragging) { - location.x = mx + dragOffset.x; - location.y = my + dragOffset.y; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Spring.pde b/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Spring.pde deleted file mode 100644 index 0f4060e13..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/Exercise_3_16_springs_array/Spring.pde +++ /dev/null @@ -1,52 +0,0 @@ -// Nature of Code 2011 -// Daniel Shiffman -// Chapter 3: Oscillation - -// Class to describe an anchor point that can connect to "Bob" objects via a spring -// Thank you: http://www.myphysicslab.com/spring2d.html - -class Spring { - - // Location - PVector anchor; - - // Rest length and spring constant - float len; - float k = 0.2; - - Bob a; - Bob b; - - // Constructor - Spring(Bob a_, Bob b_, int l) { - a = a_; - b = b_; - len = l; - } - - // Calculate spring force - void update() { - // Vector pointing from anchor to bob location - PVector force = PVector.sub(a.location, b.location); - // What is distance - float d = force.mag(); - // Stretch is difference between current distance and rest length - float stretch = d - len; - - // Calculate force according to Hooke's Law - // F = k * stretch - force.normalize(); - force.mult(-1 * k * stretch); - a.applyForce(force); - force.mult(-1); - b.applyForce(force); - } - - - void display() { - strokeWeight(2); - stroke(0); - line(a.location.x, a.location.y, b.location.x, b.location.y); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Attractor.pde b/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Attractor.pde deleted file mode 100644 index 556605cb7..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Attractor.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - float G; // Gravitational Constant - PVector location; // Location - boolean dragging = false; // Is the object being dragged? - boolean rollover = false; // Is the mouse over the ellipse? - PVector dragOffset; // holds the offset for when object is clicked on - - Attractor() { - location = new PVector(width/2,height/2); - mass = 20; - G = 1; - dragOffset = new PVector(0.0,0.0); - } - - PVector attract(Mover m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force - float d = force.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (G * mass * m.mass) / (d * d); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - ellipseMode(CENTER); - strokeWeight(4); - stroke(0); - if (dragging) fill (50); - else if (rollover) fill(100); - else fill(175,200); - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void hover(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - rollover = true; - } - else { - rollover = false; - } - } - - void stopDragging() { - dragging = false; - } - - - - void drag() { - if (dragging) { - location.x = mouseX + dragOffset.x; - location.y = mouseY + dragOffset.y; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/ExtraOscillatingBody.pde b/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/ExtraOscillatingBody.pde deleted file mode 100644 index 25f1b1ca5..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/ExtraOscillatingBody.pde +++ /dev/null @@ -1,40 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover m; -Attractor a; - -void setup() { - size(640,360); - m = new Mover(); - a = new Attractor(); -} - -void draw() { - background(255); - - PVector force = a.attract(m); - m.applyForce(force); - m.update(); - - a.drag(); - a.hover(mouseX,mouseY); - - a.display(); - m.display(); - -} - -void mousePressed() { - a.clicked(mouseX,mouseY); -} - -void mouseReleased() { - a.stopDragging(); -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Mover.pde deleted file mode 100644 index 00850bc1c..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingBody/Mover.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - Mover() { - location = new PVector(400,50); - velocity = new PVector(1,0); - acceleration = new PVector(0,0); - mass = 1; - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(127); - pushMatrix(); - translate(location.x,location.y); - float heading = velocity.heading(); - rotate(heading); - ellipse(0,0,16,16); - rectMode(CENTER); - // "20" should be a variable that is oscillating - // with sine function - rect(20,0,10,10); - popMatrix(); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - velocity.y *= -1; - location.y = height; - } - - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingUpAndDown/ExtraOscillatingUpAndDown.pde b/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingUpAndDown/ExtraOscillatingUpAndDown.pde deleted file mode 100644 index 68b1b2074..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/ExtraOscillatingUpAndDown/ExtraOscillatingUpAndDown.pde +++ /dev/null @@ -1,15 +0,0 @@ -float angle = 0; -void setup() { - size(400,400); -} - -void draw() { - background(255); - float y = 100*sin(angle); - angle += 0.02; - - fill(127); - translate(width/2,height/2); - line(0,0,0,y); - ellipse(0,y,16,16); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/MultipleOscillations/MultipleOscillations.pde b/java/examples/Books/Nature of Code/chp3_oscillation/MultipleOscillations/MultipleOscillations.pde deleted file mode 100644 index 4a53d917f..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/MultipleOscillations/MultipleOscillations.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle1 = 0; -float aVelocity1 = 0.01; -float amplitude1 = 300; - -float angle2 = 0; -float aVelocity2 = 0.3; -float amplitude2 = 10; - - -void setup() { - size(640,360); -} - -void draw() { - background(255); - - float x = 0; - x += amplitude1 * cos(angle1); - x += amplitude2 * sin(angle2); - - angle1 += aVelocity1; - angle2 += aVelocity2; - - ellipseMode(CENTER); - stroke(0); - fill(175); - translate(width/2,height/2); - line(0,0,x,0); - ellipse(x,0,20,20); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_03spring_exercise_sine/NOC_03spring_exercise_sine.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_03spring_exercise_sine/NOC_03spring_exercise_sine.pde deleted file mode 100644 index 4645efce7..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_03spring_exercise_sine/NOC_03spring_exercise_sine.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle = 0; -float aVelocity = 0.05; - -void setup() { - size(640,360); - smooth(); -} - -void draw() { - background(255); - - float x = width/2; - float y = map(sin(angle),-1,1,50,250); - angle += aVelocity; - - ellipseMode(CENTER); - stroke(0); - fill(175); - line(x,0,x,y); - ellipse(x,y,20,20); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_01_angular_motion/NOC_3_01_angular_motion.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_01_angular_motion/NOC_3_01_angular_motion.pde deleted file mode 100644 index e36c11dd8..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_01_angular_motion/NOC_3_01_angular_motion.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle = 0; -float aVelocity = 0; -float aAcceleration = 0.0001; - -void setup() { - size(800, 200); - smooth(); -} - -void draw() { - background(255); - - - fill(127); - stroke(0); - - translate(width/2, height/2); - rectMode(CENTER); - rotate(angle); - stroke(0); - strokeWeight(2); - fill(127); - line(-60, 0, 60, 0); - ellipse(60, 0, 16, 16); - ellipse(-60, 0, 16, 16); - - angle += aVelocity; - aVelocity += aAcceleration; -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Attractor.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Attractor.pde deleted file mode 100644 index c7c457db7..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Attractor.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Attraction - -// A class for a draggable attractive body in our world - -class Attractor { - float mass; // Mass, tied to size - PVector location; // Location - float g; - - Attractor() { - location = new PVector(width/2, height/2); - mass = 20; - g = 0.4; - } - - - PVector attract(Mover m) { - PVector force = PVector.sub(location, m.location); // Calculate direction of force - float distance = force.mag(); // Distance between objects - distance = constrain(distance, 5.0, 25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude - force.mult(strength); // Get force vector --> magnitude * direction - return force; - } - - // Method to display - void display() { - stroke(0); - strokeWeight(2); - fill(127); - ellipse(location.x, location.y, 48, 48); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Mover.pde deleted file mode 100644 index be9646c09..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/Mover.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float mass; - - float angle = 0; - float aVelocity = 0; - float aAcceleration = 0; - - Mover(float m, float x, float y) { - mass = m; - location = new PVector(x,y); - velocity = new PVector(random(-1,1),random(-1,1)); - acceleration = new PVector(0,0); - } - - void applyForce(PVector force) { - PVector f = PVector.div(force,mass); - acceleration.add(f); - } - - void update() { - - velocity.add(acceleration); - location.add(velocity); - - aAcceleration = acceleration.x / 10.0; - aVelocity += aAcceleration; - aVelocity = constrain(aVelocity,-0.1,0.1); - angle += aVelocity; - - acceleration.mult(0); - } - - void display() { - stroke(0); - fill(175,200); - rectMode(CENTER); - pushMatrix(); - translate(location.x,location.y); - rotate(angle); - rect(0,0,mass*16,mass*16); - popMatrix(); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/NOC_3_02_forces_angular_motion.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/NOC_3_02_forces_angular_motion.pde deleted file mode 100644 index 4d4302aff..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_02_forces_angular_motion/NOC_3_02_forces_angular_motion.pde +++ /dev/null @@ -1,42 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover[] movers = new Mover[20]; - -Attractor a; - -void setup() { - size(800,200); - background(255); - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(0.1,2),random(width),random(height)); - } - a = new Attractor(); -} - -void draw() { - background(255); - - a.display(); - - for (int i = 0; i < movers.length; i++) { - PVector force = a.attract(movers[i]); - movers[i].applyForce(force); - - movers[i].update(); - movers[i].display(); - } - -} - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/Mover.pde deleted file mode 100644 index 399d93a4d..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/Mover.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Mover { - - PVector location; - PVector velocity; - PVector acceleration; - float topspeed; - - float xoff, yoff; - - float r = 16; - - Mover() { - location = new PVector(width/2, height/2); - velocity = new PVector(0, 0); - topspeed = 4; - xoff = 1000; - yoff = 0; - } - - void update() { - - PVector mouse = new PVector(mouseX, mouseY); - PVector dir = PVector.sub(mouse, location); - dir.normalize(); - dir.mult(0.5); - acceleration = dir; - - velocity.add(acceleration); - velocity.limit(topspeed); - location.add(velocity); - } - - void display() { - float theta = velocity.heading2D(); - - stroke(0); - strokeWeight(2); - fill(127); - pushMatrix(); - rectMode(CENTER); - translate(location.x, location.y); - rotate(theta); - rect(0, 0, 30, 10); - popMatrix(); - } - - void checkEdges() { - - if (location.x > width) { - location.x = 0; - } - else if (location.x < 0) { - location.x = width; - } - - if (location.y > height) { - location.y = 0; - } - else if (location.y < 0) { - location.y = height; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/NOC_3_03_pointing_velocity.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/NOC_3_03_pointing_velocity.pde deleted file mode 100644 index df09af915..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_03_pointing_velocity/NOC_3_03_pointing_velocity.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Mover mover; - -void setup() { - size(800,200); - mover = new Mover(); -} - -void draw() { - background(255); - - mover.update(); - mover.checkEdges(); - mover.display(); -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian/NOC_3_04_PolarToCartesian.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian/NOC_3_04_PolarToCartesian.pde deleted file mode 100644 index 8be1f3bd1..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian/NOC_3_04_PolarToCartesian.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// PolarToCartesian -// Convert a polar coordinate (r,theta) to cartesian (x,y): -// x = r * cos(theta) -// y = r * sin(theta) - -float r; -float theta; - - -void setup() { - size(800, 200); - // Initialize all values - r = height * 0.45; - theta = 0; -} - -void draw() { - - background(255); - - // Translate the origin point to the center of the screen - translate(width/2, height/2); - - // Convert polar to cartesian - float x = r * cos(theta); - float y = r * sin(theta); - - // Draw the ellipse at the cartesian coordinate - ellipseMode(CENTER); - fill(127); - stroke(0); - strokeWeight(2); - line(0,0,x,y); - ellipse(x, y, 48, 48); - - // Increase the angle over time - theta += 0.02; - - -} - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian_trail/NOC_3_04_PolarToCartesian_trail.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian_trail/NOC_3_04_PolarToCartesian_trail.pde deleted file mode 100644 index 928afe73a..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_04_PolarToCartesian_trail/NOC_3_04_PolarToCartesian_trail.pde +++ /dev/null @@ -1,52 +0,0 @@ -/** - * PolarToCartesian - * by Daniel Shiffman. - * - * Convert a polar coordinate (r,theta) to cartesian (x,y): - * x = r * cos(theta) - * y = r * sin(theta) - */ - -float r; -float theta; - - -void setup() { - size(800, 200); - background(255); - // Initialize all values - r = height * 0.45; - theta = 0; -} - -void draw() { - - //background(255); - noStroke(); - fill(255,5); - rect(0,0,width,height); - - // Translate the origin point to the center of the screen - translate(width/2, height/2); - - // Convert polar to cartesian - float x = r * cos(theta); - float y = r * sin(theta); - - // Draw the ellipse at the cartesian coordinate - ellipseMode(CENTER); - fill(127); - stroke(0); - strokeWeight(2); - line(0,0,x,y); - ellipse(x, y, 48, 48); - - // Increase the angle over time - theta += 0.02; - - -} - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_05_simple_harmonic_motion/NOC_3_05_simple_harmonic_motion.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_05_simple_harmonic_motion/NOC_3_05_simple_harmonic_motion.pde deleted file mode 100644 index e2830e6ca..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_05_simple_harmonic_motion/NOC_3_05_simple_harmonic_motion.pde +++ /dev/null @@ -1,22 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void setup() { - size(800,200); -} - -void draw() { - background(255); - - float period = 120; - float amplitude = 300; - // Calculating horizontal location according to formula for simple harmonic motion - float x = amplitude * cos(TWO_PI * frameCount / period); - stroke(0); - strokeWeight(2); - fill(127); - translate(width/2,height/2); - line(0,0,x,0); - ellipse(x,0,48,48); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_06_simple_harmonic_motion/NOC_3_06_simple_harmonic_motion.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_06_simple_harmonic_motion/NOC_3_06_simple_harmonic_motion.pde deleted file mode 100644 index 4ab3782c0..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_06_simple_harmonic_motion/NOC_3_06_simple_harmonic_motion.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle = 0; -float aVelocity = 0.03; - -void setup() { - size(640,360); - - smooth(); -} - -void draw() { - background(255); - - float amplitude = 300; - float x = amplitude * cos(angle); - angle += aVelocity; - - ellipseMode(CENTER); - stroke(0); - fill(175); - translate(width/2,height/2); - line(0,0,x,0); - ellipse(x,0,20,20); -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/NOC_3_07_oscillating_objects.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/NOC_3_07_oscillating_objects.pde deleted file mode 100644 index 20af612ed..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/NOC_3_07_oscillating_objects.pde +++ /dev/null @@ -1,29 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An array of objects -Oscillator[] oscillators = new Oscillator[10]; - -void setup() { - size(800,200); - smooth(); - // Initialize all objects - for (int i = 0; i < oscillators.length; i++) { - oscillators[i] = new Oscillator(); - } - background(255); -} - -void draw() { - background(255); - // Run all objects - for (int i = 0; i < oscillators.length; i++) { - oscillators[i].oscillate(); - oscillators[i].display(); - } -} - - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/Oscillator.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/Oscillator.pde deleted file mode 100644 index da9a7d6ca..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_07_oscillating_objects/Oscillator.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Oscillator { - - PVector angle; - PVector velocity; - PVector amplitude; - - Oscillator() { - angle = new PVector(); - velocity = new PVector(random(-0.05, 0.05), random(-0.05, 0.05)); - amplitude = new PVector(random(20,width/2), random(20,height/2)); - } - - void oscillate() { - angle.add(velocity); - } - - void display() { - - float x = sin(angle.x)*amplitude.x; - float y = sin(angle.y)*amplitude.y; - - pushMatrix(); - translate(width/2, height/2); - stroke(0); - strokeWeight(2); - fill(127,127); - line(0, 0, x, y); - ellipse(x, y, 32, 32); - popMatrix(); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_08_static_wave_lines/NOC_3_08_static_wave_lines.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_08_static_wave_lines/NOC_3_08_static_wave_lines.pde deleted file mode 100644 index 1149e065d..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_08_static_wave_lines/NOC_3_08_static_wave_lines.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float angle = 0; -float angleVel = 0.1; - -size(800,200); -background(255); -stroke(0); -strokeWeight(2); -noFill(); - -beginShape(); -for (int x = 0; x <= width; x += 5) { - float y = map(sin(angle),-1,1,0,height); - vertex(x,y); - angle +=angleVel; -} -endShape(); - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_exercise_additive_wave/NOC_3_09_exercise_additive_wave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_exercise_additive_wave/NOC_3_09_exercise_additive_wave.pde deleted file mode 100644 index fd7f4bc7b..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_exercise_additive_wave/NOC_3_09_exercise_additive_wave.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Additive Wave -// Create a more complex wave by adding two waves together. - -// Maybe better for this answer to be OOP??? - -int xspacing = 8; // How far apart should each horizontal location be spaced -int w; // Width of entire wave -int maxwaves = 5; // total # of waves to add together - -float theta = 0.0; -float[] amplitude = new float[maxwaves]; // Height of wave -float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing -float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) - -void setup() { - size(640,360); - colorMode(RGB, 255, 255, 255, 100); - w = width + 16; - - for (int i = 0; i < maxwaves; i++) { - amplitude[i] = random(10,30); - float period = random(100,300); // How many pixels before the wave repeats - dx[i] = (TWO_PI / period) * xspacing; - } - - yvalues = new float[w/xspacing]; -} - -void draw() { - background(0); - calcWave(); - renderWave(); -} - -void calcWave() { - // Increment theta (try different values for 'angular velocity' here - theta += 0.02; - - // Set all height values to zero - for (int i = 0; i < yvalues.length; i++) { - yvalues[i] = 0; - } - - // Accumulate wave height values - for (int j = 0; j < maxwaves; j++) { - float x = theta; - for (int i = 0; i < yvalues.length; i++) { - // Every other wave is cosine instead of sine - if (j % 2 == 0) yvalues[i] += sin(x)*amplitude[j]; - else yvalues[i] += cos(x)*amplitude[j]; - x+=dx[j]; - } - } -} - -void renderWave() { - // A simple way to draw the wave with an ellipse at each location - noStroke(); - fill(255,50); - ellipseMode(CENTER); - for (int x = 0; x < yvalues.length; x++) { - ellipse(x*xspacing,height/2+yvalues[x],16,16); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave/NOC_3_09_wave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave/NOC_3_09_wave.pde deleted file mode 100644 index 5eb61b28b..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave/NOC_3_09_wave.pde +++ /dev/null @@ -1,28 +0,0 @@ - -float startAngle = 0; -float angleVel = 0.23; - -void setup() { - size(800,200); - smooth(); -} - -void draw() { - background(255); - - startAngle += 0.015; - float angle = startAngle; - - for (int x = 0; x <= width; x += 24) { - float y = map(sin(angle),-1,1,0,height); - stroke(0); - fill(0,50); - strokeWeight(2); - ellipse(x,y,48,48); - angle += angleVel; - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_a/NOC_3_09_wave_a.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_a/NOC_3_09_wave_a.pde deleted file mode 100644 index 95c824eb5..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_a/NOC_3_09_wave_a.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float startAngle = 0; -float angleVel = 0.05; - -void setup() { - size(250,200); - smooth(); -} - -void draw() { - background(255); - - startAngle += 0.015; - float angle = startAngle; - - for (int x = 0; x <= width; x += 24) { - float y = map(sin(angle),-1,1,0,height); - stroke(0); - fill(0,50); - strokeWeight(2); - ellipse(x,y,48,48); - angle += angleVel; - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_b/NOC_3_09_wave_b.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_b/NOC_3_09_wave_b.pde deleted file mode 100644 index 9749647db..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_b/NOC_3_09_wave_b.pde +++ /dev/null @@ -1,28 +0,0 @@ - -float startAngle = 0; -float angleVel = 0.2; - -void setup() { - size(250,200); - smooth(); -} - -void draw() { - background(255); - - startAngle += 0.015; - float angle = startAngle; - - for (int x = 0; x <= width; x += 24) { - float y = map(sin(angle),-1,1,0,height); - stroke(0); - fill(0,50); - strokeWeight(2); - ellipse(x,y,48,48); - angle += angleVel; - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_c/NOC_3_09_wave_c.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_c/NOC_3_09_wave_c.pde deleted file mode 100644 index 88a1e396d..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_09_wave_c/NOC_3_09_wave_c.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float startAngle = 0; -float angleVel = 0.4; - -void setup() { - size(250,200); - smooth(); -} - -void draw() { - background(255); - - startAngle += 0.015; - float angle = startAngle; - - for (int x = 0; x <= width; x += 24) { - float y = map(sin(angle),-1,1,0,height); - stroke(0); - fill(0,50); - strokeWeight(2); - ellipse(x,y,48,48); - angle += angleVel; - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/NOC_3_10_PendulumExample.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/NOC_3_10_PendulumExample.pde deleted file mode 100644 index 80fe915bb..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/NOC_3_10_PendulumExample.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pendulum - -// A simple pendulum simulation -// Given a pendulum with an angle theta (0 being the pendulum at rest) and a radius r -// we can use sine to calculate the angular component of the gravitational force. - -// Gravity Force = Mass * Gravitational Constant; -// Pendulum Force = Gravity Force * sine(theta) -// Angular Acceleration = Pendulum Force / Mass = gravitational acceleration * sine(theta); - -// Note this is an ideal world scenario with no tension in the -// pendulum arm, a more realistic formula might be: -// Angular Acceleration = (g / R) * sine(theta) - -// For a more substantial explanation, visit: -// http://www.myphysicslab.com/pendulum1.html - -Pendulum p; - -void setup() { - size(800,200); - // Make a new Pendulum with an origin location and armlength - p = new Pendulum(new PVector(width/2,0),175); - -} - -void draw() { - - background(255); - p.go(); -} - -void mousePressed() { - p.clicked(mouseX,mouseY); -} - -void mouseReleased() { - p.stopDragging(); -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/Pendulum.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/Pendulum.pde deleted file mode 100644 index 02d400155..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExample/Pendulum.pde +++ /dev/null @@ -1,98 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pendulum - -// A Simple Pendulum Class -// Includes functionality for user can click and drag the pendulum - -class Pendulum { - - PVector location; // Location of pendulum ball - PVector origin; // Location of arm origin - float r; // Length of arm - float angle; // Pendulum arm angle - float aVelocity; // Angle velocity - float aAcceleration; // Angle acceleration - - float ballr; // Ball radius - float damping; // Arbitary damping amount - - boolean dragging = false; - - // This constructor could be improved to allow a greater variety of pendulums - Pendulum(PVector origin_, float r_) { - // Fill all variables - origin = origin_.get(); - location = new PVector(); - r = r_; - angle = PI/4; - - aVelocity = 0.0; - aAcceleration = 0.0; - damping = 0.995; // Arbitrary damping - ballr = 48.0; // Arbitrary ball radius - } - - void go() { - update(); - drag(); //for user interaction - display(); - } - - // Function to update location - void update() { - // As long as we aren't dragging the pendulum, let it swing! - if (!dragging) { - float gravity = 0.4; // Arbitrary constant - aAcceleration = (-1 * gravity / r) * sin(angle); // Calculate acceleration (see: http://www.myphysicslab.com/pendulum1.html) - aVelocity += aAcceleration; // Increment velocity - aVelocity *= damping; // Arbitrary damping - angle += aVelocity; // Increment angle - } - } - - void display() { - location.set(r*sin(angle), r*cos(angle), 0); // Polar to cartesian conversion - location.add(origin); // Make sure the location is relative to the pendulum's origin - - stroke(0); - strokeWeight(2); - // Draw the arm - line(origin.x, origin.y, location.x, location.y); - ellipseMode(CENTER); - fill(175); - if (dragging) fill(0); - // Draw the ball - ellipse(location.x, location.y, ballr, ballr); - } - - - // The methods below are for mouse interaction - - // This checks to see if we clicked on the pendulum ball - void clicked(int mx, int my) { - float d = dist(mx, my, location.x, location.y); - if (d < ballr) { - dragging = true; - } - } - - // This tells us we are not longer clicking on the ball - void stopDragging() { - aVelocity = 0; // No velocity once you let go - dragging = false; - } - - void drag() { - // If we are draging the ball, we calculate the angle between the - // pendulum origin and mouse location - // we assign that angle to the pendulum - if (dragging) { - PVector diff = PVector.sub(origin, new PVector(mouseX, mouseY)); // Difference between 2 points - angle = atan2(-1*diff.y, diff.x) - radians(90); // Angle relative to vertical axis - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/NOC_3_10_PendulumExampleSimplified.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/NOC_3_10_PendulumExampleSimplified.pde deleted file mode 100644 index 07c09ed46..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/NOC_3_10_PendulumExampleSimplified.pde +++ /dev/null @@ -1,35 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pendulum - -// A simple pendulum simulation -// Given a pendulum with an angle theta (0 being the pendulum at rest) and a radius r -// we can use sine to calculate the angular component of the gravitational force. - -// Gravity Force = Mass * Gravitational Constant; -// Pendulum Force = Gravity Force * sine(theta) -// Angular Acceleration = Pendulum Force / Mass = Gravitational Constant * sine(theta); - -// Note this is an ideal world scenario with no tension in the -// pendulum arm, a more realistic formula might be: -// Angular Acceleration = (G / R) * sine(theta) - -// For a more substantial explanation, visit: -// http://www.myphysicslab.com/pendulum1.html - -Pendulum p; - -void setup() { - size(800,200); - // Make a new Pendulum with an origin location and armlength - p = new Pendulum(new PVector(width/2,0),175); - -} - -void draw() { - background(255); - p.go(); -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/Pendulum.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/Pendulum.pde deleted file mode 100644 index 1b63fd3cc..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_10_PendulumExampleSimplified/Pendulum.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pendulum - -// A Simple Pendulum Class -// Includes functionality for user can click and drag the pendulum - -class Pendulum { - - PVector location; // Location of pendulum ball - PVector origin; // Location of arm origin - float r; // Length of arm - float angle; // Pendulum arm angle - float aVelocity; // Angle velocity - float aAcceleration; // Angle acceleration - float damping; // Arbitary damping amount - - // This constructor could be improved to allow a greater variety of pendulums - Pendulum(PVector origin_, float r_) { - // Fill all variables - origin = origin_.get(); - location = new PVector(); - r = r_; - angle = PI/4; - - aVelocity = 0.0; - aAcceleration = 0.0; - damping = 0.995; // Arbitrary damping - } - - void go() { - update(); - display(); - } - - // Function to update location - void update() { - float gravity = 0.4; // Arbitrary constant - aAcceleration = (-1 * gravity / r) * sin(angle); // Calculate acceleration (see: http://www.myphysicslab.com/pendulum1.html) - aVelocity += aAcceleration; // Increment velocity - aVelocity *= damping; // Arbitrary damping - angle += aVelocity; // Increment angle - } - - void display() { - location.set(r*sin(angle), r*cos(angle), 0); // Polar to cartesian conversion - location.add(origin); // Make sure the location is relative to the pendulum's origin - - stroke(0); - strokeWeight(2); - // Draw the arm - line(origin.x, origin.y, location.x, location.y); - ellipseMode(CENTER); - fill(175); - // Draw the ball - ellipse(location.x, location.y, 48, 48); - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Mover.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Mover.pde deleted file mode 100644 index 4545f5cd1..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Mover.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Bob class, just like our regular Mover (location, velocity, acceleration, mass) - -class Bob { - PVector location; - PVector velocity; - PVector acceleration; - float mass = 24; - - // Arbitrary damping to simulate friction / drag - float damping = 0.98; - - // For mouse interaction - PVector dragOffset; - boolean dragging = false; - - // Constructor - Bob(float x, float y) { - location = new PVector(x,y); - velocity = new PVector(); - acceleration = new PVector(); - dragOffset = new PVector(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.mult(damping); - location.add(velocity); - acceleration.mult(0); - } - - // Newton's law: F = M * A - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acceleration.add(f); - } - - - // Draw the bob - void display() { - stroke(0); - strokeWeight(2); - fill(175); - if (dragging) { - fill(50); - } - ellipse(location.x,location.y,mass*2,mass*2); - } - - // The methods below are for mouse interaction - - // This checks to see if we clicked on the mover - void clicked(int mx, int my) { - float d = dist(mx,my,location.x,location.y); - if (d < mass) { - dragging = true; - dragOffset.x = location.x-mx; - dragOffset.y = location.y-my; - } - } - - void stopDragging() { - dragging = false; - } - - void drag(int mx, int my) { - if (dragging) { - location.x = mx + dragOffset.x; - location.y = my + dragOffset.y; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/NOC_3_11_spring.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/NOC_3_11_spring.pde deleted file mode 100644 index ff09a0a9a..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/NOC_3_11_spring.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Mover object -Bob bob; - -// Spring object -Spring spring; - -void setup() { - size(640,360); - // Create objects at starting location - // Note third argument in Spring constructor is "rest length" - spring = new Spring(width/2,10,100); - bob = new Bob(width/2,100); - -} - -void draw() { - background(255); - // Apply a gravity force to the bob - PVector gravity = new PVector(0,2); - bob.applyForce(gravity); - - // Connect the bob to the spring (this calculates the force) - spring.connect(bob); - // Constrain spring distance between min and max - spring.constrainLength(bob,30,200); - - // Update bob - bob.update(); - // If it's being dragged - bob.drag(mouseX,mouseY); - - // Draw everything - spring.displayLine(bob); // Draw a line between spring and bob - bob.display(); - spring.display(); - - fill(0); - text("click on bob to drag",10,height-5); -} - - -// For mouse interaction with bob - -void mousePressed() { - bob.clicked(mouseX,mouseY); -} - -void mouseReleased() { - bob.stopDragging(); -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Spring.pde b/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Spring.pde deleted file mode 100644 index 565fbb307..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/NOC_3_11_spring/Spring.pde +++ /dev/null @@ -1,75 +0,0 @@ -// Nature of Code 2011 -// Daniel Shiffman -// Chapter 3: Oscillation - -// Class to describe an anchor point that can connect to "Bob" objects via a spring -// Thank you: http://www.myphysicslab.com/spring2d.html - -class Spring { - - // Location - PVector anchor; - - // Rest length and spring constant - float len; - float k = 0.2; - - // Constructor - Spring(float x, float y, int l) { - anchor = new PVector(x, y); - len = l; - } - - // Calculate spring force - void connect(Bob b) { - // Vector pointing from anchor to bob location - PVector force = PVector.sub(b.location, anchor); - // What is distance - float d = force.mag(); - // Stretch is difference between current distance and rest length - float stretch = d - len; - - // Calculate force according to Hooke's Law - // F = k * stretch - force.normalize(); - force.mult(-1 * k * stretch); - b.applyForce(force); - } - - // Constrain the distance between bob and anchor between min and max - void constrainLength(Bob b, float minlen, float maxlen) { - PVector dir = PVector.sub(b.location, anchor); - float d = dir.mag(); - // Is it too short? - if (d < minlen) { - dir.normalize(); - dir.mult(minlen); - // Reset location and stop from moving (not realistic physics) - b.location = PVector.add(anchor, dir); - b.velocity.mult(0); - // Is it too long? - } - else if (d > maxlen) { - dir.normalize(); - dir.mult(maxlen); - // Reset location and stop from moving (not realistic physics) - b.location = PVector.add(anchor, dir); - b.velocity.mult(0); - } - } - - void display() { - stroke(0); - fill(175); - strokeWeight(2); - rectMode(CENTER); - rect(anchor.x, anchor.y, 10, 10); - } - - void displayLine(Bob b) { - strokeWeight(2); - stroke(0); - line(b.location.x, b.location.y, anchor.x, anchor.y); - } -} - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/OOPWaveParticles.pde b/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/OOPWaveParticles.pde deleted file mode 100644 index 423afa435..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/OOPWaveParticles.pde +++ /dev/null @@ -1,32 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Sine Wave - -// Two wave objects -Wave wave0; -Wave wave1; - -void setup() { - size(640,360); - // Initialize a wave with starting point, width, amplitude, and period - wave0 = new Wave(new PVector(200,75),100,20,500); - wave1 = new Wave(new PVector(150,250),300,40,220); - -} - -void draw() { - background(255); - - // Update and display waves - wave0.calculate(); - wave0.display(); - - wave1.calculate(); - wave1.display(); - - -} - - diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Particle.pde b/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Particle.pde deleted file mode 100644 index d04daea97..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Particle.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Particle { - PVector location; - - Particle() { - location = new PVector(); - } - - void setLocation(float x, float y) { - location.x = x; - location.y = y; - } - - void display() { - fill(random(255)); - ellipse(location.x,location.y,16,16); - } - - -} diff --git a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Wave.pde b/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Wave.pde deleted file mode 100644 index 9763ba892..000000000 --- a/java/examples/Books/Nature of Code/chp3_oscillation/OOPWaveParticles/Wave.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Wave { - - int xspacing = 8; // How far apart should each horizontal location be spaced - int w; // Width of entire wave - - PVector origin; // Where does the wave's first point start - float theta = 0.0; // Start angle at 0 - float amplitude; // Height of wave - float period; // How many pixels before the wave repeats - float dx; // Value for incrementing X, to be calculated as a function of period and xspacing - //float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) - Particle[] particles; - - Wave(PVector o, int w_, float a, float p) { - origin = o.get(); - w = w_; - period = p; - amplitude = a; - dx = (TWO_PI / period) * xspacing; - particles = new Particle[w/xspacing]; - for (int i = 0; i < particles.length; i++) { - particles[i] = new Particle(); - } - } - - - void calculate() { - // Increment theta (try different values for 'angular velocity' here - theta += 0.02; - - // For every x value, calculate a y value with sine function - float x = theta; - for (int i = 0; i < particles.length; i++) { - particles[i].setLocation(origin.x+i*xspacing,origin.y+sin(x)*amplitude); - x+=dx; - } - } - - void manipulate() { - // Loop through the array of particles and check stuff regarding the mouse - - } - - void display() { - - // A simple way to draw the wave with an ellipse at each location - for (int i = 0; i < particles.length; i++) { - particles[i].display(); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/CircleVsBlob.pde b/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/CircleVsBlob.pde deleted file mode 100644 index a81a4ed84..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/CircleVsBlob.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void setup() { - size(200,200); - PImage img = loadImage("texture.png"); - background(0); - image(img,0,0,width,height); - save("blob.tif"); - - background(0); - fill(255); - noStroke(); - ellipse(100,100,width,height); - save("circle.tif"); -} - -void draw() { - - -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/blob.tif b/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/blob.tif deleted file mode 100644 index 62b3058e45db3d32555fa9fd3be07d2ad10481bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120768 zcmeF)3A`o!R^Ih{xrF&%z(9xuqlt)$sK^vGfZzqLU1stN{1Spdl z1yn#m1yMo3h$IBiIDsh6h)m8XY7jLJAHP+ zThDr`_CD|Z#7}(92fpStuX(4}yz^`Rzt_CIz1RBxZS%VQkKb?qwafn7?fcumz3H{@ zaP#xG^P2a(eedgD^V;{m`MFoU_SY@%eV?1xy!I!5ulH}~-2U&?cr^oW#tgjnQoP+M zUiY+k`#pZmDc<41c*i~7X^(ea;$7~>yYBIBr+EF{c*7gs@b0(q9;bNE`{NI}6upptTW)82sKcpH+Yc(@Y^(W+h2sw{ z5p?-y$9KNn+dU1d*S*SBjJ?X$Wu*3>zRDFyu8^x=`>I|+8vvcb$YM&dM`h*eIR`BDpAsBOv(|1c zaqzTVkwDO|drsj{>ycyZK$;6U)4t+&Sk5fdst;+AD?d53VQ5XmPPPMVwud{!vx21? z=jtDRa?xTP*t-TQhwY39fjVF3ETNrQ;4InBeH5M5Y0`U0`%rXIi_Xlv&)xX-d-z#9 zv;9M_hSTg9rk{bUT)EWGBjU1QDFS*B8|`udZhw+FMbqk)#L{pmn==vptUAbs`DO_zs8xg>a|Y8 zgTK1SL(H5F)%uewxpKPo?Cqbq8kS}`BTy?>l2DgTW~LwSQ>TGyt%cI8l{&DLl2r6F zEq~bE_>GSZhdCTP@XoMxJr}8K6_#`8nixaZ3fQD*k~XSUR%2}F8pd8IR~K#h`oj?Q zla`$)jOeX8ll`A=)UXHOdSN&ww z2a2KA6T`qt$Tj=kctEH_&5_$Vh}C)}>(#DMS)uHYld;8m<*p6#h@#|_2QkK1^V7=Tf`!m8dgRmXE8^rFNtUOOv{K)=(Ih zq*}snKJjnl0ISUWQr)kT4(SnZs-TIotj?vt-GNGn1Y_g@KD(ppbz>WKd^ludcocIZGT&l zbe2K4v$q}8+i{()dD>wVtZ^A#whhMvSLJFKd-DRIoEz z2d?g$fCu=y>@!z2&MZ8rrrpZVXjD1Wq*6NRE!zjE)B;qExm69;YEFrjd#XQR91!~B zuZY82I+P#IF~e+S_@aU}D{Bhd0JEYIu9mE)LTlHp8{xXh)tHL%JgPO_eUYosYVNFn ztrb7()ywCK*v>*`Y1eQyIF-N#U%9m%qS~pu&s-%1t43ARgE|cxD@T9A)v>;-{W)Me zF*X>-*h-fxY%-p?YH71xofTRVB1+D~Tm=}qCjV6gSF6#QnHW?D;d*ggtw&z9aaGH+ zUR}c#(I!?S<7Meeu1foikHl(5OyjQ#u8MKyDjp6f{fSq^;Vu4p5wlcl(6ZB24P9Mo z)6gmc%(|}ODs3-swlXQ7In~)-bn*{#HLA6i7zTNG8nwoG#$EFhM|dh%WD{41k*z5X zdNt#3g!&>^BU3e|Ce^Cbwg;T1%`dvCh?<%zF&Q~j9}ff32j50Nx&7Pm&%?jY+s``= zepWEoGpMh0O;e2HTG67_nSn8x@}mdGh>mvUvU08H8r2%%QkOGVqgo>o%KE&xLQzbv z+XGiKd`C8es!O%aR=N0f>RH{{O=Zg^CzfpGO7;#@PxHo)b{6u#%2B0JtYK!9WC}fG ze8`7<$cHZRVYl(&xA74l@e#k}HvZ&2`rEqSPrULFj&Xaun?IdS{7HMvHO%GB=mh+b zX2*(}k3*Ur3%@9016#vUG83+*K#X0aOLeC4b6i7IJ7=ztfV7ndoUGc_{#mac&DG#E zGBqs4CeRrz)$&n7SqC=FbBgD@A|G5^=TC zweH`N_*)J~3$H-l5!*I%d0lOE<;2=1XrWaH*~)RrQ?oP$dKCvc@qm28wDoNTM9`YQC9 ztD(XUT85@Sb&2`m?5w2OA0XGGrCOQW<9t0S=sMbtIJ2@_B zf$CYgQr4MGt9A_)b{?l!bA-onHA=M(!PTW(_;8hNXb7(NdOEb(H$y>^6RUyB&PA?9 zBC2fau}aD?utI{I-+GD#u_wF3*zBywad77f{D_RhM-RUev4S$QAsCB|G6XJN@;dUd{M(h35%4T!CsN`T$iv!FEKx z)X5~S*3Ok`TuFXYqfSq()N9qKRhqgn^OimOpA!j*PG>o5w(9ybs{C04y^ ze^nS@j1OO3*4bZO$yFzvtt&Zm<;vj{QQE|EQmR#@iB-3I$y8zR-N)6+So>$LqI5le zI7Rh9PNs^w093IwYe}grv-P$Os&Jawmq5X(M+ee4EXlBJ6DUNDK-KaJbXKQoIvS$T zias#J$>8%bxACzb`>}ueb>Wr8?OSjDoMSo{-d56F!$s1j9g;GDt&`EJb(82;u`Yv| zEY*Fs^`kUGOXMpsR;p)A*f9|GyBdiZF1H1|`Kr9iD)Cx(`&V)`A~rh+TmzF1<$xni zc4CP@oi)lucC{|s#jk6LD9a?&qE!!3({z#}UFFSod{iI}OOme;`aR!bxX^(!MJdn9 zkHSYn;JopTZ~VBA`?!z)_>cdD+xTru{2BK|FX^OP?dEp2F40lx#Hn;tElPCM8hgK$>@T_sW&Jq)W>C09Y!-Bw~X zIAwJbtGHUBB2a6X zP&NA+9NIiLPNP88l(9XFl`5}#qV%gk#Rf?J>?`5`-HO(L>Rh2UbYX0+D!@W(OrRah z8Oa*eqF3FatOIf7Dzx-wDYZ2VB-wzF_Cd=uq*ucg1t_MJcJf-Poabp28dacrE?kYd znjve)xyIwo#l(C{MPpsIi(g&3b!DqouB=@ighmteTyl)Rh#IKmv!1Pg^XF;Q^!PgU zX5u6iw(H1K^ci7bfCq^FoFzW-6F>3Ky)L|Rq60Y8@D^z?HX?>J*E8DXQeg(LG}bCa z@|9{OTxplKTItem5+z;eDrlD+CjPc(w4%!#Q5~U7g_4~u)|FhX)9^eK`$?~9dah8# ztrLkeR4xhguC3@&UHr_xf$CtWh9wCRk|RqAR9%@-2bIJMNfx6{Gw+h7inX#dauiEZ z1b|?Ooj>n3{`}kcq)+;!zu+0eTZ992u%Xhq4y3t;7)v%&GgqF7rC`WTucjvN(t^lJ6Gjx&*g|6ZkRV(2N7~A+cZ|4Q!vVd6W(19jC3%~vC#93#pwiSc=2EAF zC`Ht&MX{vrF%UR^;cfgyOMLPtfAU{)Mf}Bg!@D|0hwS*lHoQ4ITOKk#%lQyYejQb>dxB}HoJ(&?wv=SwOSt;`_ z2O`M>mHdxJDNQV`Gfoi`5L?AnW#z8=Fc8p)px?g4r+mt%{H520S59;QM_X}oE|?8t zA-#^y)XX)z{_Z9MZ04i(5fsewSG1xl)zXOpCV_fWR-qMLsn(#?-M5N_7U2>BMi~aJ zsqDjCp$l3=&g`s=%?}THb>_;sI`1vrH+O%xSZ$xw+{e`r)dXztB~v?A8&_m%+?4F; zQ2CTqLMy$@4(NH~pfzgeT%k2|VQi)( zz#5b;SW{SnSSO=pu3XXTK`Y_9$d#-@E4rxGDp?P3MHxbCrR#-qHJ+-o49pL6r6WeE z$geoNbQu_^5GC~8nJf8>sGyQ+ZiG@b`|{)iRkM!{C|NRMwsV zyvDyD=yQ-o_I`WX6~-%FGZq0BTCUmkLo2$VWoaW>(Io>!d(h%Dp(R()5+hlR#Bdc_ zS~$JR#zRY8jFOS8^lIe_T0)_#xb4ir^C%oedSGW2D-uWO=+!k`5v!X~eJfT6t{Q@R zC#BLygjxpVK{Ns5idf|z603~*%GHQfM5%%{R~OY05tTV#iJ};aOQVLRA?kofK>Za@ zivxFakU`Y(L(54MuINIz3lp#pE!UjUiZ08sw2apHc|Aq62d#u_b@HJllNaw0LG=Jv z(8?Z@tO8eb<9TrvOS!V3!snT*lxm0i=0BbgS1zwGwKYYmYimVX22ohjL~s)8t>5a^ zfh1`{Z#Mp<6iYI!g@sftKlM|?GYGMVy0ebC;D)1B2$(e)EmL4jSiU6i0J0%8 zn&hNf8c=9Pn8{?0qK1{^Q7!q;hbYJ44v`2b9A!|)BKexx6kw?q9#Bz$B==5{CJw^o z=Uzjgir#pD%JD&ks9UaYZUc7%c=Jh3cD=zDQ7cqdDvUotplJAE@MY2EO-P_jO6mA0 z88$3*cPyzw6;YZLY3!5oDWX!Y`lI42Meu;nXMDzI{B^hSnVAhhT()L*^@*0+#7eBccPJpC;}xa2dEI0Kq*$k4pHPnDTSH_ zRdr8|kN^yXtOR}bXMgtRe9q^5?t|e4!Yd~n!EvI?VGHM?Ws$riwlU_a8k(?=F_-Q7 z=eE&`Qmqv&8PHr(q02;Q9mXQZC6lr$qKkG(xU`!TBD$#7pkMd>x~p~ZBJH&zU88r>=d{}Lb5om+-`@I> zsfY?HIh4$Z(zcC1lY&gizcv>t0;<6&hog3}q?Br^xJs#piv?Jc6HS z9S5S0SvbYW*E%1YhS8OFQ7zXGEivBS0;!gj3TRpWNY-#ASDRhf>1rmDtjxUJ3aTaH zjY3=%GYYvBWfDX{1sgi+Ks2{ujkJGD$;Elc8Zv$P)nJd?vQf(7`ckB(p zm8*teN+luMP1B7`rBpgJt|%3#SPsoA;fYnVBa5y&K{bXdqDH9{7gx%CTlvpQsfMTn zPJi=*0lF2fxPn%~6=0ziT_ap*hgNhEE?4WaGg{G=-Ab~oR6xtxiMCWESu`A7D_70L z;VRXND>DLG@?V%8T3&&~TR2xU{wNjrU9D@5sAjrOX$YoNO@Ey=IBB;W`*0<1vL}u5 z8BU1Ox$-RM#$QHV6|_0AN~2ao)!;LOBB}`(OUYD9b-?NKKmYT;;0wOsZ+S4hz{`fa zgw1hAyI>}q3tBUF0}SVYN0*2$XlV*z6#%oG?3UiKQbD^Kg;GJa&?O{CuAn87tfpZ% zhND_ijVqHv{spvDL}_LkMwbc_2QdSYbZ|RlM3{!--p6I7S6M8obzgV^SsRHPTh(lB z&N@X(W%f0TZCyz$1;6Xm4z4`awGhj(G(?&BX;kBnI>nN-lpl!#lGF(~OrxY!Vx?D} z#i-Nh5|&hI_#sLm6gJgb(N!M_@$x(N_@XcRqA&j9FMiXT-t?tQeA$?BUNLg*UOv}BEP0?!2pTf7;OdIV!5UwX&FHB??pLNpo$OS>A2 zIeBTEn?yZ}F$vFTH7OM0fL3;;Cl9uqOpGaOXrW6)7mKxyLcoZJ(Ru_|O=OS{S3#v0 zG(|*#O0!sw#tABm6~> zB19!bU-*Sz2&Y2nkuV?)JAeBgf5#HP^A!HEm)Z8lA9 z972WnKo$~9`h%ydDT7`U0Ao8_ZHUpq`IdwNI(T-{(&XF@+-gc ztG?>1{=uh(*LdZ`SA4}+IEF(FjE?Lq=*o#<49u>9cCEt^{LtDI_H#EIFVHn;q03CP zWXp$^=Hdi$1(KunsJZ}HbjhKVQZ2a^=n5^#7Y3qG4ru9mMrDLc?G$lUE%l{W6Ipli z((?g>OqgzO*dtv!Z~IraY2luld@q{o1d)jj#Xuum6Wn@sFIsOT2QzyB);Q{-Hgh(zzlHV>34g zuyhP&E?X~Hf=IritFgG-u1`NZE{ru0v+*$|le|Pv9so9INj~A)jqQgj3bYgmT?5!~ z6y(6I{b4t zA7zdZsOFtA(I}y6gksdG8HX!SAu6aKfP|om5VQPBviE71i*%`ap_v$6gx9((a2%IDBGCro*sUHxtTU0$>&h#+GCqtFXhj$8y2usD z646Dt9?cb~a_pPNz328zrgZN)>eZPmu3*H9o@+YtK4L}rB~UVTE2899a8rpDqJl~x z)FlU{Oq5EPIK*n^9l20eqbj24$pNYeiI&J&Q2Jf}*b?(|FB=GxuT(3*Fy<^U4y~Dz zGZx2v=>=kIAVwF-vMy@8nt2PCgacY7(hN+f;sEehYflsoimho}siYpGSnTGW0 zC3EGB4MCbIT**2Id%U0#Ts+C$Ci(||Fa@?WLolVH&z39$3>B{O>Tv}s<4+JPP;pi~ z)tM`kf=r2QmAc?cfe=Lm1g=0urbelZBqbiAsEX1f0TP1;RA3WC|M+cu!#8|`UE2wN z^_uW&>j;C^&;?x>hgNhEOcEMege%q33&eKNG7YWE0>{Z4h*Vk<_<^}elpKa(MN3!8 zAkqy;8x)ag`7?=Gva;pr4=hiu!e@X-f<-eC8@=mAP_}rnYMis@*Vd zp93;ioYm$gcc@H%Vl}o(PIByQRpT$Hh?Qi@s-RTNh9v7{nb+4!V0LJ8qa=+Y0z%2u zP7$$`C0AA@R%k^RGxbn`kXwSbKfm!Czww*C>6`wEJ^snt=&!bZF#BF6yk0=gdoek% zAZw4B5WPQrQ#bxI`_h+;lvh7k=Xo(fU2 zr%B~=?)!{}pn{XZkylp^0tKgop~^}rs2Fup_Y?^RV1NWR0w##Q`J2D_Tfg;N|LF(A z3%=!BzQrqxe`*g0*+F|kniCy#3}y&NyMTR+p=<1x?f{r|Ss*FaKEhZu`n8ouE78?V z>hm+_AdD6_J62*x|Z)oOR%8 zWz0W`JQb*-(c2w|Ow9u;7LHgUx$)=hpmG_56Qby6e>mHzJ<-3~dZpJF-i^e8Ez+DN9V3ZO4QZGi6bxpr8Cse` zBwyB*a9L?Li5A}Np=^+DfXR&R(}w7x@Bl-X#$+c%bP+D84lVhQE)~)5(4tx*wB~_B zbg8KltF?$Or6(_7*r+e5Q8J(%c*!Ba*HP>gW>9N7uX#M`&4Bsx@YwWOauq z8$EfD84ain1-hU`xa3eub*m{Ly=;b5>t!9i8<6c+T$RHRNwS736(kNr7uBK|29wy~ zy7?dIfflI|(M5u25k*=xYTe)E>VjUKxpJb!%6SE_UBj6xmyM{PB33yo3nWuP#RgbA zvC?9)L8-KxrW>xh0hB#`8dP#?DBy}%>F9yV1jJPuHBc$p0V>j=z9dB;N~k`yfy6(* zN00>6cYW7){fqa6e=2$r?;l_8k9vcM55rkz|9 zD-$rW>P~QMRYQ>G4_7@>aJwYohG0+)SGs6L@GBbIm;QXTo%)WWY0j-VYY5KxGXaT}TZxgWoRuM{BO=NK1eM`#2=Y{L z>e+(n4=O~36B*ZW`i>)|@RCOA5yeyxD;fnS6G7)P9+b+kF#CEorPGbST>9#%P(&!m zMT1Y3fu!_95gy?2-QWG)-}61+^RMjjz2E!2-~avJ|F7=xyO;RaPT?h9IpK{C;5fk; znNAd7$(IX2b+?V29@KjX=9+0Nx~xKX0L;=d@Mb;0XqSaE0O*npfH9mhlY3`G15Ea~ zEPX1mZmxySmF?WSrd9$TUODu;X`)8mt*e)DgDb&h&As6~BL$f1GuUUYvRL4mIQT0+ z_nPh>SFRi_qS8a>%2OdKsF=NGADI#^l2~!?6DAk}sl>D20?)%gNRH|ddxb0Fbp=z`uT{4oIcM7fI zN{=Ohgzx*l@59DI(C_|%ANYYE{J|gmJ$wA#Q~b~m{ZK#i?_MVU^*wOsAPxnv7;|vv zI_Ma{R@0T^qF~h35`+nkuF$efbkQ!#Z0$NLw0iOYEe!~*o;-w>Od5r{Rc--hCQ7wl zHYVghv~Z>6p`}L966&Rb&=MnDiW^syq-oeFgqCS2$PP{bLynL$agnQtYI=HaVii%T zBC#5oLR3!}hATc0SGqtuxPC+lVudS9(>ntd4`BKFE1Bxqg5-b-QJOKRdjLrvXDSURKw2XA}L}QrwuBy1Buv(6WD-9{Jz`x;XQujHvFxB z8Ngx;kkHztZj&+xcOqyxDY^p8Wss~)7a^sn(CQ}f>%ML?^8lk=mS%xHIE}6(E3`CP z!leh@*Mt_;(v`TP|AQ9E!c~$rXeo!5hn5;`ckCa&{np`gRGwUQw0_H zwSabrD63!>8-m0tr2>^!vi!sc|ipxVXh_ryuefajK@?azPXZv5zv{-__`a`*e<&_Uu8 zU;?hr1uZ9yu51|bY#@@;&@vNOGf%aWEXy z7rBZkP_0AI_zNnnWci7en;K9_3$7Y}pfUlaPH*ChOa+yR&=AzoWGbi>LS34DK}83Y zEKeR(YDzca3Q_a~ROAH!co>aBNJJrLjeqlQpv=GSGPZ3-zEZrQ%UKAcfxDu$daY(6 zu2wTovMf#GbbA)Z%J#%&7YHZa!W`ChvY0`m;Sm|FzJ+8PB5m(*uQL5~^ zk`b#>Do_y(>M=yo6Hp-`s78DU5oSi80_ykg@o(+XerRo4_9H(MT9|Ywln!0am1M1G zp?%OwvRpH<9kfitM&UepfR$u+MubGv%2E{lJ4^iAdqB)T zjf}y}5khO|%E^;Q=Y_N&T;?*gqRT*Zoi5k}r?=5%rt6e$3_}Z7gqj(EmM#k|qmZ^6 zg*}01w4g=yS&Ko7d*?S+u1v#j3A0$CrCursEiS83=*G}6GMkJ-(I_;z=*(dbj&*0E z3WjP8e*URkIsTaT#L5Mj$a!@{aaQcKu>?)~JIlmSbnGm`r&hK-2(^CRtZ>K z6(L#NFPAlRsUT$-y3|x<)f!sSrS!%YwA>YoNB4(+6~kQ|qAW6_6kxbT?>Zk{!#Wv5%Qb5XgFCudM8XwUG&!y;TysIo zKnyLJkt;5gyrV0$w5L%xXc>rF_{Ca=uWmWHP0aTXSKaR!Kgk0u^VaB0Z#MJnp%FilW#O93JqyVSEn^W^BrCM2mYJwS`HDfyK*SZx!G5@7O0pV-Nmgjl z0kh`ia0RM)c!jHO2IFdO10Udu%+3(B5VyM4)dO}DkXUIY8K75MEU_{K>6Ia90un1j zP)o|5OyVl2JTQ!_ZUBRdvr-gXtwvqF4p4E_ai!dizr+d*kRVe9P5?C={il2M*LB}d zyevsOqZM7w(rx347OnuF<6^f+mQhG-J=Y2?Tv?X|n)T2kS@ii=Cs$}U0R?jfe(FkQ zb5@}0F}s#wt_CWtge%TUihCe|Aqq*O@Wzb*Mxy;li!ckw>cK)aYXA z$ILenU8ieaA8K(~6xftE3PX!(dF-IM8ih%g%;-Uq#gURMqfl4sP?mKhi_6l&+L^N* z$x;z5-zZe3jMnHCmz9Ah8U|CNki~jlbMQXBa-w;>z}*Qq5ofN*>>JT8MdEfr>AUE2d(g@^~S0)eYc0t6sWrUW0Je+OR1EVdYFC6 zji_uD3_t~ml!pWX=0D%#zj!dbWaTdTavVn!0p=7LcxX9wGtpH6o|ZNcO+#GGlLrlA zrc+=GoX@7wMWrcrqfnz|;N{9KbJLK^l06;j=6cYItE~H=rOh9~mAgVSiz&*w=d$=E zk4B&Bue`u35hV;k=E^}Df^ZcMj^UgYqBtu7Z;qW(38vjGhN*oGS2B=TQL3Pl9AX73 z6ELVGP%>q;r|X8oh!v=MRHYDZ+YuE`ZUb}dJw`D55T&MytIGNFR0RM?fW%73PyN(S z{q#@&^nbO-&)i0Twe^G9_cHNc?twuEaj2P$j!d@+VUFZTi+No%Op^Ic0h5CZz zS_rg8vP{G1vV6^zWcA68%rFcjE3}dqxi{DHp+&VaT4%jdUjoAO zjA{Yk%oRf(TAO{}V?HRflWF&Y16PiN(ue{TJ#?bHI+;RLPp+DP-3i8(hYYS?a8~YZ zGgpRSO4Va_%ct8Wpz){IC^;8Org$nM@2*E<%Ar1`QHbhMl~kL6GS7`D0i`lTw0w`J zlqp-KYDSMb!bw3@wyBpiWyzB!T!cyx{oK#}+|U2~&;Po0sxT-tyGKn04B7+ zQ#?nmQYy|Ws7&p+3MxY|b7crxCa64M(Mpz|R}U&;B{P&NsND5P9Y>*0ALhysQIxnE zuTBuss4-NyA|NyGk|`L()vYr93{+rqm!k`R^BU|G-V#^jYembsnu*RU&;_mGiq|4s zxN^-Ti`a%1;nFO)G7T9mXqkz)B3bK)J38)Fu3iaOnv_^ctO?j-D+%`$al}f4t4L2l z`_xadl#EynRNeX+e<>BH604>jsDM#G1xEkv)52>~tpE$H#-d{i#5$MTfh23Va#heW znyHpajsK@|MY3phT=nntf!tW~n;0A*li zlB^z(nn!QFdeuFkY!E9Bfdyr&Oh97AKWIsUe+^gWNS?~w7N`_U$xOiYc>=jmVzmw` zcF4d2K&~mMOti!bR{z~Su@aY%g_a{Y)Hp6jcA|&5%4-c*R$&yTS4^V^4kKB5>TQgx z%oS%PJbE>7&;Dwhl_w1DTUkL58D3g)2i4RGgJ|V-lFFxXN5< zOuize@~DuB)w~k!=`>qq0un2B*AU^X)&~ow46#~o{V0Yilc|WB35W-3(?mlEZ2tQ_ z{)Z+0$5VL8aOW-F=pe8hV-GMVf-#rnymOQ2ssK;5jA^O`Esa2I&2iHZS}c}zS)ftq z-XyeSzyp>n7RlnWbetYE3O(o}S?&#Wr4D6TN3ytgdL`|ij*et02jA;ygBo$~9E*CX zAd5AU&2xm#bQD56wg)d!Ce{%S_iPro3eiS~9>1gcg?-T5=UyO+#qOB+Ke) zLv(rUoOO4{G-#=amTwe>mU>;o6=4BG);;%r(YLz?obU;bdqjTz8m@Y_(48Qt+(ewY zGQJ0@)m%lCxv!Nhf1sjNpmJ*iDoQm_8G`g*R)ea?R%V2bhLhG-1wBrz@>GbL2MeG= z6i)>z1yxoh4yR@x07js~2`ZQY(J%edFa0m~gnuexZ5RtJ2NbEFvp{QZ4~<21xhiP& z@PTkqEsbCl4qBFDY1Ft+453AzH5ADTEeX+UG9y>y9a@YQ)sj8!sZ|Fpcij5dj9{?_ zEp2|_ie%x6#Tv;{RyX@JM086?uP$;0m~IK(6&3@Por_%c@Cu?1xPAKg{@ZU!IMG3@ zm_1x2Rt-VdNoG?jP#J9G_}`ZJ155N{ zFNwPta|BF=mSg6-aGTvi7oBu=VB>rqI}k2tkyf_Q5_AW;ET>Uunb1nLEZ;o~_bwY$ zE3YM2BrCL%ESdDEL1IITftPJu8HIzEiWnu0LhVno)XRz>9jNWjwQL0un0^ue8;(a>ZPk3lg4Q85!x7qV#nA zS-E1U=uAqL@}T88a+Qr|=R%9!GL!+IWEqI=SRdx9X-KQ%$|IN2D?R8QCzthd^eXGl zVhI+@Co->GuU-yUoRtYktT=W<&>fIW&K!JzD`I5`CRT=^dYL#TAhBu)nn8+d{E-p& zZo;%8F9)s+I9weB>VLl*gv$#WmkmTr8ii-QdNfxW$J5ay3t9}oHC$1C_tz{|qtKlZ zANw5V;K~)W+}Xtyi#5ShO)%}kKXoUFLvI0OAL8V%9^k6S3+@Dkn+tcZZa4VD%$1u# zH@R*GnRd%$u85V<&k1u0km~2dgDw( zpaz%|VHn9xL#pK(TouW}Jk{dijY3^ui1UY5!Dz8qM3{AVZ(^menU9_EU#1UoufhuPeR5SYk6IcJ|5`S=s|7#Eb2tBV9G3E#k6@}Vx_@VB(6Y3sp5)KnSCo) zO03ocRTGfZK*C%TBUZ49pSBBDe{g;tTG0h9Z=abMT~2fjS6M7*8RZs2vM8_xK9wuE zB3aNH$)fzS`c}$SUt_?ta6{@L?ZbNIA%lk}K5+|W7-Wt`Jb=ExCb-=gNh$EV%z`*mFZ&!8AiBTp&}^&07FE93LZE)v-E$T!fQs) zyd|zivf_#)8ikD9NEXdRJIj}3H40s`rdYYMD34G)@(nH1kX|tZGYWI>XRdUpM>m6( zr=zkh?UMgW^onG8+TgA&z2c5`=f3$X1MXn49<5iea)q*$D}b4Xu#BsjhPX0zSIK%S z<%-2R&%rBw`}K41Rjyv;>VfABZ`*ps5}Sh@yCLZD0--Pmjig7+!Dit9vxJ{;Tr&q> zf?n~K=Ah>-T!E*feW1fL9Q@S_nu8bh>bd*&w*{ow6)8MZ&)s{Pel6jy|+M-AuuL66JUM-7jjgKu8F@{r;Dy#3AYukL%^POr|- zMX!8*^=9X4_3aNlzj|K&>aB>Y`4Gnr?YjPRoM-jz_i=Uje6Y`PJnMUL&qXi#_VaVm zYkd1l=IZ+AqAy|&z6ibYh;{ua$F0G$em?k2&)d(R;~YL8oX>F%&)fUZdHo#c;`8?P za~!vXZrsjXWyqt;w!6Q%8O*d_$<;apeMETixu|Qt=JUbx^Y-)SgFeSOb9H{+{#-tH zZVvkFkEinRbK*+9n(vD~`uhy&)%kNAde!er^nHeB`rP?(pATOA+!RkFI<|dj8yb{XTdUfUZ zuijep>H)6ilfh^Gp3JXiz3N+7EZq6`Cgyv{&-%T-e#6UG8VLCMy}tE(G6#Qk{{EGx z?k31J-;=qhS72xqHVykqgBh30YP(LrxblLODzTamol~me%AJCf_T?*r=@TViX6VaT zzS`$Y7ruIN%^dU%v_8b~3C_ju^}Q9%!TEihtb6VqSHA1jE#Z8>{hHs$@qNYf_xe_@ ze740QoWC#X<1pXu?yG%nxBDfp^Y{8#-#*GwCf__!FW*I(Zy@`^j1LMuK4PRr-|qA5 zeXKjE3WPvqpKse{Ow^FpPl5`B!dn`G;pCWoWz>n{%6UQcOy3vvC7JoMs9P0Zmz^)k z#FcMo^H;uk)tCBwbxrpA9`gGAD__v{YX$Qq8DCiH_i@(WAM{ns^~<8Z_;laz<2)CC z_1w9-=JzJ#$|J1x`|UcEW$l-|*jHce^ZiL__Xx{Z`}!)fZ}9THBnw);HR_94ZnDS% zae$VO$~5SzJ5 ztb&SIxdvC&myr9is1|U|^Ce_o7VXPdzIoL*kU>SFaW!8So!^_dk}Kaso-ZN$;;!$9 z^X<=tD-YYd8T629;^Kc##&@*5Soq@TaFtR$Fb5BMZ5;eLIof3d#Px71Xum)1mFJf9Hg19ipBCB>ApCMD_?Qf6oZyW4fB=Jhq>}? zZKKdrEULw2^?RvC0Lk(IM|wRW)WXv4QNu`b_@Z|#5F47~l1em-1zz3@h2KlDDWgReh=aM4(c-dHR-w6Q<4KrP061`E6edK`b!KdS-pf|5h*d-}Z^9|^ z>Xgc|{VZ1B^rKq4$vXabKZYecD^8&5_1?&*9k_Cq zyn0X(D>o5nPptgXkXu)G8P{-S`RHD>s9FwM4EGD>sA8mF)Ta!p-3P_ZiZw zXXT2qaim{(BJ1w$4wc2qWkJ_RgdR1lqY&*g3j0-hznbb- z2nQ|qw*6|VdlPqs9ypl$e!Iy@e8UXi?BkCSR~S+XaST9vzqE~+KZW`x^t!vbB&X~g1m8np$l57tkwi1z(T8s52(P{3K&`nvvQ)J>^ADgM}Ih zdCkPd=L|2DD+{E_gO;^>)IhR)5lcdR5Kpy+t8NTsPbTTVr&ysCS9;l}v7x2AO+)?e zyY6ZfT13EzAq%0!Boi)`<#1NC2v;*Pov{tAut~mv)L&Pk`~-oB3aXSUoE%dSE9W9p z169t-RRtBL0+kk^v~gt>!xdXKP`L}%Sv^|-Rbs_|CRU&_0ZF~=$)s)#Dq=M^gHPp( zGO$&|inAhCh9KQI>(!f)t3K07uST-W!TGk#!(7RgQJ7>k3T4s=fL5y2D3o@SBD6@B ziWnj!ON~NHy-XS6u%e~11Vls^)lz-J5?a(okew!D%(P9!)@?X>r3fkq!Bs?M)SW1( zoLA(mK!qquCBRQz$?S*~$Jh|Gz?2G9T1i_q1VKft$T%@4RzXFq3_)BG|KZ9*!oDGs zUJ)yiUiG{4t6rVCGLlwv<>{q?^&Gi!s77Ja(5QWQ4!#Jki~wlKEws3-ES6C?Xemcr zsZnUDmkJVx&@v54mdct+Jtt#?B-sK1mg{Ytcty9eSb81k*+f^aT1T?8Z zr3yZfRG+Y5On?Cu@DP+|f)E|T3wDBTHs0tU4&{I%oC1l#b6#vW0bLd5 z;RJp}=>=XLOP0VcQmUL4jj~L0pHf*eqTocm-Ogw?{!?c1REW}#ZhW*S{fCppa#o<~ z$(6Lj$;eOwpRDQkoE4(n396J4GhAibd&odTlv}J%L|3lNHC&0g8MO0guAB~9Oda78 zgzF+#M&Y1ExRNY4CWDr>lPo?{HmFwjhH|9`L(5F0T{20sBsR3nMA?>h?QBv+mvV6L zp`}dd;)In?5g8bCLCfe-*|G78jxJ~=UxuT=20}#lj6=>2+RdgPdV!Zkqjz~PsG549 ziYp9rcM(N7v+EH>RD;T;QmTley**yAG~?bfSxQjx0G3aqc&ecK(l6cq3)>zn1Qn%X zBs8Wb9jHu%#LA=?s61rQ=3}cs<++e&j|Z-3g~~=0sE8HQPFsSCQVFs%4;dcTEC1@1 z6KM4IvtFIKa&zj!1j%X|y5Iv>I)!OuAO|fCg)6!(8=@=JU^kp2EB1_nZycITFLU?#<+s0sVW+U=zVEi8HFS(u1HpB z#g%rJ{E;kejw^TQBrCMkE0?uC(Tb}<3s*A@p;h3dfry-m9kC}HKlhqV;PybHz~>N^ zOTWlf;}29OU=KpC;mYz2L6*P-Bvyu?%+M=A!cAgGutK32AkiJX-Z zc*uY&rQxgwDwg=nmEtx58-lB8-^bv+bMP)!@9}7^Sa)2xu+Yl7>w@8m%QDlgD6XK@ zDAZ8Q0JLNyw74t{C|x=+qeZgxrV%h`aal%#w7W|hv{-j@B(#(%;UWl%Xy}Y^nT8}w zt<5H(?j(f^0)rqj0v?n{3^sOdglSPHKkQ}E=v|KBP!1>%>)=k|bcY+jWQv>`)}Yb_ z+99Z{BCagW5Nra1N-J4Dp9v~N@dnyWX0q#`B37W{B{V6nBoZV9=peHi{m^s;jY$)cYJv`8zZb^U^B=@Hi5>Y$~4C^Nb&ToOV{ zLNZz;UAov&Xi+T&UK*uTw{op!fzEYf$j!2~=;A}nL_Mx3s)H_GCBPJ}dqbr(cK}AX zx;-Qv1VqI#M!1@cV1NXjp*DkAupPGkHAV8`!W$jLp>|+5LnWMrNHTb4u~X-)5XAu^ zim2irRIb^Lts4-lFxe9;P{GMc^$`PL`9Vdd5JkyZ&}7Q^3o5;-Nh8Vx>@j;oaG=7K zHt!x#jVKjAObS%6$DyDyfDA!grBoa{u`;SK(BlPE2=<#5cLQk5d6+P9QLpy9#+!`? z4&F}mj6&hC!YN>UK&z*tLzjW*f+;Pu1hlNBQAm)rPjq?UAPGd9B|w)OWOT`rbfJsF zN0%IuELmkO3<7i+h!WnzQh=Ek*)4UMCl44ST+Kv9%*g|6os24OFa;Q4DS$D9avPR= zU}lYe7(%vDgi_E7#}tSPq^wkf4^*xSOFdOUlz%VMWXIF&0fjvBR}JlMgLO2y_Kl`ZIDAMZ;Ks^{=-Iw?XBNj*v__ zrZD@Qh(eB1WvFmvO!r`cSmDYwr&OS_5b|qX7MN0j%JjGVm&O&bG6YAjOhA!dHU1vf zs|Blfe;ijc4M(qxLI$3$>IGsOTF=Cl9&~FHT8%r^uO-!Hgh?@IDTmS|S)s)M z=duPZ)6f{=~P)qE~pGPb|S6q{M>8A4&###`y5c@rkrT*`#=S3 zp2}4jf0Rnh4IsS@Dnrm@w=N6RK0#&lTYf{(1k`JWpr$hf6RU)Eoez2r>a{S41k#kNtVp_q}0ez3w42(fil9S zaC!I3}> zk}TFj!vYLi@+{$cS@I1FK172nis}$9fN6il;#<^?Ca7bK0ZfU}C8!4tQTpx{BLNjg zBtpcHcG&4(+hVftE=Ne69J9v=&J|0}OQr;+iX}MFRS(~EfoonLDQFh!vOvq!L?$4y zvV8p&PHt+t6HKNMMX4AGy(yCs#aZ>(DzTD$L-pg#msY!=eI0*vf6#1xCqhe`{I;dPT$rXrd z`~?-9G!d01R+g{75XB)-avi7d(kMic`kq-yV?@cV`)*<-;gm}9xe=kk6(z48QHrHx z-2<{!L6un1C}Btm08p66aYeO~vgpddL(2ih4%f}cg-KSbWg5CFz;CyyJ6%mf7E45z z9!avGMYW=ffwz2lfEM9G7qp1Ebh%}YE>bUz`gE87?Rn{nmX0D0lPpssSOa+zn#ub^0C?(L~D$?vD zQ$c0QtV#tcHC5sRSD*qz_jGNq)T>8x<*Gs}x?HDgekQI$OS=tM^O3Y1@)Ei=x~P_c zsEg+gQ5DQYTxt1n@F7aAIg}>JQYJyQ;wrTI7%|Dpbn#v2 zf>x46YKnwwfN5uCtbIRE-`WP1Lq(Ls3S3dhh#EsRG6gDwn^=+A^^rnc5i9LurJ&ME zI?DuX{81`UNlsif0pm)0k|_Zy>18>jdbk3W!J#5?1*+j{CLm{Zjb6QSu9!3eD4K>w z?U^fA6K+k+Mvr|Kjtw2VS73s*+KNS0A3+tRM12Q9NhX-pH6rA$J- z2m-VOiHI(8q0qPrEp=}i5*bK{(XJVbVROLD4-=?SIZS#xs3OW?g|j$aL^*ZN%2hS~ zC~9132Yulol~{-1K&6!|e{9uoC07HLA*d^LD58SO&C!^vlnPWDTwPv1R~h?M%k(rx zhpUaPU%&ki6vovmSs>^41i%I@qmVPS1ffSpvb2xe6T+pN^pqr^i*Nx*0f-EaHk}adazPE(uz~Rfr@DSC%P4%i1LYTB%mTrS9?eyw&@lzo zatauaWTjeYCt0ah)6fOSRcOUklEpo4Z0)~TL96F+mYh&6ttVYN5n3cm_GD5@LknG0 zYb2{XL}=x>#>@kZb}1Z95K0+frjIIbbMdR5Jn2flz#vjEbOqRm*t*ldwvEOF%6kda zriQzN!mYD}6Txiof!tNmD2j@F{CDe@mCB-9j@j4UpOx+w;4>_oOs!B!j$B0)3t<9k zOidb5luDQjvQ4Z~DvuXLVii$L3#ho47sOTCHFFS$Bo32A52AzC^X1CIldKgjxzd9x zTG}(NLJLZBv+fT| z;neGcs;TFgrk*%M1@9Fq@M{6>5K)wBCZGid)&5Z7)2+SPN5J(OsOb4qxiS~b2wX*! z?iRR8tOhDlFkBI<^on$Jr`A^K8-giSPU)$7^%A(!G8RaatyB|t0aS-F=$%SF0+#M=7BAi3U9$=GBr>U zs|KGb?7WB)@J^;E6{x`PI<-SYfr?lWVe4ACVy>(`u7WDA%sxsbI4e?5@O5Y(*_eRB zP-qAqxSH`dj~C8dnMyp>glR=#^6JoffU9@C8_?pi5Ll#FhUrLFs)b%-cSfNpY!tdG zqp)e1d)EtwxYiIxA?t2wtfNsFTIizEM4M!phK!b+@bFS3T|<|FD2GyN3J8Gd+(x0y z8y1|cP!260TFMk%3YXE!#sf@Q^IC*U7*7CeCISo+Vi?=>Ymcz8o#^L-;tuA`FJw7d z#5%H5M3nP3kzGTx4^fmVukNxVimeh2L7EIFVX<1t!VN(!7E#(wW)NlkiJ}1uYF_`SKteJ$%T+OO$lQn6W6CLaR!w^hQ@ViQOj}888D_ z3YLh4S@SW{lrqwY#=w@EDZL;mNWk8T-_GEZP5;`~i;J{q3^}P3&Xp)RuOLl8%1RL^ zp&bIr#pln%${ISyhTtd_{b8KWT)oTPfZ0K>;;MPtT>!LFEoTg^=yE+S zOrR^YT(FCWR&;3)E7B~X6)GhAwDHBM&d+7G2Pi?a<<8g(@@|R|SI> z5g=khDPs&>>PstxiVJ|nz&0=U7@xn*t=qW8=gFTSOoG}*ltaN)IIM7%!6|8)k%uT@ zPoJRLdsUGE{kNna=kipW#KxDZYNoCA~SM@tI+CssWi?VqV&cU$ucQK zXeo!%K+7~yCIKzAQ$&HT&{A22hE{Z?T7yfGom#A+Kat0mNqHe1G=EXQaCxaKzJJE+E~G$ zBC}?nB?x0(vsjk}S|*}Qe_{D_JEE9RP)W{=KkigZX4Fjq4J)LVm2C({6sQzJMFuLS zMQ|@Fh$z8Xfl8?CbL1*zvmMpChAY<-TG8b?sVnO)qKo!sv2Z2gswWRk!`vpxBI(c) z2^X&=jZzv~(yMdjIRme$374Q+ilW~&z6dZ?TWvhLXcxs0l^bCB`CY(nHX~v?We;tl zv29kWsppsiw@wsG&I@ee8eG*jr$1}^bS7Knf+NZ*gf_7*L^bzGv=Fff{IcJx?uv65y4j{R*%-JYq)YcBp1#OY}XT7(M7m) zfr}T>rAMsD>YDQ1n^?8A%Yam%EA7&E64kw-evB@%uT_PaD8p0>S~9Pr0hV?thfd#( z{LR-*Rc#%MVWzTTFY?W=RAUTa#inAn5gu&;bBOg{?R$Hy?y|J$l5iI4B&d@}pkfL6 z0#TI8HSf~9-Tev6u{11MrqD`y%G!e}qCh1xa)l*9>Ji0M$Rv%DSi!`uP|3g0;3}f) zlc`1wH8^mkrYajzL4_*{liCa<4Z(v^f2UJ43LBT+a#k%zc6_IURuNshaNc|Yeza>- z*xz*XHF$s#u2f6c08F4O13yn5q(ySZZuJNPUD7C|l=w@pB%@2h_rz}x=M^HrM!{67 zTSZc!c1hW4!17=TTGbD^l{z|eUqohGZ#lq|D52UJMF^qDWl$vi3yt6+2PB;$XjDX5 zVE)`Iqkt)-<$IO(gWxfh%JX zSJFkYQY})iF=@VtE}bjSaTQu|r8KFQG6~Z}1vkI4N7_ZWDs(aeFp>fTJWQ;NMcRGa zUfH%8=TKNJ5-X=mrkq;9JEBr5P`OUiJfbKS?X{c+Uqo4~RVnEjh3Sv0gIF;Mt5SiA;7j9~D-$rK>M7`m)x%toj+7*&A}q{R&Z;43 z`-nMspI*_%k*rjUWZ@j`yJ+1AmllXCTWDE}MUgCPM3;f6k4%4PrCK9gW8eoc3Ecd| z$KHG~UWQ4QY#S3o34~fG3c57Dz?e`tv035$IuwmlW{{LegT)K$J--6>_U> zn~8ER^IJdfj4>pQ#R{ZSO16pD9?GboFiXTn#}s`f4R3f5yQ)3I##k$Z`#T#cMNr9nZbTJ?x`b2ng${^_f|H7c@9<1qjc^TME@n_qyIiV^w*;}nwb`w$TXwnv%&HrR=#mfttsK{kMRd`w zW@3Imy3(#~I)3an9~+LUquCig7f~`6RI(?NvZ`l= z{?)}&E$6t}nY!UBm%anFd37aAqYx#6if){_Leq>hJEq&sj0 zfBjec-sSC%wsIR(;p75}k<*~k0c+tDkK?+W_l8_Q>|tZ2}Ru8UmdvZAY*D3ckj=z^A1 z=eXp*(Bp9ht>_{GDmZAVY4ufW5nZ+b3$2TQp`|!b)L(D^ar<+iirBVJ>ih0*nac zwHi8=HOb0x9q2kJ7|fEdwktyIum8G2H9jh+;;OUTx)_6RAJp3hRIbwn4^hUt<&0Qa zsnALm&JP^8f>RMx1YZsx=87j#l=MoC3iD;gpCNc9SL+a5$@w*>K-c;L6VrReDt$>7 zVH6`=O=R1IE3f66o8Yz9RQ;n^XZE5Fn67H(h!lL zjI#;}+c8vjR%}+R#%p=O`uYP@0K3RlgxdyKbanAiG#b zo;;jTbThn{=TUWsRR}F(MOdnj>M6^IlT@q%6-)ZD2r5}EbS|hODvcVMswjE&Cg9*S zS}{beT&+08QnWlPSKc*zwsVoIjFxSHC0u8&tj;n8w4$pFKr6cR+BkV_IB3mSoXIHd z+i2XQ;h2IcP+f03<=Z4|5wU7*J5FqyNwMKl zOa1orK)6oVY`9NYj%9%=6Qz|zMA2})Cib@5Zv6zD#2Bi9YPbrgW``l7E-6(+H31J? zB~~sD^$%F+mWdXy3N1WzkY?v{za~$ zYv!Gubq>BluI8!&4E(y_0j{De$tn-Sl@yh(0E3oHu3Uvyz1)n@+G?RF-7pSd!xg$# zw3>{Hj;lje(VHcKN%q7YH)4Gi9pq>(U znUSgSRMJ>JALc5hf>ZOwb}IPNxB}#=eq*ule4|!xcw*om=1Sv`tO=@R`PXnIrTGeN zDg6Vd?MPOmB(BDBjp0gQ~Od)l?? z3_@05+Mm%jJL_BQuPm)NMfE!Su(WZ%M^}re)un5hfvP^Tm4R?VR8UFIjKA*w3_*G| zO4Sg=6$iqHOeo3=qGvzzEj?Er6x5023BsIp~_z4Q6JdwvvRR zfoLmBLdK9LhZC|Y!L0#EeSmSj@%P9RF2<$U!dYN0eKz*LPm6sjpI z@#?GFUrB(+xTzCLcYbgsS0r%_*Km=m(Jrfi)|soEyoL&`=vuWax^N|>6EZw#p{u}{ zqO54)O4X{MQWnk1RAMkw`iDsyRMs8X9AZ6)eTNOC*S^XYewyD8^E>)fgurpT&VD9_t0i;+;pa!bJDX?)qIIS|Za%E8| z)y-Y;{)gquLqv_FKb5OdD#@R~RV{COyRFp#(f3YE(zNvz|>T6D|B0c4O+v)0kbna z{bYT86eWNiu&uK=W12aTr%?x}T>nH|p~*5QEdR{at#`QdtA8U_b`D&rf>4gCGf>%S z{LS_}2VXQ-bNp4f&Roqkw}j9-a7Cp{!uSDb9k>du?8FY&&6iFk{B}xgf2xJLtd0v~ zBV3g-z|xJ`D*edU?5u3uw?8j_U?->|Y9ODh3Vzq=vPXDVsAlxrv36pWQe~?ee`cQ` z`1PhtN~y#aaiyb&sDWw~tBYKjM^kG%$<*xh*Nb}fy1S8vrBUm4)xGsZD_1zbv3>Ul z*D6^Jdcu`t$-~N(9vpcufumYO7vaLyj0s$ga7}?=rf^flQHkn13YM4*W_B);c7`V{ zTHkoyUx}Iv2q)Xr6;v*DuHTO3SQ?hn=elVoU^%gsrNIeQwHqe>k~d z7e6B}qAajJil{(JqgIzbEt&F5rj){|2r6k`2j7ZQYEa3BsGM_Lt*Qcm10Mc*rs#~B zpB!H1jVoH~Syq_G!?zP=bNw?D+i8uqp>>;sn@12~R+f@7fQ^wz$|SjoP|j^@>XkIr zIgqA&>NqvEqr}C4XGisihlh6(oROUla(l?_Pp62S;U|R76oruOL6=6l*I_s6G{bJx zNitV|F2e_?l;A#f8lhM#yH*?t2Rs7i0Mg;F-tttgVr)HE*U%*mUDtD!nV-ohEmv~2 zDp(>GTC>I2VOEZgt!S-ut&FYAT-;w#v_J1{r|m_q(k0jzuG2M7gVZm!E%0HkR-B}6 z9eEKoQ0e07?kl;f%B!lJ)#=T`RT^uXaLu|_y}E`g?YVi=JrXY2zJ@D>o8hu**Qy~0 z#s;$kHiy5$W>`9av>wojg1K$ia1B>h7f~bBM0;c^b56{!l};0CWKuXiq<{uZvg|X z&SN{+wo8Is8`@L4i48@%rFdsEfCT@e{ZTAAQE*BHang)AxE@7J7`Z<B$lHT)_VaJgDJdG?K$w0F2ZhAmg@!M%aj%9U391z>Au91iAX-mpg`5o>eQ z1V|sLY|PLm9nrk$GZONJ80%!p`T?mQcNL-QcGts`!HH4=Dp;c8GJ2r`Cu%cLVN*sp zF&~Mb@p&0Wn7aslBe^#9!f=1qkq_l_KJFo+_m#X1&_r3cz|l(q%)G zv7BpgMOk?hh%itH%22D1NK~cE;0Lpj8tC$VB4Yw(qK60r1CK#S(=xP62@h|aMuyzV;;sP)OWellM3pPT= z5L>QvfQTc;lJ~~!h_vxLk4#sh*h3Q)y;{?eI}rq964CVtREg&`y0@QQ-LQ0*D^fgC zA2vP#bTC;F+P)c!-{lI%;#yq}9_@D8cl%no%9|0c1W@O1w3@EuBF`xNk-<#2fF<3{ zz)D&u8o#hkVJ7bz;OJ%>JvPbC+k0^;Pdae2=!nt?U`n+kY}h*&(e@O@Fp85a{p#c@ djGbJithRmd^sCdaG|#?Yoqe!d;eXf%e*-a@C7u8P diff --git a/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/circle.tif b/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/circle.tif deleted file mode 100644 index 101ae87753b3f6fc1c7b07684f9bc9cb5ffe9ff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120768 zcmeI5ze_Aj7RUXuEUR)+5#7*G+(0IA0#Ps#H1K937^snvkrx9u@CW_@6O16385js= zYW@^NML~p(L_uZ1#85F&cR%;}R)*1;>FKWO>F)aac=xtFRj1DRobT=F>8Uz3I$HCu znwpw_)HKw**Zhs6TK@n2NBy6Fop4;6cU<@9@$c9EUHkXH&ezeV_5XeAYiis7I!~+G zj=aAA{HsmvfBvBV?=gS>rymgzfrt>OtE+2kYwPOj>g($p9UYyVoSd1NnVp@To10r$ zSXf+K!%bS~<2L}iD_xEpaZ~yiC zLtiXl2W!~GGWHpziZN>F5D5JE@ndLch-=Qy&d$}Ee;Hh8R+uOIcw#=e- z&>9RODLH)*n3$M&e0+3J1~x*5Bs?9LR&#T+E>kwt1y$I(sV=_0zrDS+K~**(09yz< zB`s!yFz@K~^;H6}N&v!ec4Y2NOH0fC{=QY7GM-NW+AvS{g{!Bh=lc3OKWZI^Kmg{D zPpY)W#>SqXpF_Z?A-)oTJp7XTA1z@IE6Mq2gt_3P{F)kUh&KM9Zv zG7@)nH8eEnF8wp75jh|udFC&Ff&U__6j>uG8q{Y7iiRx<-qj`o*#p0^PySCo`qA8(bUXibe-)r$H zLpSQh(ii3PWG%9v5P2%1M+#9EPif!CT{NF->EUPT#6|yAG8nacc)lQrJ~w$-mO!Mw z=-~@ZefL*3WwB^L9wYMgG!rm1OCc7T@#rMktoo!HCXC(O+<0_Y&Ei6UoK|rvAQN2m z0WdC7snkz0TdfJq%$=^(TeXi70rDIE$3xb7XyHSQMB>9$@*DDs9@eI5iI$H{#jXok z4s#u%7L&$KA-)|Z*WtVyvP|2zlj;~p0wFBSr>ul(Da275L3}3Tw#$j=9WY3O;@j8i zyCD^p;!8%J2P9yrz7`eXRP-!hYGU1;?AxdcNU_0KW0CX037`S9pA9LFs+ym{^AdLp zXuxclTvaEIyCh8cj}lB>vZxbo$}8DP00C2V<5iqL0b(#10(uC3$zsb4gD%NbG6)3U zNJV?oBtr>iqd*lwE?MjzW!4{AOALV^JBw*+w#3N5cpzxQ-zAHU6pcG0gGnObZ>!C{ zy}cwsP%Op?ppZ&0S?npSC4t5hkuZZOq|&{o*{(Wa5EPCL0_ep1C5x&xF6{PhgR^Tk z(TVpOM>8`suJKX4z6qcfkC!Yx3-t}z!HyoEk)~292jM8>AOz4%*-KU?lL<0}`Z`De z&6L&^OY(EMoP%T(au5P&rgSj}O|=Sw*X6#YCuL=`S(o7`cHab0PO-Pby1KfDhX>!5 z)zM`FCKd7icTI1v6j$={y!3m(E0$r`GtpztL3yu>&MFqOLxVUhfiNX&~02Sry ziYYX@xe88I7En?CbgZGFAu$mFBLvXW=Ot@#anXoP84&@r^r@?zogD!Y0V4#^(x^6e3`d0E%KxvK}%RL@HAd zKv7J@5(*J8PN1u+%eYM$6oJ0JK0y!x;{;Uk*f>%dguv9)lsJfhaRMr#W*n&uLSS}w zRvbjYIDuckei^qZgCel7upkH`V4Q$vwi`z(gAma5N;0rPU~X>ChFRHkoPa(LIxYZ9 z;p_R8C9sa0ot&I>oPff&L11)r)P`Bvbew?ZGdL~)OW|w&l_ju_o7H?##|2<1e9dpS z1lDD<%x~9v9G3-PDR$Q5X#Joiwl14JI5;uDf{d0?rtJ! zC@50|P)J!7eQhu}IB3cN*-0b;6!KLzUe27KpC=NCf(lLmZFrH;w{5hWYHF(~XQcu)AF$Bmy8Yrt19}PxEMiN6wfmBL>?EBD+$1Yo2 zTb25w_6ZCc}fGHgEL6UKBWAEvaRUG+(NK6K)v3lm(KJFR6G zw$%k;I9G8xu@7wo@4{LSEf%vUE!b9NHBE3~1h>H2G%azpAuXteyzVc!7>rwBnYL;^ zm{J!cLtFN4TnWYvQdUA2uHe#wVF(2}jA!4rK`Jb%belhQ!Od!YD%+{IZJ&y86dP16 zQ}6166~ru6(zBiJknK|(RTY@MNDE5F3(1C@>+px8PPn!tD5fsR7_6fnesZfmB3ou? zkDh#WLBq&4B2~|96dYjpC~aB?fq=VcMIn_D^nr~O_xAQ&n{PwBMD2SM$q42#nl7=Y zFxyqL6MFu;Ln4ofkw|^)p&ZS`#lkD5XV1*cB=y#dxQH&+Q_y3fq7qJ~QmITPlgs52 zaLFPHVj-du@#>{82{0Rk&)wN<_Tk|nb^^m^JjZ|6=Cp*Vkbq;=)zzibY33cBoSeM9 zy+u}I_=bo0iMRM1Flu!VlR#Tr+xYnS+S=O1#YGe}h7WjxKX`?2VWQAjmI!bUJTx@4 zxVX5pvvYNI6^_gpg|QfsaT#6r;g*sc9kY#%jlI3S)6>%{D=V9un}>&o_xJZf#718% TUB;{9Ovj?r diff --git a/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/data/texture.gif b/java/examples/Books/Nature of Code/chp4_systems/CircleVsBlob/data/texture.gif deleted file mode 100644 index 17e84e80677eeefd1f0609e1e2c37d428e6f6f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1829 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 particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - void addParticle(float x, float y) { - particles.add(new Particle(new PVector(x, y))); - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Exercise_4_04_asteroids.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Exercise_4_04_asteroids.pde deleted file mode 100644 index d0340916f..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Exercise_4_04_asteroids.pde +++ /dev/null @@ -1,41 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Chapter 3: Asteroids exercise - -// Mover object -Spaceship ship; - -void setup() { - size(640, 360); - ship = new Spaceship(); -} - -void draw() { - background(255); - - // Update location - ship.update(); - // Wrape edges - ship.wrapEdges(); - // Draw ship - ship.display(); - - - fill(0); - //text("left right arrows to turn, z to thrust",10,height-5); - - // Turn or thrust the ship depending on what key is pressed - if (keyPressed) { - if (key == CODED && keyCode == LEFT) { - ship.turn(-0.03); - } else if (key == CODED && keyCode == RIGHT) { - ship.turn(0.03); - } else if (key == 'z' || key == 'Z') { - ship.thrust(); - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Particle.pde deleted file mode 100644 index e6736696e..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Particle.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l,PVector dir) { - acceleration = dir.get(); - velocity = PVector.random2D(); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - noStroke(); - fill(127,0,0,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/ParticleSystem.pde deleted file mode 100644 index 0b83fa96a..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/ParticleSystem.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Using Generics now! comment and annotate, etc. - -class ParticleSystem { - ArrayList particles; - - ParticleSystem() { - particles = new ArrayList(); - } - - void addParticle(float x, float y, PVector force) { - particles.add(new Particle(new PVector(x, y),force)); - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Spaceship.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Spaceship.pde deleted file mode 100644 index bdc11f6c1..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_04_asteroids/Spaceship.pde +++ /dev/null @@ -1,110 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Chapter 3: Asteroids - -class Spaceship { - // All of our regular motion stuff - PVector location; - PVector velocity; - PVector acceleration; - - ParticleSystem ps; - - // Arbitrary damping to slow down ship - float damping = 0.995; - float topspeed = 6; - - // Variable for heading! - float heading = 0; - - // Size - float r = 16; - - // Are we thrusting (to color boosters) - boolean thrusting = false; - - Spaceship() { - location = new PVector(width/2,height/2); - velocity = new PVector(); - acceleration = new PVector(); - - ps = new ParticleSystem(); - } - - // Standard Euler integration - void update() { - velocity.add(acceleration); - velocity.mult(damping); - velocity.limit(topspeed); - location.add(velocity); - acceleration.mult(0); - - ps.run(); - } - - // Newton's law: F = M * A - void applyForce(PVector force) { - PVector f = force.get(); - //f.div(mass); // ignoring mass right now - acceleration.add(f); - } - - // Turn changes angle - void turn(float a) { - heading += a; - } - - // Apply a thrust force - void thrust() { - // Offset the angle since we drew the ship vertically - float angle = heading - PI/2; - // Polar to cartesian for force vector! - PVector force = PVector.fromAngle(angle); - force.mult(0.1); - applyForce(force); - - force.mult(-2); - ps.addParticle(location.x,location.y+r,force); - - - // To draw booster - thrusting = true; - } - - void wrapEdges() { - float buffer = r*2; - if (location.x > width + buffer) location.x = -buffer; - else if (location.x < -buffer) location.x = width+buffer; - if (location.y > height + buffer) location.y = -buffer; - else if (location.y < -buffer) location.y = height+buffer; - } - - - // Draw the ship - void display() { - stroke(0); - strokeWeight(2); - pushMatrix(); - translate(location.x,location.y+r); - rotate(heading); - fill(175); - if (thrusting) fill(255,0,0); - // Booster rockets - rect(-r/2,r,r/3,r/2); - rect(r/2,r,r/3,r/2); - fill(175); - // A triangle - beginShape(); - vertex(-r,r); - vertex(0,-r); - vertex(r,r); - endShape(CLOSE); - rectMode(CENTER); - popMatrix(); - - thrusting = false; - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Exercise_4_06_Shatter.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Exercise_4_06_Shatter.pde deleted file mode 100644 index f7026ae40..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Exercise_4_06_Shatter.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(100,100,5); -} - -void draw() { - background(255); - - ps.display(); - ps.update(); -} - -void mousePressed() { - ps.shatter(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Particle.pde deleted file mode 100644 index d160a42c8..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/Particle.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - float r; - - Particle(float x, float y, float r_) { - acceleration = new PVector(0,0.01); - velocity = PVector.random2D(); - velocity.mult(0.5); - location = new PVector(x,y); - lifespan = 255.0; - r = r_; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0); - fill(0); - rectMode(CENTER); - rect(location.x,location.y,r,r); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/ParticleSystem.pde deleted file mode 100644 index 611b1218b..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_06_Shatter/ParticleSystem.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Using Generics now! comment and annotate, etc. - -class ParticleSystem { - ArrayList particles; - - int rows = 20; - int cols = 20; - - boolean intact = true; - - ParticleSystem(float x, float y, float r) { - particles = new ArrayList(); - - for (int i = 0; i < rows*cols; i++) { - addParticle(x + (i%cols)*r, y + (i/rows)*r, r); - } - } - - void addParticle(float x, float y, float r) { - particles.add(new Particle(x, y, r)); - } - - void display() { - for (Particle p : particles) { - p.display(); - } - } - - void shatter() { - intact = false; - } - - void update() { - if (!intact) { - for (Particle p : particles) { - p.update(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Exercise_4_10_particleintersection.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Exercise_4_10_particleintersection.pde deleted file mode 100644 index d27427366..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Exercise_4_10_particleintersection.pde +++ /dev/null @@ -1,18 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - ps.addParticle(mouseX,mouseY); - ps.update(); - ps.intersection(); - ps.display(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Particle.pde deleted file mode 100644 index 90c4dec0c..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/Particle.pde +++ /dev/null @@ -1,73 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - float r = 6; - boolean highlight; - - Particle(float x, float y) { - acceleration = new PVector(0, 0.05); - velocity = new PVector(random(-1, 1), random(-2, 0)); - location = new PVector(x, y); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - void intersects(ArrayList particles) { - highlight = false; - for (Particle other : particles) { - if (other != this) { - float d = PVector.dist(other.location, location); - if (d < r + other.r) { - highlight = true; - } - } - } - } - - void applyForce(PVector f) { - acceleration.add(f); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0, lifespan); - strokeWeight(2); - fill(127, lifespan); - if (highlight) { - fill(127,0,0); - } - ellipse(location.x, location.y, r*2, r*2); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/ParticleSystem.pde deleted file mode 100644 index 3b3367656..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particleintersection/ParticleSystem.pde +++ /dev/null @@ -1,43 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Using Generics now! comment and annotate, etc. - -class ParticleSystem { - ArrayList particles; - - ParticleSystem(PVector location) { - particles = new ArrayList(); - } - - void addParticle(float x, float y) { - particles.add(new Particle(x, y)); - } - - - void display() { - for (Particle p : particles) { - p.display(); - } - } - - void intersection() { - for (Particle p : particles) { - p.intersects(particles); - } - } - - - void update() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.update(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Exercise_4_10_particlerepel.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Exercise_4_10_particlerepel.pde deleted file mode 100644 index 408ce3edd..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Exercise_4_10_particlerepel.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - ps.addParticle(random(width),random(height)); - - //PVector gravity = new PVector(0,0.1); - //ps.applyForce(gravity); - ps.update(); - ps.intersection(); - ps.display(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Particle.pde deleted file mode 100644 index dcd577cec..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/Particle.pde +++ /dev/null @@ -1,70 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - float r = 6; - - - Particle(float x, float y) { - acceleration = new PVector(); - velocity = PVector.random2D(); - location = new PVector(x, y); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - void intersects(ArrayList particles) { - for (Particle other : particles) { - if (other != this) { - PVector dir = PVector.sub(location, other.location); - if (dir.mag() < r*2) { - dir.setMag(0.5); - applyForce(dir); - } - } - } - } - - void applyForce(PVector f) { - acceleration.add(f); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - lifespan -= 0.5; - } - - // Method to display - void display() { - stroke(0, lifespan); - strokeWeight(2); - fill(127, lifespan); - ellipse(location.x, location.y, r*2, r*2); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/ParticleSystem.pde deleted file mode 100644 index 4168dc229..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_10_particlerepel/ParticleSystem.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Using Generics now! comment and annotate, etc. - -class ParticleSystem { - ArrayList particles; - - ParticleSystem(PVector location) { - particles = new ArrayList(); - } - - void addParticle(float x, float y) { - particles.add(new Particle(x, y)); - } - - - void display() { - for (Particle p : particles) { - p.display(); - } - } - - void applyForce(PVector f) { - for (Particle p : particles) { - p.applyForce(f); - } - } - - void intersection() { - for (Particle p : particles) { - p.intersects(particles); - } - } - - - void update() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.update(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Exercise_4_12_ArrayofImages.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Exercise_4_12_ArrayofImages.pde deleted file mode 100644 index dbc8ac3c5..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Exercise_4_12_ArrayofImages.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Array of Images for particle textures - -ParticleSystem ps; - -PImage[] imgs; - -void setup() { - size(640, 360, P2D); - - imgs = new PImage[5]; - imgs[0] = loadImage("corona.png"); - imgs[1] = loadImage("emitter.png"); - imgs[2] = loadImage("particle.png"); - imgs[3] = loadImage("texture.png"); - imgs[4] = loadImage("reflection.png"); - - ps = new ParticleSystem(imgs, new PVector(width/2, 50)); -} - -void draw() { - - // Additive blending! - blendMode(ADD); - - background(0); - - PVector up = new PVector(0,-0.2); - ps.applyForce(up); - - ps.run(); - for (int i = 0; i < 5; i++) { - ps.addParticle(mouseX,mouseY); - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Particle.pde deleted file mode 100644 index adb3431f3..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/Particle.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector loc; - PVector vel; - PVector acc; - float lifespan; - - PImage img; - - // Another constructor (the one we are using here) - Particle(float x, float y, PImage img_) { - // Boring example with constant acceleration - acc = new PVector(0, 0); - vel = PVector.random2D(); - loc = new PVector(x, y); - lifespan = 255; - img = img_; - } - - void run() { - update(); - render(); - } - - void applyForce(PVector f) { - acc.add(f); - } - - // Method to update location - void update() { - vel.add(acc); - loc.add(vel); - acc.mult(0); - lifespan -= 2.0; - } - - // Method to display - void render() { - imageMode(CENTER); - tint(lifespan); - image(img, loc.x, loc.y, 32, 32); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan <= 0.0) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/ParticleSystem.pde deleted file mode 100644 index 98208b71e..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/ParticleSystem.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class to describe a group of Particles -// An ArrayList is used to manage the list of Particles - -class ParticleSystem { - - ArrayList particles; // An arraylist for all the particles - - PImage[] textures; - - ParticleSystem(PImage[] imgs, PVector v) { - textures = imgs; - particles = new ArrayList(); // Initialize the arraylist - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } - - void addParticle(float x, float y) { - int r = int(random(textures.length)); - particles.add(new Particle(x,y,textures[r])); - } - - - void applyForce(PVector f) { - for (Particle p : particles) { - p.applyForce(f); - } - } - - void addParticle(Particle p) { - particles.add(p); - } - - // A method to test if the particle system still has particles - boolean dead() { - if (particles.isEmpty()) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/data/texture.psd b/java/examples/Books/Nature of Code/chp4_systems/Exercise_4_12_ArrayofImages/data/texture.psd deleted file mode 100644 index d532f15aa97ddc346e880e6801cfa46ec60e78f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26028 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 particles; - -void setup() { - size(640,360); - particles = new ArrayList(); -} - -void draw() { - background(255); - - particles.add(new Particle(new PVector(width/2,50))); - - // Looping through backwards to delete - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } -} - - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_02_ArrayListParticles/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_02_ArrayListParticles/Particle.pde deleted file mode 100644 index a4c372ac4..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_02_ArrayListParticles/Particle.pde +++ /dev/null @@ -1,50 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l) { - acceleration = new PVector(0, 0.05); - velocity = new PVector(random(-1, 1), random(-2, 0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0, lifespan); - strokeWeight(2); - fill(127, lifespan); - ellipse(location.x, location.y, 12, 12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/NOC_4_03_ParticleSystemClass.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/NOC_4_03_ParticleSystemClass.pde deleted file mode 100644 index 935a214da..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/NOC_4_03_ParticleSystemClass.pde +++ /dev/null @@ -1,16 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - ps.addParticle(); - ps.run(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/Particle.pde deleted file mode 100644 index 12d1ef02a..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/Particle.pde +++ /dev/null @@ -1,50 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0,lifespan); - strokeWeight(2); - fill(127,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/ParticleSystem.pde deleted file mode 100644 index ffddfc873..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_03_ParticleSystemClass/ParticleSystem.pde +++ /dev/null @@ -1,33 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Using Generics now! comment and annotate, etc. - -class ParticleSystem { - ArrayList particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/NOC_4_04_SystemofSystems.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/NOC_4_04_SystemofSystems.pde deleted file mode 100644 index 2fe6ee428..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/NOC_4_04_SystemofSystems.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Simple Particle System - -// Particles are generated each cycle through draw(), -// fall with gravity and fade out over time -// A ParticleSystem object manages a variable size (ArrayList) -// list of particles. - -ArrayList systems; - -void setup() { - size(640,360); - systems = new ArrayList(); -} - -void draw() { - background(255); - for (ParticleSystem ps: systems) { - ps.run(); - ps.addParticle(); - } - - fill(0); - text("click mouse to add particle systems",10,height-30); -} - -void mousePressed() { - systems.add(new ParticleSystem(1,new PVector(mouseX,mouseY))); -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/Particle.pde deleted file mode 100644 index 12d1ef02a..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/Particle.pde +++ /dev/null @@ -1,50 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0,lifespan); - strokeWeight(2); - fill(127,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/ParticleSystem.pde deleted file mode 100644 index 06f1ff3a9..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_04_SystemofSystems/ParticleSystem.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -// A class to describe a group of Particles -// An ArrayList is used to manage the list of Particles - -class ParticleSystem { - - ArrayList particles; // An arraylist for all the particles - PVector origin; // An origin point for where particles are birthed - - ParticleSystem(int num, PVector v) { - particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point - for (int i = 0; i < num; i++) { - particles.add(new Particle(origin)); // Add "num" amount of particles to the arraylist - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - // A method to test if the particle system still has particles - boolean dead() { - if (particles.isEmpty()) { - return true; - } - else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Confetti.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Confetti.pde deleted file mode 100644 index e86ce8d5b..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Confetti.pde +++ /dev/null @@ -1,29 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Confetti extends Particle { - - // We could add variables for only Confetti here if we so - - Confetti(PVector l) { - super(l); - } - - // Inherits update() from parent - - // Override the display method - void display() { - rectMode(CENTER); - fill(127,lifespan); - stroke(0,lifespan); - strokeWeight(2); - pushMatrix(); - translate(location.x,location.y); - float theta = map(location.x,0,width,0,TWO_PI*2); - rotate(theta); - rect(0,0,12,12); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/NOC_4_05_ParticleSystemInheritancePolymorphism.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/NOC_4_05_ParticleSystemInheritancePolymorphism.pde deleted file mode 100644 index 935a214da..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/NOC_4_05_ParticleSystemInheritancePolymorphism.pde +++ /dev/null @@ -1,16 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - ps.addParticle(); - ps.run(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Particle.pde deleted file mode 100644 index b38b30cf7..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/Particle.pde +++ /dev/null @@ -1,51 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Particle System - -class Particle { - - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0,lifespan); - strokeWeight(2); - fill(127,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/ParticleSystem.pde deleted file mode 100644 index 28fde7c2e..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_05_ParticleSystemInheritancePolymorphism/ParticleSystem.pde +++ /dev/null @@ -1,36 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class ParticleSystem { - ArrayList particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - float r = random(1); - if (r < 0.5) { - particles.add(new Particle(origin)); - } - else { - particles.add(new Confetti(origin)); - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/NOC_4_06_ParticleSystemForces.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/NOC_4_06_ParticleSystemForces.pde deleted file mode 100644 index eef4c0555..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/NOC_4_06_ParticleSystemForces.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - - // Apply gravity force to all Particles - PVector gravity = new PVector(0,0.1); - ps.applyForce(gravity); - - ps.addParticle(); - ps.run(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/Particle.pde deleted file mode 100644 index 971ea0c5c..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/Particle.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - float mass = 1; // Let's do something better here! - - Particle(PVector l) { - acceleration = new PVector(0,0); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acceleration.add(f); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0,lifespan); - strokeWeight(2); - fill(127,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/ParticleSystem.pde deleted file mode 100644 index c840ffd5b..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_06_ParticleSystemForces/ParticleSystem.pde +++ /dev/null @@ -1,35 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class ParticleSystem { - ArrayList particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - // A function to apply a force to all Particles - void applyForce(PVector f) { - for (Particle p: particles) { - p.applyForce(f); - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/NOC_4_07_ParticleSystemForcesRepeller.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/NOC_4_07_ParticleSystemForcesRepeller.pde deleted file mode 100644 index c7de70143..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/NOC_4_07_ParticleSystemForcesRepeller.pde +++ /dev/null @@ -1,26 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; -Repeller repeller; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); - repeller = new Repeller(width/2-20,height/2); -} - -void draw() { - background(255); - ps.addParticle(); - - // Apply gravity force to all Particles - PVector gravity = new PVector(0,0.1); - ps.applyForce(gravity); - - ps.applyRepeller(repeller); - - repeller.display(); - ps.run(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Particle.pde deleted file mode 100644 index 971ea0c5c..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Particle.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Particle { - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - float mass = 1; // Let's do something better here! - - Particle(PVector l) { - acceleration = new PVector(0,0); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - display(); - } - - void applyForce(PVector force) { - PVector f = force.get(); - f.div(mass); - acceleration.add(f); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - lifespan -= 2.0; - } - - // Method to display - void display() { - stroke(0,lifespan); - strokeWeight(2); - fill(127,lifespan); - ellipse(location.x,location.y,12,12); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/ParticleSystem.pde deleted file mode 100644 index d4ad80fa7..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/ParticleSystem.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class ParticleSystem { - ArrayList particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - // A function to apply a force to all Particles - void applyForce(PVector f) { - for (Particle p: particles) { - p.applyForce(f); - } - } - - void applyRepeller(Repeller r) { - for (Particle p: particles) { - PVector force = r.repel(p); - p.applyForce(force); - } - } - - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Repeller.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Repeller.pde deleted file mode 100644 index 351780121..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_07_ParticleSystemForcesRepeller/Repeller.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Particles + Forces - -// A very basic Repeller class -class Repeller { - - // Gravitational Constant - float G = 100; - // Location - PVector location; - float r = 10; - - Repeller(float x, float y) { - location = new PVector(x,y); - } - - void display() { - stroke(0); - strokeWeight(2); - fill(175); - ellipse(location.x,location.y,48,48); - } - - // Calculate a force to push particle away from repeller - PVector repel(Particle p) { - PVector dir = PVector.sub(location,p.location); // Calculate direction of force - float d = dir.mag(); // Distance between objects - dir.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - d = constrain(d,5,100); // Keep distance within a reasonable range - float force = -1 * G / (d * d); // Repelling force is inversely proportional to distance - dir.mult(force); // Get force vector --> magnitude * direction - return dir; - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/NOC_4_08_ParticleSystemSmoke.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/NOC_4_08_ParticleSystemSmoke.pde deleted file mode 100644 index fb11356e4..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/NOC_4_08_ParticleSystemSmoke.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Smoke Particle System - -// A basic smoke effect using a particle system -// Each particle is rendered as an alpha masked image - -/* @pjs preload="processingjs/chapter04/_4_08_ParticleSystemSmoke/data/texture.png"; */ - -ParticleSystem ps; - -void setup() { - size(640,360); - PImage img = loadImage("texture.png"); - ps = new ParticleSystem(0,new PVector(width/2,height-75),img); -} - -void draw() { - background(0); - - // Calculate a "wind" force based on mouse horizontal position - float dx = map(mouseX,0,width,-0.2,0.2); - PVector wind = new PVector(dx,0); - ps.applyForce(wind); - ps.run(); - for (int i = 0; i < 2; i++) { - ps.addParticle(); - } - - // Draw an arrow representing the wind force - drawVector(wind, new PVector(width/2,50,0),500); - -} - -// Renders a vector object 'v' as an arrow and a location 'loc' -void drawVector(PVector v, PVector loc, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(loc.x,loc.y); - stroke(255); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - line(len,0,len-arrowsize,+arrowsize/2); - line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/Particle.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/Particle.pde deleted file mode 100644 index b3dce76be..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/Particle.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Particle { - PVector loc; - PVector vel; - PVector acc; - float lifespan; - PImage img; - - Particle(PVector l,PImage img_) { - acc = new PVector(0,0); - float vx = randomGaussian()*0.3; - float vy = randomGaussian()*0.3 - 1.0; - vel = new PVector(vx,vy); - loc = l.get(); - lifespan = 100.0; - img = img_; - } - - void run() { - update(); - render(); - } - - // Method to apply a force vector to the Particle object - // Note we are ignoring "mass" here - void applyForce(PVector f) { - acc.add(f); - } - - // Method to update location - void update() { - vel.add(acc); - loc.add(vel); - lifespan -= 2.5; - acc.mult(0); // clear Acceleration - } - - // Method to display - void render() { - imageMode(CENTER); - tint(255,lifespan); - image(img,loc.x,loc.y); - // Drawing a circle instead - // fill(255,lifespan); - // noStroke(); - // ellipse(loc.x,loc.y,img.width,img.height); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan <= 0.0) { - return true; - } else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/ParticleSystem.pde deleted file mode 100644 index 93fee68fa..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/ParticleSystem.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Smoke Particle System - -// A class to describe a group of Particles -// An ArrayList is used to manage the list of Particles - -class ParticleSystem { - - ArrayList particles; // An arraylist for all the particles - PVector origin; // An origin point for where particles are birthed - PImage img; - - ParticleSystem(int num, PVector v, PImage img_) { - particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point - img = img_; - for (int i = 0; i < num; i++) { - particles.add(new Particle(origin, img)); // Add "num" amount of particles to the arraylist - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } - - // Method to add a force vector to all particles currently in the system - void applyForce(PVector dir) { - // Enhanced loop!!! - for (Particle p: particles) { - p.applyForce(dir); - } - } - - void addParticle() { - particles.add(new Particle(origin, img)); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/data/texture.psd b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke/data/texture.psd deleted file mode 100644 index 8208feb020b9552dba21c52ff59db597e4172699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26456 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 particles; // An arraylist for all the particles - PVector origin; // An origin point for where particles are birthed - PImage img; - - ParticleSystem(int num, PVector v, PImage img_) { - particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point - img = img_; - for (int i = 0; i < num; i++) { - particles.add(new Particle(origin, img)); // Add "num" amount of particles to the arraylist - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } - - // Method to add a force vector to all particles currently in the system - void applyForce(PVector dir) { - // Enhanced loop!!! - for (Particle p: particles) { - p.applyForce(dir); - } - - } - - void addParticle() { - particles.add(new Particle(origin,img)); - } - - void addParticle(Particle p) { - particles.add(p); - } - - // A method to test if the particle system still has particles - boolean dead() { - if (particles.isEmpty()) { - return true; - } else { - return false; - } - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/data/texture.psd b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_08_ParticleSystemSmoke_b/data/texture.psd deleted file mode 100644 index 8208feb020b9552dba21c52ff59db597e4172699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26456 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 particles; // An arraylist for all the particles - PVector origin; // An origin point for where particles are birthed - - PImage tex; - - ParticleSystem(int num, PVector v) { - particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point - for (int i = 0; i < num; i++) { - particles.add(new Particle(origin)); // Add "num" amount of particles to the arraylist - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } - - void addParticle() { - particles.add(new Particle(origin)); - } - - void addParticle(Particle p) { - particles.add(p); - } - - // A method to test if the particle system still has particles - boolean dead() { - if (particles.isEmpty()) { - return true; - } - else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/data/texture.psd b/java/examples/Books/Nature of Code/chp4_systems/NOC_4_09_AdditiveBlending/data/texture.psd deleted file mode 100644 index d532f15aa97ddc346e880e6801cfa46ec60e78f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26028 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 - -// A simple Particle class - -class Particle { - - PVector location; - PVector velocity; - PVector acceleration; - float lifespan; - - Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); - lifespan = 255.0; - } - - void run() { - update(); - push(); - display(); - pop(); - } - - // Method to update location - void update() { - velocity.add(acceleration); - location.add(velocity); - lifespan -= 2.0; - } - - - void push() { - pushMatrix(); - } - - void pop() { - popMatrix(); - } - - // Method to display - void display() { - stroke(0,lifespan); - fill(0,lifespan); - translate(location.x,location.y); - ellipse(0,0,8,8); - } - - // Is the particle still useful? - boolean isDead() { - if (lifespan < 0.0) { - return true; - } else { - return false; - } - } -} - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleChild.pde b/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleChild.pde deleted file mode 100644 index 95b089aa3..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleChild.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class ParticleChild extends Particle { - - // We could add variables for only Confetti here if we so - - ParticleChild(PVector l) { - super(l); - } - - // Inherits update() from parent - - // Override the display method - void display() { - super.display(); - float theta = map(location.x,0,width,0,TWO_PI*2); - rotate(theta); - stroke(0); - line(0,0,50,0); - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystem.pde deleted file mode 100644 index 3e439bd84..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystem.pde +++ /dev/null @@ -1,36 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class ParticleSystem { - ArrayList particles; - PVector origin; - - ParticleSystem(PVector location) { - origin = location.get(); - particles = new ArrayList(); - } - - void addParticle() { - float r = random(1); - if (r < 0.5) { - particles.add(new Particle(origin)); - } - else { - particles.add(new ParticleChild(origin)); - } - } - - void run() { - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.run(); - if (p.isDead()) { - particles.remove(i); - } - } - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystemInheritance_pushpop.pde b/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystemInheritance_pushpop.pde deleted file mode 100644 index 935a214da..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/ParticleSystemInheritance_pushpop/ParticleSystemInheritance_pushpop.pde +++ /dev/null @@ -1,16 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -ParticleSystem ps; - -void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); -} - -void draw() { - background(255); - ps.addParticle(); - ps.run(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/NOC_gl.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/NOC_gl.pde deleted file mode 100755 index f96fc9d07..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/NOC_gl.pde +++ /dev/null @@ -1,13 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void renderImage(PImage img, Vec3D _loc, float _diam, color _col, float _alpha ) { - pushMatrix(); - translate( _loc.x, _loc.y, _loc.z ); - tint(red(_col), green(_col), blue(_col), _alpha); - imageMode(CENTER); - image(img,0,0,_diam,_diam); - popMatrix(); -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/emitter.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/emitter.pde deleted file mode 100755 index 0e6eb38fe..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/emitter.pde +++ /dev/null @@ -1,89 +0,0 @@ - -/* -The emitter is just an object that follows the cursor and -can spawn new particle objects. It would be easier to just make -the location vector match the cursor position but I have opted -to use a velocity vector because later I will be allowing for -multiple emitters. -*/ - -class Emitter{ - Vec3D loc; - Vec3D vel; - Vec3D velToMouse; - - color myColor; - - ArrayList particles; - - Emitter( ){ - loc = new Vec3D(); - vel = new Vec3D(); - velToMouse = new Vec3D(); - - myColor = color( 1, 1, 1 ); - - particles = new ArrayList(); - } - - void exist(){ - setVelToMouse(); - findVelocity(); - setPosition(); - iterateListExist(); - render(); - - pgl.disable( PGL.TEXTURE_2D ); - - if( ALLOWTRAILS ) - iterateListRenderTrails(); - } - - void setVelToMouse(){ - velToMouse.set( mouseX - loc.x, mouseY - loc.y, 0 ); - } - - void findVelocity(){ - vel.interpolateToSelf( velToMouse, .35 ); - } - - void setPosition(){ - loc.addSelf( vel ); - - if( ALLOWFLOOR ){ - if( loc.y > floorLevel ){ - loc.y = floorLevel; - vel.y = 0; - } - } - } - - void iterateListExist(){ - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - if( !p.ISDEAD ){ - p.exist(); - } else { - it.remove(); - } - } - } - - - void render(){ - renderImage( emitterImg, loc, 150, myColor, 1.0 ); - } - - void iterateListRenderTrails(){ - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - p.renderTrails(); - } - } - - void addParticles( int _amt ){ - for( int i=0; i<_amt; i++ ){ - particles.add( new Particle( loc, vel ) ); - } - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/flight404_particles_1_simple.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/flight404_particles_1_simple.pde deleted file mode 100644 index 549c8dccc..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/flight404_particles_1_simple.pde +++ /dev/null @@ -1,158 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Updated version of flight404 Particle Emitter release 1 -// This works with Processing 2.0 - -// February 28 2011 -// Daniel Shiffman - -// Source Code release 1 -// Particle Emitter -// -// February 11th 2008 -// -// Built with Processing v.135 which you can download at http://www.processing.org/download -// -// Robert Hodgin -// flight404.com -// barbariangroup.com - -// features: -// Toxi's magnificent Vec3D library -// perlin noise flow fields -// ribbon trails -// OpenGL additive blending -// OpenGL display lists -// -// Uses the very useful Vec3D library by Karsten Schmidt (toxi) -// You can download it at http://code.google.com/p/toxiclibs/downloads/list -// -// Please post suggestions and improvements at the flight404 blog. When nicer/faster/better -// practices are suggested, I will incorporate them into the source and repost. I think that -// will be a reasonable system for now. -// -// Future additions will include: -// Rudimentary camera movement -// Magnetic repulsion -// More textures means more iron -// -// UPDATES -// -// February 11th 2008 -// Reorganized some of the OpenGL calls as per Simon Gelfius' suggestion. -// http://www.kinesis.be/ - - -import toxi.geom.*; -import java.util.*; - -PGL pgl; - -Emitter emitter; -Vec3D gravity; -float floorLevel; - -PImage particleImg; -PImage emitterImg; - -int counter; - - -boolean ALLOWGRAVITY; // add gravity vector? -boolean ALLOWPERLIN; // add perlin noise flow field vector? -boolean ALLOWTRAILS; // render particle trails? -boolean ALLOWFLOOR; // add a floor? - // Turning on all of these options will make things - // slow down. - -void setup(){ - size( 600, 600, P3D ); - smooth(4); - // Lately I have gotten into the habit of limiting the color range to be - // 0.0 to 1.0. It works this way in OpenGL so I might as well get used to it. - colorMode( RGB, 1.0 ); - - // Turn on 4X antialiasing - //hint( ENABLE_OPENGL_4X_SMOOTH ); - - // More OpenGL necessity. - pgl = ((PGraphicsOpenGL) g).pgl; - - // Loads in a particle image from the data folder. Image size should be a power of 2. - particleImg = loadImage( "particle.png" ); - emitterImg = loadImage( "emitter.png" ); - - emitter = new Emitter(); - gravity = new Vec3D( 0, .35, 0 ); // gravity vector - floorLevel = 400; -} - -void draw(){ - background( 0.0 ); - perspective( PI/3.0, (float)width/(float)height, 1, 5000 ); - - // Turns on additive blending so we can draw a bunch of glowing images without - // needing to do any depth testing. - pgl.depthMask(false); - pgl.enable( PGL.BLEND ); - pgl.blendFunc(PGL.SRC_ALPHA, PGL.ONE); - - emitter.exist(); - - // If the mouse button is pressed, then add 10 new particles. - if( mousePressed ){ - if( ALLOWTRAILS && ALLOWFLOOR ){ - emitter.addParticles( 5 ); - } else { - emitter.addParticles( 10 ); - } - } - - counter ++; -} - - -void keyPressed(){ - if( key == 'g' || key == 'G' ) - ALLOWGRAVITY = !ALLOWGRAVITY; - - if( key == 'p' || key == 'P' ) - ALLOWPERLIN = !ALLOWPERLIN; - - if( key == 't' || key == 'T' ) - ALLOWTRAILS = !ALLOWTRAILS; - - if( key == 'f' || key == 'F' ) - ALLOWFLOOR = !ALLOWFLOOR; - -} - - -// This method should be nicer, but it isnt. I use getRads to get a perlin noise -// based angle in radians based on the x and y position of the object asking for it. -// Perlin noise is supposed to give you back a number between 0 and 1, but it wont -// necessarily give you numbers that range from 0 to 1. A usual result is more like -// .25 to .75. -// -// So the point of this method is to try to normalize the values to a -// range of 0 to 1. It's not perfect, and I still get weird results. -// For instance, the mult variable is supposed to be the multiplier for the range. -// So if i wanted a random angle between 0 and TWO_PI, I would set the mult = TWO_PI. -// But when I do that, I find the Perlin noise tends to give me a left-pointing angle. -// To counteract, I end up setting the mult to 10.0 in order to increase the chances -// that I get a nice range from at least 0 to TWO_PI. -float minNoise = 0.499; -float maxNoise = 0.501; -float getRads(float val1, float val2, float mult, float div){ - float rads = noise(val1/div, val2/div, counter/div); - - if (rads < minNoise) minNoise = rads; - if (rads > maxNoise) maxNoise = rads; - - rads -= minNoise; - rads *= 1.0/(maxNoise - minNoise); - - return rads * mult; -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/particle.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/particle.pde deleted file mode 100755 index 16441c9c5..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_1_simple/particle.pde +++ /dev/null @@ -1,208 +0,0 @@ -/* -General Structure notes. - My classes tend to have a similar naming scheme and flow. I start with the 'exist' method. - Exist is what an object needs to do every frame. Usually 'existing' consists of four main things. - 1) Find the velocity. This involves determining what influences there are on the velocity. - 2) Apply the velocity to the location. - 3) Render the object. - 4) Age the object. - - I also use the metaphor of aging and death. When first made, a particle's age will be zero. - Every frame, the age will increment. If the age reaches the lifeSpan (which is a random number - that I set in the constructor), then the boolean ISDEAD is set to true and the arraylist iterator - removes the dead element from the list. - */ - - - -class Particle { - int len; // number of elements in position array - Vec3D[] loc; // array of position vectors - Vec3D startLoc; // just used to make sure every loc[] is initialized to the same position - Vec3D vel; // velocity vector - Vec3D perlin; // perlin noise vector - float radius; // particle's size - float age; // current age of particle - int lifeSpan; // max allowed age of particle - float agePer; // range from 1.0 (birth) to 0.0 (death) - float bounceAge; // amount to age particle when it bounces off floor - boolean ISDEAD; // if age == lifeSpan, make particle die - boolean ISBOUNCING; // if particle hits the floor... - - - Particle( Vec3D _loc, Vec3D _vel ) { - radius = random( 10, 40 ); - len = (int)( radius ); - loc = new Vec3D[ len ]; - - // This confusing-looking line does three things at once. - // First, you make a random vector. - // new Vec3D().randomVector() - // Next, you multiply that vector by a random number from 0.0 to 5.0. - // scaleSelf( 5.0 ); - // Finally, you add this new vector to the original sent vector. - // _loc.add( ); - // This is just a way to make sure all the particles made this frame - // don't all start on the exact same pixel. This staggering will be useful - // when we incorporate magnetic repulsion in a later tutorial. - startLoc = new Vec3D( _loc.add( new Vec3D().randomVector().scaleSelf( random( 5.0 ) ) ) ); - - for( int i=0; i floorLevel ) { - ISBOUNCING = true; - } - else { - ISBOUNCING = false; - } - } - - if( ISBOUNCING ) { - vel.scaleSelf( .75 ); - vel.y *= -.5; - } - } - - void setPosition() { - // Every frame, the current location will be passed on to - // the next element in the location array. Think 'cursor trail effect'. - for( int i=len-1; i>0; i-- ) { - loc[i].set( loc[i-1] ); - } - - // Set the initial location. - // loc[0] represents the current position of the particle. - loc[0].addSelf( vel ); - } - - void render() { - // As the particle ages, it will gain blue but will lose red and green. - color c = color( agePer, agePer*.75, 1.0 - agePer ); - renderImage(particleImg, loc[0], radius * agePer, c, 1.0 ); - } - - void renderTrails() { - float xp, yp, zp; - float xOff, yOff, zOff; - beginShape(QUAD_STRIP); - for ( int i=0; i lifeSpan ) { - ISDEAD = true; - } - else { - // When spawned, the agePer is 1.0. - // When death occurs, the agePer is 0.0. - agePer = 1.0 - age/(float)lifeSpan; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/NOC_gl.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/NOC_gl.pde deleted file mode 100644 index 2f91c0f1b..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/NOC_gl.pde +++ /dev/null @@ -1,49 +0,0 @@ - -int squareList; -void initGL(){ - pgl.beginGL(); - squareList = gl.glGenLists(1); - gl.glNewList(squareList, GL.GL_COMPILE); - gl.glBegin(GL.GL_POLYGON); - gl.glTexCoord2f(0, 0); gl.glVertex2f(-.5, -.5); - gl.glTexCoord2f(1, 0); gl.glVertex2f( .5, -.5); - gl.glTexCoord2f(1, 1); gl.glVertex2f( .5, .5); - gl.glTexCoord2f(0, 1); gl.glVertex2f(-.5, .5); - gl.glEnd(); - gl.glEndList(); - pgl.endGL(); -} - -void renderImage( Vec3D _loc, float _diam, color _col, float _alpha ){ - gl.glPushMatrix(); - gl.glTranslatef( _loc.x, -_loc.y, _loc.z ); - pov.glReverseCamera(); - gl.glScalef( _diam, _diam, _diam ); - gl.glColor4f( red(_col), green(_col), blue(_col), _alpha ); - gl.glCallList( squareList ); - gl.glPopMatrix(); -} - -// This will allow you to draw images that are oriented to the floor plane. -void renderImageOnFloor( Vec3D _loc, float _diam, color _col, float _aa ){ - gl.glPushMatrix(); - gl.glTranslatef( _loc.x, -_loc.y, _loc.z ); - gl.glScalef( _diam, _diam, _diam ); - gl.glRotatef( 90, 1.0, 0.0, 0.0 ); - gl.glColor4f( red(_col), green(_col), blue(_col), _aa ); - gl.glCallList( squareList ); - gl.glPopMatrix(); -} - -// This will allow you to specify a rotation for images that are oriented perpendicular to the eyeNormal -// which is the vector pointing from the camera's eye to the camera's point of interest. -void renderImageAndRotate( Vec3D _loc, float _diam, color _col, float _aa, float _rot ){ - gl.glPushMatrix(); - gl.glTranslatef( _loc.x, -_loc.y, _loc.z ); - gl.glRotatef( degrees( _rot ), pov.eyeNormal.x, pov.eyeNormal.y, pov.eyeNormal.z ); - pov.glReverseCamera(); - gl.glScalef( _diam, _diam, _diam ); - gl.glColor4f( red(_col), green(_col), blue(_col), _aa ); - gl.glCallList( squareList ); - gl.glPopMatrix(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/cursor.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/cursor.pde deleted file mode 100644 index ee2909cb9..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/cursor.pde +++ /dev/null @@ -1,25 +0,0 @@ -class Cursor{ - Vec3D loc; - Vec3D vel; - - Cursor(){ - loc = new Vec3D(); - vel = new Vec3D(); - } - - void exist(){ - // 2.35 is an arbitrary number. Ideally, this cursor would function - // properly regardless of the camera's rotation and distance from the object. - // Im not sure how to make that happen... 3D interaction with the cursor has - // been low on my research list. Think of this as a crappy placeholder. - loc.set( ( mouseX - xMid ) * 2.25, ( mouseY - yMid ) * 2.25, 0 ); - } - - void render(){ - pushMatrix(); - translate( loc.x, loc.y, loc.z ); - fill( 1, 0, 0 ); - sphere( 10 ); - popMatrix(); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/emitter.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/emitter.pde deleted file mode 100644 index 04eb2045a..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/emitter.pde +++ /dev/null @@ -1,182 +0,0 @@ -class Emitter{ - Vec3D loc; - Vec3D vel; - Vec3D velToMouse; - float radius; - - Texture coronaTex; - Texture emitterTex; - Texture particleTex; - Texture reflectionTex; - - color myColor; - - ArrayList particles; - ArrayList nebulae; - - Emitter( ){ - - try { - coronaTex = TextureIO.newTexture(new File(dataPath("corona.png")), true); - emitterTex = TextureIO.newTexture(new File(dataPath("emitter.png")), true); - particleTex = TextureIO.newTexture(new File(dataPath("particle.png")), true); - reflectionTex = TextureIO.newTexture(new File(dataPath("reflection.png")), true); - } - catch (IOException e) { - println("Texture file is missing"); - exit(); // or handle it some other way - } - - loc = new Vec3D(); - vel = new Vec3D(); - velToMouse = new Vec3D(); - - radius = 100; - - myColor = color( 1, 1, 1 ); - - particles = new ArrayList(); - nebulae = new ArrayList(); - } - - void exist(){ - findVelocity(); - setPosition(); - iterateListExist(); - render(); - - gl.glDisable( GL.GL_TEXTURE_2D ); - - if( ALLOWTRAILS ) - iterateListRenderTrails(); - } - - void findVelocity(){ - Vec3D dirToMouse = new Vec3D( mouse.loc.sub( loc ).scale( .15 ) ); - vel.set( dirToMouse ); - } - - void setPosition(){ - loc.addSelf( vel ); - - if( ALLOWFLOOR ){ - if( loc.y > floorLevel ){ - loc.y = floorLevel; - vel.y = 0; - } - } - } - - void iterateListExist(){ - gl.glEnable( GL.GL_TEXTURE_2D ); - - - int mylength = particles.size(); - for( int i=mylength-1; i>=0; i-- ){ - Particle p = ( Particle )particles.get(i); - if( p.ISSPLIT ) - addParticles( p ); - - if ( !p.ISDEAD ){ - // pgl.bindTexture( images.particle ); - particleTex.bind(); - particleTex.enable(); - p.exist(); - particleTex.disable(); - - } - else { - particles.set( i, particles.get( particles.size() - 1 ) ); - particles.remove( particles.size() - 1 ); - } - } - - if( ALLOWFLOOR ){ - // pgl.bindTexture( images.reflection ); - reflectionTex.bind(); - reflectionTex.enable(); - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - p.renderReflection(); - } - reflectionTex.disable(); - } - - // pgl.bindTexture( images.corona ); - coronaTex.bind(); - coronaTex.enable(); - for( Iterator it = nebulae.iterator(); it.hasNext(); ){ - Nebula n = (Nebula) it.next(); - if( !n.ISDEAD ){ - n.exist(); - } - else { - it.remove(); - } - } - coronaTex.disable(); - } - - - void render(){ - // pgl.bindTexture( images.emitter ); - emitterTex.bind(); - emitterTex.enable(); - renderImage( loc, radius, myColor, 1.0 ); - emitterTex.enable(); - - if( ALLOWNEBULA ){ - nebulae.add( new Nebula( loc, 15.0, true ) ); - nebulae.add( new Nebula( loc, 45.0, true ) ); - } - - - if( ALLOWFLOOR ){ - // pgl.bindTexture( images.reflection ); - reflectionTex.bind(); - reflectionTex.enable(); - renderReflection(); - reflectionTex.disable(); - } - } - - void renderReflection(){ - float altitude = floorLevel - loc.y; - float reflectMaxAltitude = 300.0; - float yPer = 1.0 - altitude/reflectMaxAltitude; - - if( yPer > .05 ) - renderImageOnFloor( new Vec3D( loc.x, floorLevel, loc.z ), radius * 10.0, color( 0.5, 1.0, yPer*.25 ), yPer ); - - if( mousePressed ) - renderImageOnFloor( new Vec3D( loc.x, floorLevel, loc.z ), radius + ( yPer + 1.0 ) * radius * random( 2.0, 3.5 ), color( 1.0, 0, 0 ), yPer ); - } - - void iterateListRenderTrails(){ - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - p.renderTrails(); - } - } - - void addParticles( int _amt ){ - for( int i=0; i<_amt; i++ ){ - particles.add( new Particle( 1, loc, vel ) ); - } - - if( ALLOWNEBULA ){ - nebulae.add( new Nebula( loc, 40.0, false ) ); - nebulae.add( new Nebula( loc, 100.0, false ) ); - } - } - - void addParticles( Particle _p ){ - // play with amt if you want to control how many particles spawn when splitting - int amt = (int)( _p.radius * .15 ); - for( int i=0; i maxNoise) maxNoise = rads; - - rads -= minNoise; - rads *= 1.0/(maxNoise - minNoise); - - return rads * mult; -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/images.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/images.pde deleted file mode 100644 index 821c91230..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/images.pde +++ /dev/null @@ -1,13 +0,0 @@ -class Images{ - PImage particle; - PImage emitter; - PImage corona; - PImage reflection; - - Images(){ - particle = loadImage( "particle.png" ); - emitter = loadImage( "emitter.png" ); - corona = loadImage( "corona.png" ); - reflection = loadImage( "reflection.png" ); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/nebula.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/nebula.pde deleted file mode 100644 index 573378708..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/nebula.pde +++ /dev/null @@ -1,56 +0,0 @@ -class Nebula{ - Vec3D loc; - Vec3D vel; - float radius; - float scaleFac; - float age; - int lifeSpan; - float agePer; - float rot; - color c; - - boolean ISDEAD; - boolean ISGROUNDED; - - Nebula( Vec3D _loc, float _radius, boolean _ISGROUNDED ){ - loc = new Vec3D( _loc ); - vel = new Vec3D( pov.eyeNormal.scale( 2.0 ) ); - radius = random( _radius*.8, _radius*1.75 ); - - scaleFac = random( 1.005, 1.10 ); - age = 0; - lifeSpan = (int)random(10,30); - rot = random( TWO_PI ); - c = color( random(.75, 1.0), random(.5,.75), random(.2,.8) ); - ISGROUNDED = _ISGROUNDED; - - if( ISGROUNDED ){ - scaleFac = random( 1.01, 1.025 ); - vel.y -= random( 1.0 ); - radius *= 2.0; - } - } - - void exist(){ - move(); - render(); - checkAge(); - } - - void move(){ - radius *= scaleFac; - loc.addSelf( vel ); - } - - void render(){ - renderImageAndRotate( loc, radius, c, sin(agePer*PI) * .4, rot ); - } - - void checkAge(){ - age ++; - agePer = 1.0 - age/(float)lifeSpan; - - if (age > lifeSpan) - ISDEAD = true; - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/particle.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/particle.pde deleted file mode 100644 index 53cbf839b..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/particle.pde +++ /dev/null @@ -1,171 +0,0 @@ - -class Particle{ - int len; // number of elements in position array - Vec3D[] loc; // array of position vectors - Vec3D startLoc; // just used to make sure every loc[] is initialized to the same position - Vec3D vel; // velocity vector - Vec3D perlin; // perlin noise vector - float radius; // particle's size - float age; // current age of particle - int lifeSpan; // max allowed age of particle - float agePer; // range from 1.0 (birth) to 0.0 (death) - int gen; // number of times particle has been involved in a SPLIT - float bounceAge; // amount to age particle when it bounces off floor - float bounceVel; // speed at impact - boolean ISDEAD; // if age == lifeSpan, make particle die - boolean ISBOUNCING; // if particle hits the floor... - boolean ISSPLIT; // if particle hits the floor with enough speed... - - - Particle( int _gen, Vec3D _loc, Vec3D _vel ){ - gen = _gen; - radius = random( 10 - gen, 50 - ( gen-1)*10 ); - - len = (int)( radius*.5 ); - loc = new Vec3D[ len ]; - startLoc = new Vec3D( _loc.add( new Vec3D().randomVector().scaleSelf( random( 1.0 ) ) ) ); - - for( int i=0; i 1 ){ - vel.addSelf( new Vec3D().randomVector().scaleSelf( random( 7.0 ) ) ); - } else { - vel.addSelf( new Vec3D().randomVector().scaleSelf( random( 10.0 ) ) ); - } - - perlin = new Vec3D(); - - age = 0; - bounceAge = 2; - lifeSpan = (int)( radius ); - } - - void exist(){ - if( ALLOWPERLIN ) - findPerlin(); - - findVelocity(); - setPosition(); - render(); - setAge(); - } - - void findPerlin(){ - float xyRads = getRads( loc[0].x, loc[0].z, 20.0, 50.0 ); - float yRads = getRads( loc[0].x, loc[0].y, 20.0, 50.0 ); - perlin.set( cos(xyRads), -sin(yRads), sin(xyRads) ); - perlin.scaleSelf( .5 ); - } - - void findVelocity(){ - if( ALLOWGRAVITY ) - vel.addSelf( gravity ); - - if( ALLOWPERLIN ) - vel.addSelf( perlin ); - - if( ALLOWFLOOR ){ - if( loc[0].y + vel.y > floorLevel ){ - ISBOUNCING = true; - } else { - ISBOUNCING = false; - } - } - - // if the particle is moving fast enough, when it hits the ground it can - // split into a bunch of smaller particles. - if( ISBOUNCING ){ - bounceVel = vel.magnitude(); - - vel.scaleSelf( .7 ); - vel.y *= -( ( radius/40.0 ) * .5 ); - - if( bounceVel > 15.0 && gen < 4 ) - ISSPLIT = true; - - } else { - ISSPLIT = false; - } - } - - void setPosition(){ - for( int i=len-1; i>0; i-- ){ - loc[i].set( loc[i-1] ); - } - - loc[0].addSelf( vel ); - } - - void render(){ - color c = color( agePer - .5, agePer*.25, 1.5 - agePer ); - renderImage( loc[0], radius * agePer, c, 1.0 ); - - // Rendering two graphics here. Makes the particles more vivid, - // but will hinder the performance. - c = color( 1, agePer, agePer ); - renderImage( loc[0], radius * agePer * .5, c, agePer ); - } - - void renderReflection(){ - float altitude = floorLevel - loc[0].y; - float reflectMaxAltitude = 25.0; - float yPer = ( 1.0 - ( altitude/reflectMaxAltitude ) ) * .5; - - if( yPer > .05 ) - renderImageOnFloor( new Vec3D( loc[0].x, floorLevel, loc[0].z ), radius * agePer * 8.0 * yPer, color( agePer, agePer*.25, 0 ), yPer + random( .2 ) ); - } - - void renderTrails(){ - float xp, yp, zp; - float xOff, yOff, zOff; - - gl.glBegin( GL.GL_QUAD_STRIP ); - - for ( int i=0; i lifeSpan ){ - ISDEAD = true; - } else { - agePer = 1.0 - age/(float)lifeSpan; - } - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/pov.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/pov.pde deleted file mode 100644 index 1d5bf01d7..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_GLtexture/pov.pde +++ /dev/null @@ -1,62 +0,0 @@ -// Camera class which uses Kristian Damkjer's OCD library -// http://www.cise.ufl.edu/~kdamkjer/processing/libraries/ocd/ - -class POV{ - PApplet parent; - Camera cam; - - Vec3D eye; - Vec3D center; - - Vec3D eyeNormal; - - boolean ISDRAGGING; - - POV( PApplet _parent ){ - parent = _parent; - cam = new Camera( parent, 0, 100, 1500 ); - - eye = new Vec3D(); - center = new Vec3D(); - eyeNormal = new Vec3D(); - } - - void exist(){ - perspective( PI/3.0, (float)xSize/(float)ySize, .5, 5000 ); - if( ISDRAGGING ){ - cam.circle( radians( ( mouseX - pmouseX ) * .25 ) ); - cam.arc( radians( ( mouseY - pmouseY ) * .25 ) ); - } - - cam.feed(); - setPosition(); - } - - - // Code by JohnG from the Processing forum - // http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Programs;action=display;num=1170790832 - // - // Does the camera transformations in reverse to allow for images that always face the camera. - void glReverseCamera(){ - float deltaX = eye.x - center.x; - float deltaY = eye.y - center.y; - float deltaZ = eye.z - center.z; - - float angleZ = atan2( deltaY,deltaX ); - float hyp = sqrt( sq( deltaX ) + sq( deltaY ) ); - float angleY = atan2( hyp,deltaZ ); - - gl.glRotatef( degrees( angleZ ), 0, 0, 1.0 ); - gl.glRotatef( degrees( angleY ), 0, 1.0, 0 ); - } - - - void setPosition(){ - float[] e = cam.position(); - float[] c = cam.target(); - - eye.set( e[0], e[1], e[2] ); - center.set( c[0], c[1], c[2] ); - eyeNormal = eye.sub(center).normalize(); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/NOC_gl.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/NOC_gl.pde deleted file mode 100755 index 44705cdbd..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/NOC_gl.pde +++ /dev/null @@ -1,31 +0,0 @@ - -void renderImage(PImage img, Vec3D _loc, float _diam, color _col, float _alpha ) { - pushMatrix(); - translate( _loc.x, _loc.y, _loc.z ); - pov.glReverseCamera(); - tint(red(_col), green(_col), blue(_col), _alpha); - imageMode(CENTER); - image(img,0,0,_diam,_diam); - popMatrix(); -} - -void renderImageOnFloor(PImage img, Vec3D _loc, float _diam, color _col, float _aa ) { - pushMatrix(); - translate( _loc.x, _loc.y, _loc.z ); - rotateX(PI/2); - //pov.glReverseCamera(); - tint(red(_col), green(_col), blue(_col), _aa); - imageMode(CENTER); - image(img,0,0,_diam,_diam); - popMatrix(); -} - -void renderImageAndRotate(PImage img, Vec3D _loc, float _diam, color _col, float _aa, float _rot ) { - pushMatrix(); - translate( _loc.x, _loc.y, _loc.z ); - pov.glReverseCamera(); - tint(red(_col), green(_col), blue(_col), _aa); - imageMode(CENTER); - image(img,0,0,_diam,_diam); - popMatrix(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/cursor.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/cursor.pde deleted file mode 100755 index ee2909cb9..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/cursor.pde +++ /dev/null @@ -1,25 +0,0 @@ -class Cursor{ - Vec3D loc; - Vec3D vel; - - Cursor(){ - loc = new Vec3D(); - vel = new Vec3D(); - } - - void exist(){ - // 2.35 is an arbitrary number. Ideally, this cursor would function - // properly regardless of the camera's rotation and distance from the object. - // Im not sure how to make that happen... 3D interaction with the cursor has - // been low on my research list. Think of this as a crappy placeholder. - loc.set( ( mouseX - xMid ) * 2.25, ( mouseY - yMid ) * 2.25, 0 ); - } - - void render(){ - pushMatrix(); - translate( loc.x, loc.y, loc.z ); - fill( 1, 0, 0 ); - sphere( 10 ); - popMatrix(); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/emitter.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/emitter.pde deleted file mode 100755 index d405be8fd..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/emitter.pde +++ /dev/null @@ -1,149 +0,0 @@ -class Emitter{ - Vec3D loc; - Vec3D vel; - Vec3D velToMouse; - float radius; - - color myColor; - - ArrayList particles; - ArrayList nebulae; - - Emitter( ){ - loc = new Vec3D(); - vel = new Vec3D(); - velToMouse = new Vec3D(); - - radius = 100; - - myColor = color( 1, 1, 1 ); - - particles = new ArrayList(); - nebulae = new ArrayList(); - } - - void exist(){ - findVelocity(); - setPosition(); - iterateListExist(); - render(); - - pgl.disable( PGL.TEXTURE_2D ); - - if( ALLOWTRAILS ) - iterateListRenderTrails(); - } - - void findVelocity(){ - Vec3D dirToMouse = new Vec3D( mouse.loc.sub( loc ).scale( .15 ) ); - vel.set( dirToMouse ); - } - - void setPosition(){ - loc.addSelf( vel ); - - if( ALLOWFLOOR ){ - if( loc.y > floorLevel ){ - loc.y = floorLevel; - vel.y = 0; - } - } - } - - void iterateListExist(){ - pgl.enable( PGL.TEXTURE_2D ); - - - int mylength = particles.size(); - for( int i=mylength-1; i>=0; i-- ){ - Particle p = ( Particle )particles.get(i); - if( p.ISSPLIT ) - addParticles( p ); - - if ( !p.ISDEAD ){ - //pgl.bindTexture( images.particle ); - p.exist(); - - } else { - particles.set( i, particles.get( particles.size() - 1 ) ); - particles.remove( particles.size() - 1 ); - } - } - - if( ALLOWFLOOR ){ - //pgl.bindTexture( images.reflection ); - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - p.renderReflection(); - } - } - - //pgl.bindTexture( images.corona ); - for( Iterator it = nebulae.iterator(); it.hasNext(); ){ - Nebula n = (Nebula) it.next(); - if( !n.ISDEAD ){ - n.exist(); - } else { - it.remove(); - } - } - } - - - void render(){ - //pgl.bindTexture( images.emitter ); - renderImage( images.emitter,loc, radius, myColor, 1.0 ); - - - if( ALLOWNEBULA ){ - nebulae.add( new Nebula( loc, 15.0, true ) ); - nebulae.add( new Nebula( loc, 45.0, true ) ); - } - - - if( ALLOWFLOOR ){ - //pgl.bindTexture( images.reflection ); - renderReflection(images.reflection); - } - } - - void renderReflection(PImage img){ - float altitude = floorLevel - loc.y; - float reflectMaxAltitude = 300.0; - float yPer = 1.0 - altitude/reflectMaxAltitude; - - if( yPer > .05 ) - renderImageOnFloor(img, new Vec3D( loc.x, floorLevel, loc.z ), radius * 10.0, color( 0.5, 1.0, yPer*.25 ), yPer ); - - if( mousePressed ) - renderImageOnFloor(img, new Vec3D( loc.x, floorLevel, loc.z ), radius + ( yPer + 1.0 ) * radius * random( 2.0, 3.5 ), color( 1.0, 0, 0 ), yPer ); - } - - void iterateListRenderTrails(){ - for( Iterator it = particles.iterator(); it.hasNext(); ){ - Particle p = (Particle) it.next(); - p.renderTrails(); - } - } - - void addParticles( int _amt ){ - for( int i=0; i<_amt; i++ ){ - particles.add( new Particle( 1, loc, vel ) ); - } - - if( ALLOWNEBULA ){ - nebulae.add( new Nebula( loc, 40.0, false ) ); - nebulae.add( new Nebula( loc, 100.0, false ) ); - } - } - - void addParticles( Particle _p ){ - // play with amt if you want to control how many particles spawn when splitting - int amt = (int)( _p.radius * .15 ); - for( int i=0; i maxNoise) maxNoise = rads; - - rads -= minNoise; - rads *= 1.0/(maxNoise - minNoise); - - return rads * mult; -} - diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/images.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/images.pde deleted file mode 100755 index 821c91230..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/images.pde +++ /dev/null @@ -1,13 +0,0 @@ -class Images{ - PImage particle; - PImage emitter; - PImage corona; - PImage reflection; - - Images(){ - particle = loadImage( "particle.png" ); - emitter = loadImage( "emitter.png" ); - corona = loadImage( "corona.png" ); - reflection = loadImage( "reflection.png" ); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/nebula.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/nebula.pde deleted file mode 100755 index 3412c110f..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/nebula.pde +++ /dev/null @@ -1,56 +0,0 @@ -class Nebula{ - Vec3D loc; - Vec3D vel; - float radius; - float scaleFac; - float age; - int lifeSpan; - float agePer; - float rot; - color c; - - boolean ISDEAD; - boolean ISGROUNDED; - - Nebula( Vec3D _loc, float _radius, boolean _ISGROUNDED ){ - loc = new Vec3D( _loc ); - vel = new Vec3D( pov.eyeNormal.scale( 2.0 ) ); - radius = random( _radius*.8, _radius*1.75 ); - - scaleFac = random( 1.005, 1.10 ); - age = 0; - lifeSpan = (int)random(10,30); - rot = random( TWO_PI ); - c = color( random(.75, 1.0), random(.5,.75), random(.2,.8) ); - ISGROUNDED = _ISGROUNDED; - - if( ISGROUNDED ){ - scaleFac = random( 1.01, 1.025 ); - vel.y -= random( 1.0 ); - radius *= 2.0; - } - } - - void exist(){ - move(); - render(); - checkAge(); - } - - void move(){ - radius *= scaleFac; - loc.addSelf( vel ); - } - - void render(){ - renderImageAndRotate(images.corona, loc, radius, c, sin(agePer*PI) * .4, rot ); - } - - void checkAge(){ - age ++; - agePer = 1.0 - age/(float)lifeSpan; - - if (age > lifeSpan) - ISDEAD = true; - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/particle.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/particle.pde deleted file mode 100755 index 893d3631f..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/particle.pde +++ /dev/null @@ -1,172 +0,0 @@ - -class Particle{ - int len; // number of elements in position array - Vec3D[] loc; // array of position vectors - Vec3D startLoc; // just used to make sure every loc[] is initialized to the same position - Vec3D vel; // velocity vector - Vec3D perlin; // perlin noise vector - float radius; // particle's size - float age; // current age of particle - int lifeSpan; // max allowed age of particle - float agePer; // range from 1.0 (birth) to 0.0 (death) - int gen; // number of times particle has been involved in a SPLIT - float bounceAge; // amount to age particle when it bounces off floor - float bounceVel; // speed at impact - boolean ISDEAD; // if age == lifeSpan, make particle die - boolean ISBOUNCING; // if particle hits the floor... - boolean ISSPLIT; // if particle hits the floor with enough speed... - - - Particle( int _gen, Vec3D _loc, Vec3D _vel ){ - gen = _gen; - radius = random( 10 - gen, 50 - ( gen-1)*10 ); - - len = (int)( radius*.5 ); - loc = new Vec3D[ len ]; - startLoc = new Vec3D( _loc.add( new Vec3D().randomVector().scaleSelf( random( 1.0 ) ) ) ); - - for( int i=0; i 1 ){ - vel.addSelf( new Vec3D().randomVector().scaleSelf( random( 7.0 ) ) ); - } else { - vel.addSelf( new Vec3D().randomVector().scaleSelf( random( 10.0 ) ) ); - } - - perlin = new Vec3D(); - - age = 0; - bounceAge = 2; - lifeSpan = (int)( radius ); - } - - void exist(){ - if( ALLOWPERLIN ) - findPerlin(); - - findVelocity(); - setPosition(); - render(); - setAge(); - } - - void findPerlin(){ - float xyRads = getRads( loc[0].x, loc[0].z, 20.0, 50.0 ); - float yRads = getRads( loc[0].x, loc[0].y, 20.0, 50.0 ); - perlin.set( cos(xyRads), -sin(yRads), sin(xyRads) ); - perlin.scaleSelf( .5 ); - } - - void findVelocity(){ - if( ALLOWGRAVITY ) - vel.addSelf( gravity ); - - if( ALLOWPERLIN ) - vel.addSelf( perlin ); - - if( ALLOWFLOOR ){ - if( loc[0].y + vel.y > floorLevel ){ - ISBOUNCING = true; - } else { - ISBOUNCING = false; - } - } - - // if the particle is moving fast enough, when it hits the ground it can - // split into a bunch of smaller particles. - if( ISBOUNCING ){ - bounceVel = vel.magnitude(); - - vel.scaleSelf( .7 ); - vel.y *= -( ( radius/40.0 ) * .5 ); - - if( bounceVel > 15.0 && gen < 4 ) - ISSPLIT = true; - - } else { - ISSPLIT = false; - } - } - - void setPosition(){ - for( int i=len-1; i>0; i-- ){ - loc[i].set( loc[i-1] ); - } - - loc[0].addSelf( vel ); - } - - void render(){ - color c = color( agePer - .5, agePer*.25, 1.5 - agePer ); - renderImage(images.particle, loc[0], radius * agePer, c, 1.0 ); - - // Rendering two graphics here. Makes the particles more vivid, - // but will hinder the performance. - c = color( 1, agePer, agePer ); - renderImage(images.particle, loc[0], radius * agePer * .5, c, agePer ); - } - - void renderReflection(){ - float altitude = floorLevel - loc[0].y; - float reflectMaxAltitude = 25.0; - float yPer = ( 1.0 - ( altitude/reflectMaxAltitude ) ) * .5; - - if( yPer > .05 ) - renderImageOnFloor(images.particle, new Vec3D( loc[0].x, floorLevel, loc[0].z ), radius * agePer * 8.0 * yPer, color( agePer, agePer*.25, 0 ), yPer + random( .2 ) ); - } - - void renderTrails(){ - float xp, yp, zp; - float xOff, yOff, zOff; - - beginShape(QUAD_STRIP); - - for ( int i=0; i lifeSpan ){ - ISDEAD = true; - } else { - agePer = 1.0 - age/(float)lifeSpan; - } - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/pov.pde b/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/pov.pde deleted file mode 100755 index cc41c1360..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/flight404/flight404_particles_2_simple/pov.pde +++ /dev/null @@ -1,64 +0,0 @@ -// Camera class which uses Kristian Damkjer's OCD library -// http://www.cise.ufl.edu/~kdamkjer/processing/libraries/ocd/ - -class POV{ - PApplet parent; - Camera cam; - - Vec3D eye; - Vec3D center; - - Vec3D eyeNormal; - - boolean ISDRAGGING; - - POV( PApplet _parent ){ - parent = _parent; - cam = new Camera( parent, 0, -100, 1500 ); - - eye = new Vec3D(); - center = new Vec3D(); - eyeNormal = new Vec3D(); - } - - void exist(){ - perspective( PI/3.0, (float)xSize/(float)ySize, .5, 5000 ); - if( ISDRAGGING ){ - cam.circle( radians( ( mouseX - pmouseX ) * .25 ) ); - cam.arc( radians( ( mouseY - pmouseY ) * .25 ) ); - } - - cam.feed(); - setPosition(); - } - - - // Code by JohnG from the Processing forum - // http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Programs;action=display;num=1170790832 - // - // Does the camera transformations in reverse to allow for images that always face the camera. - void glReverseCamera(){ - float deltaX = eye.x - center.x; - float deltaY = eye.y - center.y; - float deltaZ = eye.z - center.z; - - float angleZ = atan2( deltaY,deltaX ); - float hyp = sqrt( sq( deltaX ) + sq( deltaY ) ); - float angleY = atan2( hyp,deltaZ ); - - rotateZ(angleZ); - rotateY(angleY); - //gl.glRotatef( degrees( angleZ ), 0, 0, 1.0 ); - //gl.glRotatef( degrees( angleY ), 0, 1.0, 0 ); - } - - - void setPosition(){ - float[] e = cam.position(); - float[] c = cam.target(); - - eye.set( e[0], e[1], e[2] ); - center.set( c[0], c[1], c[2] ); - eyeNormal = eye.sub(center).normalize(); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Circle.pde b/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Circle.pde deleted file mode 100644 index f45630f37..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Circle.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Circle extends Shape { - - // Inherits all instance variables from parent + adding one - color c; - - Circle(float x_, float y_, float r_, color c_) { - super(x_,y_,r_); // Call the parent constructor - c = c_; // Also deal with this new instance variable - } - - // Call the parent jiggle, but do some more stuff too - void jiggle() { - super.jiggle(); - // The Circle jiggles its size as well as its x,y location. - r += random(-1,1); - r = constrain(r,0,100); - } - - // The changeColor() function is unique to the Circle class. - void changeColor() { - c = color(random(255)); - } - - void display() { - ellipseMode(CENTER); - fill(c); - stroke(0); - ellipse(x,y,r,r); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Shape.pde b/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Shape.pde deleted file mode 100644 index a4d8a723a..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Shape.pde +++ /dev/null @@ -1,28 +0,0 @@ -// Learning Processing -// Daniel Shiffman -// http://www.learningprocessing.com - -// Example 22-1: Inheritance - -class Shape { - float x; - float y; - float r; - - Shape(float x_, float y_, float r_) { - x = x_; - y = y_; - r = r_; - } - - void jiggle() { - x += random(-1,1); - y += random(-1,1); - } - - // A generic shape does not really know how to be displayed. - // This will be overridden in the child classes. - void display() { - point(x,y); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Square.pde b/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Square.pde deleted file mode 100644 index 72831cabe..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/Square.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Square extends Shape { - // Variables are inherited from the parent. - // We could also add variables unique to the Square class if we so desire - - Square(float x_, float y_, float r_) { - // If the parent constructor takes arguments then super() needs to pass in those arguments. - super(x_,y_,r_); - } - - // Inherits jiggle() from parent - - // The square overrides its parent for display. - void display() { - rectMode(CENTER); - fill(175); - stroke(0); - rect(x,y,r,r); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/simpleInheritance.pde b/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/simpleInheritance.pde deleted file mode 100644 index d76add5e3..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simpleInheritance/simpleInheritance.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Object oriented programming allows us to defi ne classes in terms of other classes. -// A class can be a subclass (aka " child " ) of a super class (aka "parent"). -// This is a simple example demonstrating this concept, known as "inheritance." - -Square s; -Circle c; - -void setup() { - size(200,200); - // A square and circle - s = new Square(75,75,10); - c = new Circle(125,125,20,color(175)); -} - -void draw() { - background(255); - c.jiggle(); - s.jiggle(); - c.display(); - s.display(); -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Circle.pde b/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Circle.pde deleted file mode 100644 index f45630f37..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Circle.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Circle extends Shape { - - // Inherits all instance variables from parent + adding one - color c; - - Circle(float x_, float y_, float r_, color c_) { - super(x_,y_,r_); // Call the parent constructor - c = c_; // Also deal with this new instance variable - } - - // Call the parent jiggle, but do some more stuff too - void jiggle() { - super.jiggle(); - // The Circle jiggles its size as well as its x,y location. - r += random(-1,1); - r = constrain(r,0,100); - } - - // The changeColor() function is unique to the Circle class. - void changeColor() { - c = color(random(255)); - } - - void display() { - ellipseMode(CENTER); - fill(c); - stroke(0); - ellipse(x,y,r,r); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Shape.pde b/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Shape.pde deleted file mode 100644 index 671b45edf..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Shape.pde +++ /dev/null @@ -1,26 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Shape { - float x; - float y; - float r; - - Shape(float x_, float y_, float r_) { - x = x_; - y = y_; - r = r_; - } - - void jiggle() { - x += random(-1,1); - y += random(-1,1); - } - - // A generic shape does not really know how to be displayed. - // This will be overridden in the child classes. - void display() { - point(x,y); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Square.pde b/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Square.pde deleted file mode 100644 index 72831cabe..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/Square.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Square extends Shape { - // Variables are inherited from the parent. - // We could also add variables unique to the Square class if we so desire - - Square(float x_, float y_, float r_) { - // If the parent constructor takes arguments then super() needs to pass in those arguments. - super(x_,y_,r_); - } - - // Inherits jiggle() from parent - - // The square overrides its parent for display. - void display() { - rectMode(CENTER); - fill(175); - stroke(0); - rect(x,y,r,r); - } -} diff --git a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/simplePolymorphism.pde b/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/simplePolymorphism.pde deleted file mode 100644 index b7e667acf..000000000 --- a/java/examples/Books/Nature of Code/chp4_systems/simplePolymorphism/simplePolymorphism.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// One array of Shapes -Shape[] shapes = new Shape[30]; - -void setup() { - size(200,200); - for (int i = 0; i < shapes.length; i++ ) { - int r = int(random(2)); - // Randomly put either circles or squares in our array - if (r == 0) { - shapes[i] = new Circle(100,100,10,color(random(255),100)); - } else { - shapes[i] = new Square(100,100,10); - } - } -} - -void draw() { - background(255); - // Jiggle and display all shapes - for (int i = 0; i < shapes.length; i++ ) { - shapes[i].jiggle(); - shapes[i].display(); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/CollisionsEqualMass.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/CollisionsEqualMass.pde deleted file mode 100644 index bbb54b071..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/CollisionsEqualMass.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Collisions -- Elastic, Equal Mass, Two objects only - -// Based off of Chapter 9: Resolving Collisions -// Mathematics and Physics for Programmers by Danny Kodicek - -// A Thing class for idealized collisions - -Mover a; -Mover b; - -boolean showVectors = true; - -void setup() { - size(200,200); - a = new Mover(new PVector(random(5),random(-5,5)),new PVector(10,10)); - b = new Mover(new PVector(-2,1),new PVector(150,150)); -} - -void draw() { - background(255); - a.go(); - b.go(); - - // Note this function will ONLY WORK with two objects - // Needs to be revised in the case of an array of objects - a.collideEqualMass(b); -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/Mover.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/Mover.pde deleted file mode 100644 index 3281a9850..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/Mover.pde +++ /dev/null @@ -1,100 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Collisions - -class Mover { - - PVector loc; - PVector vel; - float bounce = 1.0; - float r = 20; - boolean colliding = false; - - Mover(PVector v, PVector l) { - vel = v.get(); - loc = l.get(); - } - - // Main method to operate object - void go() { - update(); - borders(); - display(); - } - - // Method to update location - void update() { - loc.add(vel); - } - - // Check for bouncing off borders - void borders() { - if (loc.y > height) { - vel.y *= -bounce; - loc.y = height; - } - else if (loc.y < 0) { - vel.y *= -bounce; - loc.y = 0; - } - if (loc.x > width) { - vel.x *= -bounce; - loc.x = width; - } - else if (loc.x < 0) { - vel.x *= -bounce; - loc.x = 0; - } - } - - // Method to display - void display() { - ellipseMode(CENTER); - stroke(0); - fill(175,200); - ellipse(loc.x,loc.y,r*2,r*2); - if (showVectors) { - drawVector(vel,loc,10); - } - } - - void collideEqualMass(Mover other) { - float d = PVector.dist(loc,other.loc); - float sumR = r + other.r; - // Are they colliding? - if (!colliding && d < sumR) { - // Yes, make new velocities! - colliding = true; - // Direction of one object another - PVector n = PVector.sub(other.loc,loc); - n.normalize(); - - // Difference of velocities so that we think of one object as stationary - PVector u = PVector.sub(vel,other.vel); - - // Separate out components -- one in direction of normal - PVector un = componentVector(u,n); - // Other component - u.sub(un); - // These are the new velocities plus the velocity of the object we consider as stastionary - vel = PVector.add(u,other.vel); - other.vel = PVector.add(un,other.vel); - } - else if (d > sumR) { - colliding = false; - } - } -} - -PVector componentVector (PVector vector, PVector directionVector) { - //--! ARGUMENTS: vector, directionVector (2D vectors) - //--! RETURNS: the component vector of vector in the direction directionVector - //-- normalize directionVector - directionVector.normalize(); - directionVector.mult(vector.dot(directionVector)); - return directionVector; -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/drawVector.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/drawVector.pde deleted file mode 100644 index 141c06960..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/CollisionsEqualMass/drawVector.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void drawVector(PVector v, PVector loc, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(loc.x,loc.y); - stroke(0); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - line(len,0,len-arrowsize,+arrowsize/2); - line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); -} - - -void mousePressed() { - showVectors = !showVectors; -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Blob.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Blob.pde deleted file mode 100644 index d2cd65eb1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Blob.pde +++ /dev/null @@ -1,195 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A blob skeleton -// Could be used to create blobbly characters a la Nokia Friends -// http://postspectacular.com/work/nokia/friends/start - -class Skeleton { - - // A list to keep track of all the bodies and joints - ArrayList bodies; - ArrayList joints; - - float bodyRadius; // The radius of each body that makes up the skeleton - float radius; // The radius of the entire blob - float totalPoints; // How many points make up the blob - - - // We should modify this constructor to receive arguments - // So that we can make many different types of blobs - Skeleton() { - - // Create the empty ArrayLists - bodies = new ArrayList(); - joints = new ArrayList(); - - // Where and how big is the blob - Vec2 center = new Vec2(width/2, height/2); - radius = 100; - totalPoints = 32; - bodyRadius = 10; - - // Initialize all the points in a circle - for (int i = 0; i < totalPoints; i++) { - // Look polar to cartesian coordinate transformation! - float theta = PApplet.map(i, 0, totalPoints, 0, TWO_PI); - float x = center.x + radius * sin(theta); - float y = center.y + radius * cos(theta); - - // Make each individual body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - - bd.fixedRotation = true; // no rotation! - bd.position.set(box2d.coordPixelsToWorld(x, y)); - Body body = box2d.createBody(bd); - - // The body is a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(bodyRadius); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - fd.density = 1; - fd.friction = 0.5; - fd.restitution = 0.3; - - // Finalize the body - body.createFixture(fd); - - // Store our own copy for later rendering - bodies.add(body); - } - - // Now connect the outline of the shape all with joints - for (int i = 0; i < bodies.size(); i++) { - DistanceJointDef djd = new DistanceJointDef(); - Body a = bodies.get(i); - int next = i+1; - if (i == bodies.size()-1) { - next = 0; - } - Body b = bodies.get(next); - // Connection between previous particle and this one - djd.bodyA = a; - djd.bodyB = b; - // Equilibrium length is distance between these bodies - Vec2 apos = a.getWorldCenter(); - Vec2 bpos = b.getWorldCenter(); - float d = dist(apos.x, apos.y, bpos.x, bpos.y); - djd.length = d; - // These properties affect how springy the joint is - djd.frequencyHz = 10; - djd.dampingRatio = 0.9; - - // Make the joint. - DistanceJoint dj = (DistanceJoint) box2d.world.createJoint(djd); - joints.add(dj); - } - - - // Make some joints that cross the center of the blob between bodies - for (int i = 0; i < bodies.size(); i++) { - for (int j = i+2; j < bodies.size(); j+=4) { - DistanceJointDef djd = new DistanceJointDef(); - Body a = bodies.get(i); - Body b = bodies.get(j); - // Connection between two bides - djd.bodyA = a; - djd.bodyB = b; - // Equilibrium length is distance between these bodies - Vec2 apos = a.getWorldCenter(); - Vec2 bpos = b.getWorldCenter(); - float d = dist(apos.x, apos.y, bpos.x, bpos.y); - - djd.length = d; - // These properties affect how springy the joint is - djd.frequencyHz = 3; - djd.dampingRatio = 0.1; - - // Make the joint. - DistanceJoint dj = (DistanceJoint) box2d.world.createJoint(djd); - joints.add(dj); - } - } - } - - - // Draw the skeleton as circles for bodies and lines for joints - void displaySkeleton() { - // Draw the outline - stroke(0); - strokeWeight(1); - for (Joint j: joints) { - Body a = j.getBodyA(); - Body b = j.getBodyB(); - Vec2 posa = box2d.getBodyPixelCoord(a); - Vec2 posb = box2d.getBodyPixelCoord(b); - line(posa.x, posa.y, posb.x, posb.y); - } - - // Draw the individual circles - for (Body b: bodies) { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(b); - // Get its angle of rotation - float a = b.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(175); - stroke(0); - strokeWeight(1); - ellipse(0, 0, bodyRadius*2, bodyRadius*2); - popMatrix(); - } - } - - - // Draw it as a creature - void displayCreature() { - // Let's compute the center! - Vec2 center = new Vec2(0, 0); - - // Make a curvy polygon - beginShape(); - stroke(175); - strokeWeight(bodyRadius*2); - fill(175); - for (Body b: bodies) { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(b); - curveVertex(pos.x, pos.y); - center.addLocal(pos); - } - endShape(CLOSE); - // Center is average of all points - center.mulLocal(1.0/bodies.size()); - - // Find angle between center and side body - Vec2 pos = box2d.getBodyPixelCoord(bodies.get(0)); - float dx = pos.x - center.x; - float dy = pos.y - center.y; - float angle = atan2(dy, dx)-PI/2; - - // Draw eyes and mouth relative to center - pushMatrix(); - strokeWeight(1); - stroke(0); - translate(center.x, center.y); - rotate(angle); - fill(0); - ellipse(-25, -50, 16, 16); - ellipse(25, -50, 16, 16); - line(-50, 50, 50, 50); - popMatrix(); - } - - Body getFirstBody() { - return bodies.get(0); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/BlobSkeleton.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/BlobSkeleton.pde deleted file mode 100644 index c9f4ee0a0..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/BlobSkeleton.pde +++ /dev/null @@ -1,109 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A blob skeleton -// Could be used to create blobbly characters a la Nokia Friends -// http://postspectacular.com/work/nokia/friends/start - -import pbox2d.*; - -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.joints.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - -// Our "blob" object -Skeleton blob; - -// Just a single box this time -Box box; -// The Spring that will attach to the box from the mouse -Spring spring; - -// Draw creature design or skeleton? -boolean skeleton; - -void setup() { - size(640, 360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Add some boundaries - boundaries = new ArrayList(); - boundaries.add(new Boundary(width/2, height-5, width, 10)); - boundaries.add(new Boundary(width/2, 5, width, 10)); - boundaries.add(new Boundary(width-5, height/2, 10, height)); - boundaries.add(new Boundary(5, height/2, 10, height)); - - // Make a new blob - blob = new Skeleton(); - - // Make the box - box = new Box(width/2, 100); - - // Make the spring (it doesn't really get initialized until the mouse is clicked) - spring = new Spring(); -} - -// When the mouse is released we're done with the spring -void mouseReleased() { - spring.destroy(); -} - -// When the mouse is pressed we. . . -void mousePressed() { - // Check to see if the mouse was clicked on the box - if (box.contains(mouseX, mouseY)) { - // And if so, bind the mouse location to the box with a spring - spring.bind(mouseX, mouseY, box); - } -} - -void draw() { - background(255); - - // We must always step through time! - - box2d.step(); - - - // Show the blob! - if (skeleton) { - blob.displaySkeleton(); - } - else { - blob.displayCreature(); - } - - // Show the boundaries! - for (Boundary wall: boundaries) { - wall.display(); - } - - // Always alert the spring to the new mouse location - spring.update(mouseX, mouseY); - - // Draw the box - box.display(); - // Draw the spring (it only appears when active) - spring.display(); - - fill(0); - text("Space bar to toggle creature/skeleton.\nClick and drag the box.", 20, height-30); -} - - -void keyPressed() { - if (key == ' ') { - skeleton = !skeleton; - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Boundary.pde deleted file mode 100644 index 9a17026a1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Box.pde deleted file mode 100644 index 16a2c18b2..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Box.pde +++ /dev/null @@ -1,85 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 50; - h = 50; - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - body.setUserData(this); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(50); - stroke(0); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Spring.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Spring.pde deleted file mode 100644 index 02fd1612b..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/BlobSkeleton/Spring.pde +++ /dev/null @@ -1,75 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Class to describe the spring joint (displayed as a line) - -class Spring { - - // This is the box2d object we need to create - MouseJoint mouseJoint; - - Spring() { - // At first it doesn't exist - mouseJoint = null; - } - - // If it exists we set its target to the mouse location - void update(float x, float y) { - if (mouseJoint != null) { - // Always convert to world coordinates! - Vec2 mouseWorld = box2d.coordPixelsToWorld(x,y); - mouseJoint.setTarget(mouseWorld); - } - } - - void display() { - if (mouseJoint != null) { - // We can get the two anchor points - Vec2 v1 = new Vec2(0,0); - mouseJoint.getAnchorA(v1); - Vec2 v2 = new Vec2(0,0); - mouseJoint.getAnchorB(v2); - // Convert them to screen coordinates - v1 = box2d.coordWorldToPixels(v1); - v2 = box2d.coordWorldToPixels(v2); - // And just draw a line - stroke(0); - strokeWeight(1); - line(v1.x,v1.y,v2.x,v2.y); - } - } - - - // This is the key function where - // we attach the spring to an x,y location - // and the Box object's location - void bind(float x, float y, Box box) { - // Define the joint - MouseJointDef md = new MouseJointDef(); - // Body A is just a fake ground body for simplicity (there isn't anything at the mouse) - md.bodyA = box2d.getGroundBody(); - // Body 2 is the box's boxy - md.bodyB = box.body; - // Get the mouse location in world coordinates - Vec2 mp = box2d.coordPixelsToWorld(x,y); - // And that's the target - md.target.set(mp); - // Some stuff about how strong and bouncy the spring should be - md.maxForce = 1000.0 * box.body.m_mass; - md.frequencyHz = 5.0; - md.dampingRatio = 0.9; - - // Make the joint! - mouseJoint = (MouseJoint) box2d.world.createJoint(md); - } - - void destroy() { - // We can get rid of the joint when the mouse is released - if (mouseJoint != null) { - box2d.world.destroyJoint(mouseJoint); - mouseJoint = null; - } - } - -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blob.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blob.pde deleted file mode 100644 index 1919d79e2..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blob.pde +++ /dev/null @@ -1,118 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// PBox2D example - -// A blob skeleton -// Could be used to create blobbly characters a la Nokia Friends -// http://postspectacular.com/work/nokia/friends/start - -class Blob { - - // A list to keep track of all the points in our blob - ArrayList skeleton; - - float bodyRadius; // The radius of each body that makes up the skeleton - float radius; // The radius of the entire blob - float totalPoints; // How many points make up the blob - - - // We should modify this constructor to receive arguments - // So that we can make many different types of blobs - Blob() { - - // Create the empty - skeleton = new ArrayList(); - - // Let's make a volume of joints! - ConstantVolumeJointDef cvjd = new ConstantVolumeJointDef(); - - // Where and how big is the blob - Vec2 center = new Vec2(width/2, height/2); - radius = 100; - totalPoints = 20; - bodyRadius = 12; - - - // Initialize all the points - for (int i = 0; i < totalPoints; i++) { - // Look polar to cartesian coordinate transformation! - float theta = PApplet.map(i, 0, totalPoints, 0, TWO_PI); - float x = center.x + radius * sin(theta); - float y = center.y + radius * cos(theta); - - // Make each individual body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - - bd.fixedRotation = true; // no rotation! - bd.position.set(box2d.coordPixelsToWorld(x, y)); - Body body = box2d.createBody(bd); - - // The body is a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(bodyRadius); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - - // For filtering out collisions - //fd.filter.groupIndex = -2; - - // Parameters that affect physics - fd.density = 1; - - // Finalize the body - body.createFixture(fd); - // Add it to the volume - cvjd.addBody(body); - - - // Store our own copy for later rendering - skeleton.add(body); - } - - // These parameters control how stiff vs. jiggly the blob is - cvjd.frequencyHz = 10.0f; - cvjd.dampingRatio = 1.0f; - - // Put the joint thing in our world! - box2d.world.createJoint(cvjd); - } - - - // Time to draw the blob! - // Can you make it a cute character, a la http://postspectacular.com/work/nokia/friends/start - void display() { - - // Draw the outline - beginShape(); - noFill(); - stroke(0); - strokeWeight(1); - for (Body b: skeleton) { - Vec2 pos = box2d.getBodyPixelCoord(b); - vertex(pos.x, pos.y); - } - endShape(CLOSE); - - // Draw the individual circles - for (Body b: skeleton) { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(b); - // Get its angle of rotation - float a = b.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(175); - stroke(0); - strokeWeight(1); - ellipse(0, 0, bodyRadius*2, bodyRadius*2); - popMatrix(); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blobby.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blobby.pde deleted file mode 100644 index d5df8e919..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Blobby.pde +++ /dev/null @@ -1,63 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A blob skeleton -// Could be used to create blobbly characters a la Nokia Friends -// http://postspectacular.com/work/nokia/friends/start - -// This seems to be broken with the Box2D 2.1.2 version I'm using - -import pbox2d.*; - -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.joints.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - -// Our "blob" object -Blob blob; - - void setup() { - size(400,300); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Add some boundaries - boundaries = new ArrayList(); - boundaries.add(new Boundary(width/2,height-5,width,10)); - boundaries.add(new Boundary(width/2,5,width,10)); - boundaries.add(new Boundary(width-5,height/2,10,height)); - boundaries.add(new Boundary(5,height/2,10,height)); - - // Make a new blob - blob = new Blob(); -} - - void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Show the blob! - blob.display(); - - // Show the boundaries! - for (Boundary wall: boundaries) { - wall.display(); - } - - -} - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Boundary.pde deleted file mode 100644 index 9a17026a1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Blobby/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Boundary.pde deleted file mode 100644 index ff6226252..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Boundary.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - - b.setUserData(this); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/CollisionListeningDeletionExercise.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/CollisionListeningDeletionExercise.pde deleted file mode 100644 index 37c6ee51d..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/CollisionListeningDeletionExercise.pde +++ /dev/null @@ -1,118 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with our own motion (by attaching a MouseJoint) -// Also demonstrates how to know which object was hit - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -Boundary wall; - -void setup() { - size(400, 300); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Turn on collision listening! - box2d.listenForCollisions(); - - // Create the empty list - particles = new ArrayList(); - - wall = new Boundary(width/2, height-5, width, 10); -} - -void draw() { - background(255); - - if (random(1) < 0.1) { - float sz = random(4, 8); - particles.add(new Particle(random(width), 20, sz)); - } - - - // We must always step through time! - box2d.step(); - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - wall.display(); -} - - -// Collision event functions! -void beginContact(Contact cp) { - // Get both shapes - Fixture f1 = cp.getFixtureA(); - Fixture f2 = cp.getFixtureB(); - // Get both bodies - Body b1 = f1.getBody(); - Body b2 = f2.getBody(); - - // Get our objects that reference these bodies - Object o1 = b1.getUserData(); - Object o2 = b2.getUserData(); - - if (o1.getClass() == Particle.class && o2.getClass() == Particle.class) { - Particle p1 = (Particle) o1; - p1.delete(); - Particle p2 = (Particle) o2; - p2.delete(); - } - - if (o1.getClass() == Boundary.class) { - Particle p = (Particle) o2; - p.change(); - } - if (o2.getClass() == Boundary.class) { - Particle p = (Particle) o1; - p.change(); - } - - -} - -// Objects stop touching each other -void endContact(Contact cp) { -} - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Particle.pde deleted file mode 100644 index 5a4017c84..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionListeningDeletionExercise/Particle.pde +++ /dev/null @@ -1,95 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - color col; - - boolean delete = false; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - col = color(175); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - void delete() { - delete = true; - } - - // Change color when hit - void change() { - col = color(255, 0, 0); - } - - // Is the particle ready for deletion? - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2 || delete) { - killBody(); - return true; - } - return false; - } - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(col); - stroke(0); - strokeWeight(1); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - body = box2d.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Box.pde deleted file mode 100644 index 1fb05d066..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Box.pde +++ /dev/null @@ -1,85 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 24; - h = 24; - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - body.setUserData(this); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(175); - stroke(0); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/CollisionsAndControl.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/CollisionsAndControl.pde deleted file mode 100644 index 7ddaa71b6..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/CollisionsAndControl.pde +++ /dev/null @@ -1,150 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with our own motion (by attaching a MouseJoint) -// Also demonstrates how to know which object was hit - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// Just a single box this time -Box box; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// The Spring that will attach to the box from the mouse -Spring spring; - -// Perlin noise values -float xoff = 0; -float yoff = 1000; - - -void setup() { - size(400,300); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Turn on collision listening! - box2d.listenForCollisions(); - - // Make the box - box = new Box(width/2,height/2); - - // Make the spring (it doesn't really get initialized until the mouse is clicked) - spring = new Spring(); - spring.bind(width/2,height/2,box); - - // Create the empty list - particles = new ArrayList(); - - -} - -void draw() { - background(255); - - if (random(1) < 0.2) { - float sz = random(4,8); - particles.add(new Particle(width/2,-20,sz)); - } - - - // We must always step through time! - box2d.step(); - - // Make an x,y coordinate out of perlin noise - float x = noise(xoff)*width; - float y = noise(yoff)*height; - xoff += 0.01; - yoff += 0.01; - - // This is tempting but will not work! - // box.body.setXForm(box2d.screenToWorld(x,y),0); - - // Instead update the spring which pulls the mouse along - if (mousePressed) { - spring.update(mouseX,mouseY); - spring.display(); - } else { - spring.update(x,y); - } - box.body.setAngularVelocity(0); - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - // Draw the box - box.display(); - - // Draw the spring - // spring.display(); -} - - -// Collision event functions! -void beginContact(Contact cp) { - // Get both fixtures - Fixture f1 = cp.getFixtureA(); - Fixture f2 = cp.getFixtureB(); - // Get both bodies - Body b1 = f1.getBody(); - Body b2 = f2.getBody(); - // Get our objects that reference these bodies - Object o1 = b1.getUserData(); - Object o2 = b2.getUserData(); - - // If object 1 is a Box, then object 2 must be a particle - // Note we are ignoring particle on particle collisions - if (o1.getClass() == Box.class) { - Particle p = (Particle) o2; - p.change(); - } - // If object 2 is a Box, then object 1 must be a particle - else if (o2.getClass() == Box.class) { - Particle p = (Particle) o1; - p.change(); - } -} - - -// Objects stop touching each other -void endContact(Contact cp) { -} - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Particle.pde deleted file mode 100644 index 50be57e86..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Particle.pde +++ /dev/null @@ -1,91 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - color col; - - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - col = color(175); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Change color when hit - void change() { - col = color(255, 0, 0); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(col); - stroke(0); - strokeWeight(1); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - body = box2d.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Spring.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Spring.pde deleted file mode 100644 index cca069b90..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControl/Spring.pde +++ /dev/null @@ -1,81 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Class to describe the spring joint (displayed as a line) - -class Spring { - - // This is the box2d object we need to create - MouseJoint mouseJoint; - - Spring() { - // At first it doesn't exist - mouseJoint = null; - } - - // If it exists we set its target to the mouse location - void update(float x, float y) { - if (mouseJoint != null) { - // Always convert to world coordinates! - Vec2 mouseWorld = box2d.coordPixelsToWorld(x,y); - mouseJoint.setTarget(mouseWorld); - } - } - - void display() { - if (mouseJoint != null) { - // We can get the two anchor points - Vec2 v1 = new Vec2(0,0); - mouseJoint.getAnchorA(v1); - Vec2 v2 = new Vec2(0,0); - mouseJoint.getAnchorB(v2); - // Convert them to screen coordinates - v1 = box2d.coordWorldToPixels(v1); - v2 = box2d.coordWorldToPixels(v2); - // And just draw a line - stroke(0); - strokeWeight(1); - line(v1.x,v1.y,v2.x,v2.y); - } - } - - - // This is the key function where - // we attach the spring to an x,y location - // and the Box object's location - void bind(float x, float y, Box box) { - // Define the joint - MouseJointDef md = new MouseJointDef(); - - // Body A is just a fake ground body for simplicity (there isn't anything at the mouse) - md.bodyA = box2d.getGroundBody(); - // Body 2 is the box's boxy - md.bodyB = box.body; - // Get the mouse location in world coordinates - Vec2 mp = box2d.coordPixelsToWorld(x,y); - // And that's the target - md.target.set(mp); - // Some stuff about how strong and bouncy the spring should be - md.maxForce = 1000.0 * box.body.m_mass; - md.frequencyHz = 5.0; - md.dampingRatio = 0.9; - - // Wake up body! - //box.body.wakeUp(); - - // Make the joint! - mouseJoint = (MouseJoint) box2d.world.createJoint(md); - } - - void destroy() { - // We can get rid of the joint when the mouse is released - if (mouseJoint != null) { - box2d.world.destroyJoint(mouseJoint); - mouseJoint = null; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Box.pde deleted file mode 100644 index 1fb05d066..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Box.pde +++ /dev/null @@ -1,85 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 24; - h = 24; - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - body.setUserData(this); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(175); - stroke(0); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/CollisionsAndControlInterface.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/CollisionsAndControlInterface.pde deleted file mode 100644 index 08df03156..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/CollisionsAndControlInterface.pde +++ /dev/null @@ -1,111 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with our own motion (by attaching a MouseJoint) -// Also demonstrates how to know which object was hit - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// Just a single box this time -Box box; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// The Spring that will attach to the box from the mouse -Spring spring; - -// Perlin noise values -float xoff = 0; -float yoff = 1000; - - -void setup() { - size(400,300); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Add a listener to listen for collisions! - box2d.world.setContactListener(new CustomListener()); - - // Make the box - box = new Box(width/2,height/2); - - // Make the spring (it doesn't really get initialized until the mouse is clicked) - spring = new Spring(); - spring.bind(width/2,height/2,box); - - // Create the empty list - particles = new ArrayList(); - - -} - -void draw() { - background(255); - - if (random(1) < 0.2) { - float sz = random(4,8); - particles.add(new Particle(width/2,-20,sz)); - } - - - // We must always step through time! - box2d.step(); - - // Make an x,y coordinate out of perlin noise - float x = noise(xoff)*width; - float y = noise(yoff)*height; - xoff += 0.01; - yoff += 0.01; - - // This is tempting but will not work! - // box.body.setXForm(box2d.screenToWorld(x,y),0); - - // Instead update the spring which pulls the mouse along - if (mousePressed) { - spring.update(mouseX,mouseY); - } else { - spring.update(x,y); - } - //box.body.setAngularVelocity(0); - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - // Draw the box - box.display(); - - // Draw the spring - // spring.display(); -} - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/ContactListener.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/ContactListener.pde deleted file mode 100644 index 48b5f659e..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/ContactListener.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// ContactListener to listen for collisions! - -import org.jbox2d.callbacks.ContactImpulse; -import org.jbox2d.callbacks.ContactListener; -import org.jbox2d.collision.Manifold; -import org.jbox2d.dynamics.contacts.Contact; - - class CustomListener implements ContactListener { - CustomListener() { - } - - // This function is called when a new collision occurs - void beginContact(Contact cp) { - // Get both fixtures - Fixture f1 = cp.getFixtureA(); - Fixture f2 = cp.getFixtureB(); - // Get both bodies - Body b1 = f1.getBody(); - Body b2 = f2.getBody(); - // Get our objects that reference these bodies - Object o1 = b1.getUserData(); - Object o2 = b2.getUserData(); - - // If object 1 is a Box, then object 2 must be a particle - // Note we are ignoring particle on particle collisions - if (o1.getClass() == Box.class) { - Particle p = (Particle) o2; - p.change(); - } - // If object 2 is a Box, then object 1 must be a particle - else if (o2.getClass() == Box.class) { - Particle p = (Particle) o1; - p.change(); - } - } - - void endContact(Contact contact) { - // TODO Auto-generated method stub - } - - void preSolve(Contact contact, Manifold oldManifold) { - // TODO Auto-generated method stub - } - - void postSolve(Contact contact, ContactImpulse impulse) { - // TODO Auto-generated method stub - } -} - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Particle.pde deleted file mode 100644 index 50be57e86..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Particle.pde +++ /dev/null @@ -1,91 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - color col; - - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - col = color(175); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Change color when hit - void change() { - col = color(255, 0, 0); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(col); - stroke(0); - strokeWeight(1); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - body = box2d.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Spring.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Spring.pde deleted file mode 100644 index c16494932..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/CollisionsAndControlInterface/Spring.pde +++ /dev/null @@ -1,81 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Class to describe the spring joint (displayed as a line) - -class Spring { - - // This is the box2d object we need to create - MouseJoint mouseJoint; - - Spring() { - // At first it doesn't exist - mouseJoint = null; - } - - // If it exists we set its target to the mouse location - void update(float x, float y) { - if (mouseJoint != null) { - // Always convert to world coordinates! - Vec2 mouseWorld = box2d.coordPixelsToWorld(x,y); - mouseJoint.setTarget(mouseWorld); - } - } - - void display() { - if (mouseJoint != null) { - // We can get the two anchor points - Vec2 v1 = null; - mouseJoint.getAnchorA(v1); - Vec2 v2 = null; - mouseJoint.getAnchorB(v2); - // Convert them to screen coordinates - v1 = box2d.coordWorldToPixels(v1); - v2 = box2d.coordWorldToPixels(v2); - // And just draw a line - stroke(0); - strokeWeight(1); - line(v1.x,v1.y,v2.x,v2.y); - } - } - - - // This is the key function where - // we attach the spring to an x,y location - // and the Box object's location - void bind(float x, float y, Box box) { - // Define the joint - MouseJointDef md = new MouseJointDef(); - - // Body A is just a fake ground body for simplicity (there isn't anything at the mouse) - md.bodyA = box2d.getGroundBody(); - // Body 2 is the box's boxy - md.bodyB = box.body; - // Get the mouse location in world coordinates - Vec2 mp = box2d.coordPixelsToWorld(x,y); - // And that's the target - md.target.set(mp); - // Some stuff about how strong and bouncy the spring should be - md.maxForce = 1000.0f * box.body.m_mass; - md.frequencyHz = 5.0f; - md.dampingRatio = 0.9f; - - // Wake up body! - //box.body.wakeUp(); - - // Make the joint! - mouseJoint = (MouseJoint) box2d.world.createJoint(md); - } - - void destroy() { - // We can get rid of the joint when the mouse is released - if (mouseJoint != null) { - box2d.world.destroyJoint(mouseJoint); - mouseJoint = null; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Boundary.pde deleted file mode 100644 index 9a17026a1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Box.pde deleted file mode 100644 index 7847ff65f..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Box.pde +++ /dev/null @@ -1,96 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x, float y) { - w = random(8,16); - h = w; - // Add the box to the box2d world - makeBody(new Vec2(x,y),w,h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+w*h) { - killBody(); - return true; - } - return false; - } - - void attract(float x,float y) { - // From BoxWrap2D example - Vec2 worldTarget = box2d.coordPixelsToWorld(x,y); - Vec2 bodyVec = body.getWorldCenter(); - // First find the vector going from this body to the specified point - worldTarget.subLocal(bodyVec); - // Then, scale the vector to the specified force - worldTarget.normalize(); - worldTarget.mulLocal((float) 50); - // Now apply it to the body's center of mass. - body.applyForce(worldTarget, bodyVec); - } - - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(175); - stroke(0); - rect(0,0,w,h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - - body = box2d.createBody(bd); - body.createFixture(fd); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Exercise_5_10_ApplyForceAttractMouse.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Exercise_5_10_ApplyForceAttractMouse.pde deleted file mode 100644 index 63bf2617b..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceAttractMouse/Exercise_5_10_ApplyForceAttractMouse.pde +++ /dev/null @@ -1,82 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of falling rectangles - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; -// A list for all of our rectangles -ArrayList boxes; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create ArrayLists - boxes = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-50,10)); - boundaries.add(new Boundary(3*width/4,height-5,width/2-50,10)); - boundaries.add(new Boundary(width-5,height/2,10,height)); - boundaries.add(new Boundary(5,height/2,10,height)); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // When the mouse is clicked, add a new Box object - if (random(1) < 0.1) { - Box p = new Box(random(width),10); - boxes.add(p); - } - - if (mousePressed) { - for (Box b: boxes) { - b.attract(mouseX,mouseY); - } - } - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } - - // Boxes that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = boxes.size()-1; i >= 0; i--) { - Box b = boxes.get(i); - if (b.done()) { - boxes.remove(i); - } - } - - fill(0); - text("Click mouse to attract boxes",20,20); -} - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Boundary.pde deleted file mode 100644 index 9a17026a1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Box.pde deleted file mode 100644 index 92c4f0280..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Box.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x, float y) { - w = random(8, 16); - h = w; - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+w*h) { - killBody(); - return true; - } - return false; - } - - void applyForce(Vec2 force) { - Vec2 pos = body.getWorldCenter(); - body.applyForce(force, pos); - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(175); - stroke(0); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.2; - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - bd.angle = random(TWO_PI); - - body = box2d.createBody(bd); - body.createFixture(fd); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Exercise_5_10_ApplyForceSimpleWind.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Exercise_5_10_ApplyForceSimpleWind.pde deleted file mode 100644 index fa0b3f89c..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_ApplyForceSimpleWind/Exercise_5_10_ApplyForceSimpleWind.pde +++ /dev/null @@ -1,83 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of falling rectangles - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; -// A list for all of our rectangles -ArrayList boxes; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create ArrayLists - boxes = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-100,10)); - boundaries.add(new Boundary(3*width/4,height-5,width/2-100,10)); - boundaries.add(new Boundary(width-5,height/2,10,height)); - boundaries.add(new Boundary(5,height/2,10,height)); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // When the mouse is clicked, add a new Box object - if (random(1) < 0.1) { - Box p = new Box(random(width),10); - boxes.add(p); - } - - if (mousePressed) { - for (Box b: boxes) { - Vec2 wind = new Vec2(20,0); - b.applyForce(wind); - } - } - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } - - // Boxes that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = boxes.size()-1; i >= 0; i--) { - Box b = boxes.get(i); - if (b.done()) { - boxes.remove(i); - } - } - - fill(0); - text("Click mouse to apply a wind force.",20,20); -} - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Attractor.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Attractor.pde deleted file mode 100644 index 2a9bd9e38..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Attractor.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Showing how to use applyForce() with box2d - -// Fixed Attractor (this is redundant with Mover) - -class Attractor { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Attractor(float r_, float x, float y) { - r = r_; - // Define a body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - body.createFixture(cs,1); - - } - - - // Formula for gravitational attraction - // We are computing this in "world" coordinates - // No need to convert to pixels and back - Vec2 attract(Mover m) { - float G = 100; // Strength of force - // clone() makes us a copy - Vec2 pos = body.getWorldCenter(); - Vec2 moverPos = m.body.getWorldCenter(); - // Vector pointing from mover to attractor - Vec2 force = pos.sub(moverPos); - float distance = force.length(); - // Keep force within bounds - distance = constrain(distance,1,5); - force.normalize(); - // Note the attractor's mass is 0 because it's fixed so can't use that - float strength = (G * 1 * m.body.m_mass) / (distance * distance); // Calculate gravitional force magnitude - force.mulLocal(strength); // Get force vector --> magnitude * direction - return force; - } - - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(175); - stroke(0); - strokeWeight(2); - ellipse(0,0,r*2,r*2); - popMatrix(); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Exercise_5_10_AttractionApplyForce.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Exercise_5_10_AttractionApplyForce.pde deleted file mode 100644 index c85c91956..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Exercise_5_10_AttractionApplyForce.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Showing how to use applyForce() with box2d - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// Movers, jsut like before! -Mover[] movers = new Mover[25]; - -// Attractor, just like before! -Attractor a; - -void setup() { - size(800,200); - box2d = new PBox2D(this); - box2d.createWorld(); - // No global gravity force - box2d.setGravity(0,0); - - for (int i = 0; i < movers.length; i++) { - movers[i] = new Mover(random(8,16),random(width),random(height)); - } - a = new Attractor(32,width/2,height/2); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - a.display(); - - for (int i = 0; i < movers.length; i++) { - // Look, this is just like what we had before! - Vec2 force = a.attract(movers[i]); - movers[i].applyForce(force); - movers[i].display(); - } -} - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Mover.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Mover.pde deleted file mode 100644 index df8cafcc5..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_10_AttractionApplyForce/Mover.pde +++ /dev/null @@ -1,63 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Showing how to use applyForce() with box2d - -class Mover { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Mover(float r_, float x, float y) { - r = r_; - // Define a body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - - body.setLinearVelocity(new Vec2(random(-5,5),random(-5,-5))); - body.setAngularVelocity(random(-1,1)); - } - - void applyForce(Vec2 v) { - body.applyForce(v, body.getWorldCenter()); - } - - - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(127); - stroke(0); - strokeWeight(2); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Exercise_5_3_NoiseChain.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Exercise_5_3_NoiseChain.pde deleted file mode 100644 index d4f75ecd5..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Exercise_5_3_NoiseChain.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An uneven surface - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// An object to store information about the uneven surface -Surface surface; - -void setup() { - size(383,200); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create the empty list - particles = new ArrayList(); - // Create the surface - surface = new Surface(); -} - -void draw() { - // If the mouse is pressed, we make new particles - if (mousePressed) { - float sz = random(2,6); - particles.add(new Particle(mouseX,mouseY,sz)); - } - - // We must always step through time! - box2d.step(); - - background(255); - - // Draw the surface - surface.display(); - - // Draw all particles - for (Particle p: particles) { - p.display(); - } - - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - if (p.done()) { - particles.remove(i); - } - } -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Particle.pde deleted file mode 100644 index 05783d49e..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Particle.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x,y,r); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(175); - stroke(0); - strokeWeight(1); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - bd.type = BodyType.DYNAMIC; - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - // Give it a random initial velocity (and angular velocity) - body.setLinearVelocity(new Vec2(random(-10f,10f),random(5f,10f))); - body.setAngularVelocity(random(-10,10)); - } - - - - - - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Surface.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Surface.pde deleted file mode 100644 index 211874b0d..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_NoiseChain/Surface.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An uneven surface boundary - -class Surface { - // We'll keep track of all of the surface points - ArrayList surface; - - - Surface() { - surface = new ArrayList(); - - // This is what box2d uses to put the surface in its world - ChainShape chain = new ChainShape(); - - // Perlin noise argument - float xoff = 0.0; - - // This has to go backwards so that the objects bounce off the top of the surface - // This "edgechain" will only work in one direction! - for (float x = width+10; x > -10; x -= 5) { - - // Doing some stuff with perlin noise to calculate a surface that points down on one side - // and up on the other - float y; - if (x > width/2) { - y = 50 + (width - x)*1.1 + map(noise(xoff),0,1,-80,80); - } - else { - y = 50 + x*1.1 + map(noise(xoff),0,1,-40,40); - } - - // Store the vertex in screen coordinates - surface.add(new Vec2(x,y)); - - // Move through perlin noise - xoff += 0.1; - - } - - // Build an array of vertices in Box2D coordinates - // from the ArrayList we made - Vec2[] vertices = new Vec2[surface.size()]; - for (int i = 0; i < vertices.length; i++) { - Vec2 edge = box2d.coordPixelsToWorld(surface.get(i)); - vertices[i] = edge; - } - - // Create the chain! - chain.createChain(vertices,vertices.length); - - // The edge chain is now attached to a body via a fixture - BodyDef bd = new BodyDef(); - bd.position.set(0.0f,0.0f); - Body body = box2d.createBody(bd); - // Shortcut, we could define a fixture if we - // want to specify frictions, restitution, etc. - body.createFixture(chain,1); - - } - - // A simple function to just draw the edge chain as a series of vertex points - void display() { - strokeWeight(2); - stroke(0); - noFill(); - beginShape(); - for (Vec2 v: surface) { - vertex(v.x,v.y); - } - endShape(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Exercise_5_3_SineChain.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Exercise_5_3_SineChain.pde deleted file mode 100644 index b313ef3ce..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Exercise_5_3_SineChain.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An uneven surface - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// An object to store information about the uneven surface -Surface surface; - -void setup() { - size(383,200); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -10); - - // Create the empty list - particles = new ArrayList(); - // Create the surface - surface = new Surface(); -} - -void draw() { - // If the mouse is pressed, we make new particles - if (random(1) < 0.5) { - float sz = random(2,6); - particles.add(new Particle(width/2,10,sz)); - } - - // We must always step through time! - box2d.step(); - - background(255); - - // Draw the surface - surface.display(); - - // Draw all particles - for (Particle p: particles) { - p.display(); - } - - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - if (p.done()) { - particles.remove(i); - } - } -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Particle.pde deleted file mode 100644 index 05783d49e..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Particle.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x,y,r); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(175); - stroke(0); - strokeWeight(1); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - bd.type = BodyType.DYNAMIC; - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - // Give it a random initial velocity (and angular velocity) - body.setLinearVelocity(new Vec2(random(-10f,10f),random(5f,10f))); - body.setAngularVelocity(random(-10,10)); - } - - - - - - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Surface.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Surface.pde deleted file mode 100644 index 3be00b5a9..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_3_SineChain/Surface.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An uneven surface boundary - -class Surface { - // We'll keep track of all of the surface points - ArrayList surface; - - - Surface() { - surface = new ArrayList(); - - // This is what box2d uses to put the surface in its world - ChainShape chain = new ChainShape(); - - float theta = 0; - - // This has to go backwards so that the objects bounce off the top of the surface - // This "edgechain" will only work in one direction! - for (float x = width+10; x > -10; x -= 5) { - - // Doing some stuff with perlin noise to calculate a surface that points down on one side - // and up on the other - float y = map(cos(theta),-1,1,75,height-10); - theta += 0.15; - - // Store the vertex in screen coordinates - surface.add(new Vec2(x,y)); - - } - - // Build an array of vertices in Box2D coordinates - // from the ArrayList we made - Vec2[] vertices = new Vec2[surface.size()]; - for (int i = 0; i < vertices.length; i++) { - Vec2 edge = box2d.coordPixelsToWorld(surface.get(i)); - vertices[i] = edge; - } - - // Create the chain! - chain.createChain(vertices,vertices.length); - - // The edge chain is now attached to a body via a fixture - BodyDef bd = new BodyDef(); - bd.position.set(0.0f,0.0f); - Body body = box2d.createBody(bd); - // Shortcut, we could define a fixture if we - // want to specify frictions, restitution, etc. - body.createFixture(chain,1); - - } - - // A simple function to just draw the edge chain as a series of vertex points - void display() { - strokeWeight(2); - stroke(0); - noFill(); - beginShape(); - for (Vec2 v: surface) { - vertex(v.x,v.y); - } - endShape(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Box.pde deleted file mode 100644 index f872679b9..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Box.pde +++ /dev/null @@ -1,88 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x, float y) { - w = random(4, 16); - h = random(4, 16); - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+w*h) { - killBody(); - return true; - } - return false; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - stroke(0); - fill(127); - strokeWeight(2); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - - body = box2d.createBody(bd); - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Bridge.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Bridge.pde deleted file mode 100644 index eafb42cdc..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Bridge.pde +++ /dev/null @@ -1,66 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Series of Particles connected with distance joints - -class Bridge { - - // Bridge properties - float totalLength; // How long - int numPoints; // How many points - - // Our chain is a list of particles - ArrayList particles; - - // Chain constructor - Bridge(float l, int n) { - - totalLength = l; - numPoints = n; - - particles = new ArrayList(); - - float len = totalLength / numPoints; - - // Here is the real work, go through and add particles to the chain itself - for(int i=0; i < numPoints+1; i++) { - // Make a new particle - Particle p = null; - - // First and last particles are made with density of zero - if (i == 0 || i == numPoints) p = new Particle(i*len,height/4,4,true); - else p = new Particle(i*len,height/4,4,false); - particles.add(p); - - // Connect the particles with a distance joint - if (i > 0) { - DistanceJointDef djd = new DistanceJointDef(); - Particle previous = particles.get(i-1); - // Connection between previous particle and this one - djd.bodyA = previous.body; - djd.bodyB = p.body; - // Equilibrium length - djd.length = box2d.scalarPixelsToWorld(len); - // These properties affect how springy the joint is - djd.frequencyHz = 0; - djd.dampingRatio = 0; - - // Make the joint. Note we aren't storing a reference to the joint ourselves anywhere! - // We might need to someday, but for now it's ok - DistanceJoint dj = (DistanceJoint) box2d.world.createJoint(djd); - } - } - } - - // Draw the bridge - void display() { - for (Particle p: particles) { - p.display(); - } - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Exercise_5_6_Bridge.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Exercise_5_6_Bridge.pde deleted file mode 100644 index 2946efe93..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Exercise_5_6_Bridge.pde +++ /dev/null @@ -1,82 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example demonstrating distance joints -// A bridge is formed by connected a series of particles with joints - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// An object to describe a Bridget (a list of particles with joint connections) -Bridge bridge; - -// A list for all of our rectangles -ArrayList boxes; - -void setup() { - size(800, 200); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - - // Make the bridge - bridge = new Bridge(width, width/10); - - // Create ArrayLists - boxes = new ArrayList(); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - - // When the mouse is clicked, add a new Box object - if (mousePressed) { - Box p = new Box(mouseX, mouseY); - boxes.add(p); - } - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } - - // Boxes that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = boxes.size()-1; i >= 0; i--) { - Box b = boxes.get(i); - if (b.done()) { - boxes.remove(i); - } - } - - // Draw the windmill - bridge.display(); - - - fill(0); - //text("Click mouse to add boxes.", 10, height-10); -} - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Particle.pde deleted file mode 100644 index c545127cc..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Exercise_5_6_Bridge/Particle.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y, float r_, boolean fixed) { - r = r_; - - // Define a body - BodyDef bd = new BodyDef(); - if (fixed) bd.type = BodyType.STATIC; - else bd.type = BodyType.DYNAMIC; - - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - stroke(0); - fill(127); - strokeWeight(2); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } - - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Box.pde deleted file mode 100644 index c6a8aed73..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Box.pde +++ /dev/null @@ -1,102 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - boolean dragged = false; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 24; - h = 24; - // Add the box to the box2d world - makeBody(new Vec2(x,y),w,h); - body.setUserData(this); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - void setAngularVelocity(float a) { - body.setAngularVelocity(a); - } - void setVelocity(Vec2 v) { - body.setLinearVelocity(v); - } - - void setLocation(float x, float y) { - Vec2 pos = body.getWorldCenter(); - Vec2 target = box2d.coordPixelsToWorld(x,y); - Vec2 diff = new Vec2(target.x-pos.x,target.y-pos.y); - diff.mulLocal(50); - setVelocity(diff); - setAngularVelocity(0); - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(175); - stroke(0); - rect(0,0,w,h); - popMatrix(); - } - - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.KINEMATIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - bd.fixedRotation = true; - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape ps = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - ps.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = ps; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/KinematicTest.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/KinematicTest.pde deleted file mode 100644 index 758299639..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/KinematicTest.pde +++ /dev/null @@ -1,141 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with our own motion (by attaching a MouseJoint) -// Also demonstrates how to know which object was hit - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// Just a single box this time -Box box; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// Perlin noise values -float xoff = 0; -float yoff = 1000; - - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Turn on collision listening! - box2d.listenForCollisions(); - - // Make the box - box = new Box(width/2,height/2); - - // Create the empty list - particles = new ArrayList(); - - -} - -void draw() { - background(255); - - if (random(1) < 0.2) { - float sz = random(4,8); - particles.add(new Particle(width/2,-20,sz)); - } - - - // We must always step through time! - box2d.step(); - - // Make an x,y coordinate out of perlin noise - float x = noise(xoff)*width; - float y = noise(yoff)*height; - xoff += 0.01; - yoff += 0.01; - - // This is tempting but will not work! - // box.body.setXForm(box2d.screenToWorld(x,y),0); - - // Instead update the spring which pulls the mouse along - if (mousePressed) { - box.setLocation(mouseX,mouseY); - } else { - //box.setLocation(x,y); - } - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - // Draw the box - box.display(); - - // Draw the spring - // spring.display(); -} - - -// Collision event functions! -void beginContact(Contact cp) { - // Get both fixtures - Fixture f1 = cp.getFixtureA(); - Fixture f2 = cp.getFixtureB(); - // Get both bodies - Body b1 = f1.getBody(); - Body b2 = f2.getBody(); - // Get our objects that reference these bodies - Object o1 = b1.getUserData(); - Object o2 = b2.getUserData(); - - // If object 1 is a Box, then object 2 must be a particle - // Note we are ignoring particle on particle collisions - if (o1.getClass() == Box.class) { - Particle p = (Particle) o2; - p.change(); - } - // If object 2 is a Box, then object 1 must be a particle - else if (o2.getClass() == Box.class) { - Particle p = (Particle) o1; - p.change(); - } -} - - -// Objects stop touching each other -void endContact(Contact cp) { -} - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Particle.pde deleted file mode 100644 index 12c50f772..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/KinematicTest/Particle.pde +++ /dev/null @@ -1,93 +0,0 @@ -// The Nature of Code -// -// Spring 2010 -// PBox2D example - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - color col; - - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - col = color(175); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Change color when hit - void change() { - col = color(255, 0, 0); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(col); - stroke(0); - strokeWeight(1); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - - body = box2d.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Boundary.pde deleted file mode 100644 index 71c6a82d0..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Boundary.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class (now incorporates angle) - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_, float a) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.angle = a; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - noFill(); - stroke(0); - strokeWeight(1); - rectMode(CENTER); - - float a = b.getAngle(); - - pushMatrix(); - translate(x,y); - rotate(-a); - rect(0,0,w,h); - popMatrix(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Liquidy.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Liquidy.pde deleted file mode 100644 index fa7ab19aa..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Liquidy.pde +++ /dev/null @@ -1,71 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Box2D particle system example - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - - - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - -// A list for all particle systems -ArrayList systems; - -void setup() { - size(400,300); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create ArrayLists - systems = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(50,100,300,5,-0.3)); - boundaries.add(new Boundary(250,175,300,5,0.5)); - -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Run all the particle systems - for (ParticleSystem system: systems) { - system.run(); - - int n = (int) random(0,2); - system.addParticles(n); - } - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } -} - - -void mousePressed() { - // Add a new Particle System whenever the mouse is clicked - systems.add(new ParticleSystem(0, new PVector(mouseX,mouseY))); -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Particle.pde deleted file mode 100644 index dd1f4f564..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/Particle.pde +++ /dev/null @@ -1,98 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A Particle - -class Particle { - - // We need to keep track of a Body - Body body; - - PVector[] trail; - - // Constructor - Particle(float x_, float y_) { - float x = x_; - float y = y_; - trail = new PVector[6]; - for (int i = 0; i < trail.length; i++) { - trail[i] = new PVector(x, y); - } - - // Add the box to the box2d world - // Here's a little trick, let's make a tiny tiny radius - // This way we have collisions, but they don't overwhelm the system - makeBody(new Vec2(x, y), 0.2f); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+20) { - killBody(); - return true; - } - return false; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - - // Keep track of a history of screen positions in an array - for (int i = 0; i < trail.length-1; i++) { - trail[i] = trail[i+1]; - } - trail[trail.length-1] = new PVector(pos.x, pos.y); - - // Draw particle as a trail - beginShape(); - noFill(); - strokeWeight(2); - stroke(0, 150); - for (int i = 0; i < trail.length; i++) { - vertex(trail[i].x, trail[i].y); - } - endShape(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float r) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-1, 1), random(-1, 1))); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - - fd.density = 1; - fd.friction = 0; // Slippery when wet! - fd.restitution = 0.5; - - // We could use this if we want to turn collisions off - //cd.filter.groupIndex = -10; - - // Attach fixture to body - body.createFixture(fd); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/ParticleSystem.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/ParticleSystem.pde deleted file mode 100644 index 08e74e0b4..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/Liquidy/ParticleSystem.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Box2D Particle System - -// A class to describe a group of Particles -// An ArrayList is used to manage the list of Particles - -class ParticleSystem { - - ArrayList particles; // An ArrayList for all the particles - PVector origin; // An origin point for where particles are birthed - - ParticleSystem(int num, PVector v) { - particles = new ArrayList(); // Initialize the ArrayList - origin = v.get(); // Store the origin point - - for (int i = 0; i < num; i++) { - particles.add(new Particle(origin.x,origin.y)); // Add "num" amount of particles to the ArrayList - } - } - - void run() { - // Display all the particles - for (Particle p: particles) { - p.display(); - } - - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - if (p.done()) { - particles.remove(i); - } - } - } - - void addParticles(int n) { - for (int i = 0; i < n; i++) { - particles.add(new Particle(origin.x,origin.y)); - } - } - - // A method to test if the particle system still has particles - boolean dead() { - if (particles.isEmpty()) { - return true; - } - else { - return false; - } - } - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Boundary.pde deleted file mode 100644 index 71c6a82d0..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Boundary.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class (now incorporates angle) - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_, float a) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.angle = a; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - noFill(); - stroke(0); - strokeWeight(1); - rectMode(CENTER); - - float a = b.getAngle(); - - pushMatrix(); - translate(x,y); - rotate(-a); - rect(0,0,w,h); - popMatrix(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Box.pde deleted file mode 100644 index 806f51daa..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/Box.pde +++ /dev/null @@ -1,105 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - boolean dragged = false; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 24; - h = 24; - // Add the box to the box2d world - makeBody(new Vec2(x,y),w,h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - void setAngularVelocity(float a) { - body.setAngularVelocity(a); - } - void setVelocity(Vec2 v) { - body.setLinearVelocity(v); - } - - void setLocation(float x, float y) { - Vec2 pos = body.getWorldCenter(); - Vec2 target = box2d.coordPixelsToWorld(x,y); - Vec2 diff = target.sub(pos); - diff.mulLocal(50); - setVelocity(diff); - setAngularVelocity(0); - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(175); - stroke(0); - rect(0,0,w,h); - popMatrix(); - } - - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.KINEMATIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/MouseKinematic.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/MouseKinematic.pde deleted file mode 100644 index a2e2bdba3..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/MouseKinematic/MouseKinematic.pde +++ /dev/null @@ -1,75 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with the mouse (by attaching a spring) - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - -// Just a single box this time -Box box; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Make the box - box = new Box(width/2,height/2); - - // Add a bunch of fixed boundaries - boundaries = new ArrayList(); - boundaries.add(new Boundary(width/2,height-5,width,10,0)); - boundaries.add(new Boundary(width/2,5,width,10,0)); - boundaries.add(new Boundary(width-5,height/2,10,height,0)); - boundaries.add(new Boundary(5,height/2,10,height,0)); -} - - -void draw() { - background(255); - - // We must always step through time! - - //if (box.dragged) { - box.setLocation(mouseX,mouseY); - //} - - box2d.step(); - - // Draw the boundaries - for (Boundary wall : boundaries) { - wall.display(); - } - - // Draw the box - box.display(); - - -} - -void mousePressed() { - if (box.contains(mouseX,mouseY)) { - box.dragged = true; - } -} - -void mouseReleased() { - box.dragged = false; -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/Box.pde deleted file mode 100644 index e9774abf0..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/Box.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - - float x,y; - float w,h; - - // Constructor - Box(float x_, float y_) { - x = x_; - y = y_; - w = 16; - h = 16; - } - - // Drawing the box - void display() { - fill(127); - stroke(0); - strokeWeight(2); - rectMode(CENTER); - rect(x,y,w,h); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/NOC_5_1_box2d_exercise.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/NOC_5_1_box2d_exercise.pde deleted file mode 100644 index 111643b0c..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise/NOC_5_1_box2d_exercise.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A list for all of our rectangles -ArrayList boxes; - -void setup() { - size(640,360); - // Create ArrayLists - boxes = new ArrayList(); -} - -void draw() { - background(255); - - // When the mouse is clicked, add a new Box object - if (mousePressed) { - Box p = new Box(mouseX,mouseY); - boxes.add(p); - } - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/Box.pde deleted file mode 100644 index 2be8fa137..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/Box.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - // Instead of any of the usual variables, we will store a reference to a Box2D Body - Body body; - - float w,h; - - Box(float x, float y) { - w = 16; - h = 16; - - // Build Body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - body = box2d.createBody(bd); - - - // Define a polygon (this is what we use for a rectangle) - PolygonShape ps = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); // Box2D considers the width and height of a - ps.setAsBox(box2dW, box2dH); // rectangle to be the distance from the - // center to the edge (so half of what we - // normally think of as width or height.) - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = ps; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - // Attach Fixture to Body - body.createFixture(fd); - } - - void display() { - // We need the Body’s location and angle - Vec2 pos = box2d.getBodyPixelCoord(body); - float a = body.getAngle(); - - pushMatrix(); - translate(pos.x,pos.y); // Using the Vec2 position and float angle to - rotate(-a); // translate and rotate the rectangle - fill(127); - stroke(0); - strokeWeight(2); - rectMode(CENTER); - rect(0,0,w,h); - popMatrix(); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/NOC_5_1_box2d_exercise_solved.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/NOC_5_1_box2d_exercise_solved.pde deleted file mode 100644 index 22d39e2a9..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_1_box2d_exercise_solved/NOC_5_1_box2d_exercise_solved.pde +++ /dev/null @@ -1,40 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A list for all of our rectangles -ArrayList boxes; - -PBox2D box2d; - -void setup() { - size(640, 360); - // Initialize and create the Box2D world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Create ArrayLists - boxes = new ArrayList(); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // When the mouse is clicked, add a new Box object - Box p = new Box(mouseX, mouseY); - boxes.add(p); - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Boundary.pde deleted file mode 100644 index 54e662ceb..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape ps = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - ps.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(ps,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Box.pde deleted file mode 100644 index 344e1f108..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/Box.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x, float y) { - w = random(4, 16); - h = random(4, 16); - // Add the box to the box2d world - makeBody(new Vec2(x, y), w, h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+w*h) { - killBody(); - return true; - } - return false; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - rect(0, 0, w, h); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - - body = box2d.createBody(bd); - body.createFixture(fd); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/NOC_5_2_Boxes.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/NOC_5_2_Boxes.pde deleted file mode 100644 index 23193aa97..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_2_Boxes/NOC_5_2_Boxes.pde +++ /dev/null @@ -1,71 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of falling rectangles - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; -// A list for all of our rectangles -ArrayList boxes; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -10); - - // Create ArrayLists - boxes = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-50,10)); - boundaries.add(new Boundary(3*width/4,height-50,width/2-50,10)); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Boxes fall from the top every so often - if (random(1) < 0.2) { - Box p = new Box(width/2,30); - boxes.add(p); - } - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - // Display all the boxes - for (Box b: boxes) { - b.display(); - } - - // Boxes that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = boxes.size()-1; i >= 0; i--) { - Box b = boxes.get(i); - if (b.done()) { - boxes.remove(i); - } - } -} - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/NOC_5_3_ChainShape_Simple.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/NOC_5_3_ChainShape_Simple.pde deleted file mode 100644 index cee4a66e1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/NOC_5_3_ChainShape_Simple.pde +++ /dev/null @@ -1,69 +0,0 @@ -// The Nature of Code -// -// Spring 2011 -// PBox2D example - -// An uneven surface - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -// An object to store information about the uneven surface -Surface surface; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -10); - - // Create the empty list - particles = new ArrayList(); - // Create the surface - surface = new Surface(); -} - -void draw() { - // If the mouse is pressed, we make new particles - if (random(1) < 0.5) { - float sz = random(4,8); - particles.add(new Particle(width/2,10,sz)); - } - - // We must always step through time! - box2d.step(); - - background(255); - - // Draw the surface - surface.display(); - - // Draw all particles - for (Particle p: particles) { - p.display(); - } - - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - if (p.done()) { - particles.remove(i); - } - } -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Particle.pde deleted file mode 100644 index a7d390361..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Particle.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x,y,r); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - bd.type = BodyType.DYNAMIC; - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - // Give it a random initial velocity (and angular velocity) - body.setLinearVelocity(new Vec2(random(-10f,10f),random(5f,10f))); - body.setAngularVelocity(random(-10,10)); - } - - - - - - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Surface.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Surface.pde deleted file mode 100644 index 09da0d535..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_3_ChainShape_Simple/Surface.pde +++ /dev/null @@ -1,52 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An uneven surface boundary - -class Surface { - // We'll keep track of all of the surface points - ArrayList surface; - - - Surface() { - surface = new ArrayList(); - // Here we keep track of the screen coordinates of the chain - surface.add(new Vec2(0, height/2)); - surface.add(new Vec2(width/2, height/2+50)); - surface.add(new Vec2(width, height/2)); - - // This is what box2d uses to put the surface in its world - ChainShape chain = new ChainShape(); - - // We can add 3 vertices by making an array of 3 Vec2 objects - Vec2[] vertices = new Vec2[surface.size()]; - for (int i = 0; i < vertices.length; i++) { - vertices[i] = box2d.coordPixelsToWorld(surface.get(i)); - } - - chain.createChain(vertices, vertices.length); - - // The edge chain is now a body! - BodyDef bd = new BodyDef(); - Body body = box2d.world.createBody(bd); - // Shortcut, we could define a fixture if we - // want to specify frictions, restitution, etc. - body.createFixture(chain, 1); - } - - // A simple function to just draw the edge chain as a series of vertex points - void display() { - strokeWeight(1); - stroke(0); - fill(0); - beginShape(); - for (Vec2 v: surface) { - vertex(v.x, v.y); - } - vertex(width, height); - vertex(0, height); - endShape(CLOSE); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/Boundary.pde deleted file mode 100644 index ebf6b04bf..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/Boundary.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class (now incorporates angle) - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_, float a) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.angle = a; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, it doesn't move so we don't have to ask the Body for location - void display() { - fill(0); - stroke(0); - strokeWeight(1); - rectMode(CENTER); - float a = b.getAngle(); - pushMatrix(); - translate(x,y); - rotate(-a); - rect(0,0,w,h); - popMatrix(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/CustomShape.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/CustomShape.pde deleted file mode 100644 index 9e0180a59..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/CustomShape.pde +++ /dev/null @@ -1,90 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class CustomShape { - - // We need to keep track of a Body and a width and height - Body body; - - // Constructor - CustomShape(float x, float y) { - // Add the box to the box2d world - makeBody(new Vec2(x, y)); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height) { - killBody(); - return true; - } - return false; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - Fixture f = body.getFixtureList(); - PolygonShape ps = (PolygonShape) f.getShape(); - - - rectMode(CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - beginShape(); - //println(vertices.length); - // For every vertex, convert to pixel vector - for (int i = 0; i < ps.getVertexCount(); i++) { - Vec2 v = box2d.vectorWorldToPixels(ps.getVertex(i)); - vertex(v.x, v.y); - } - endShape(CLOSE); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center) { - - Vec2[] vertices = new Vec2[4]; - vertices[0] = box2d.vectorPixelsToWorld(new Vec2(-15, 25)); - vertices[1] = box2d.vectorPixelsToWorld(new Vec2(15, 0)); - vertices[2] = box2d.vectorPixelsToWorld(new Vec2(20, -15)); - vertices[3] = box2d.vectorPixelsToWorld(new Vec2(-10, -10)); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape ps = new PolygonShape(); - ps.set(vertices, vertices.length); - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - body.createFixture(ps, 1.0); - - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/NOC_5_4_Polygons.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/NOC_5_4_Polygons.pde deleted file mode 100644 index 283741835..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_4_Polygons/NOC_5_4_Polygons.pde +++ /dev/null @@ -1,71 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of falling rectangles - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; -// A list for all of our rectangles -ArrayList polygons; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create ArrayLists - polygons = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-50,10,0)); - boundaries.add(new Boundary(3*width/4,height-50,width/2-50,10,0)); - boundaries.add(new Boundary(width-5,height/2,10,height,0)); - boundaries.add(new Boundary(5,height/2,10,height,0)); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - // Display all the people - for (CustomShape cs: polygons) { - cs.display(); - } - - // people that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = polygons.size()-1; i >= 0; i--) { - CustomShape cs = polygons.get(i); - if (cs.done()) { - polygons.remove(i); - } - } -} - -void mousePressed() { - CustomShape cs = new CustomShape(mouseX,mouseY); - polygons.add(cs); -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Boundary.pde deleted file mode 100644 index afe2ab2f5..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Boundary.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class (now incorporates angle) - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_, float a) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.angle = a; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - strokeWeight(1); - rectMode(CENTER); - - float a = b.getAngle(); - - pushMatrix(); - translate(x,y); - rotate(-a); - rect(0,0,w,h); - popMatrix(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Lollipop.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Lollipop.pde deleted file mode 100644 index 65805e008..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/Lollipop.pde +++ /dev/null @@ -1,88 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box -class Lollipop { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - float r; - - // Constructor - Lollipop(float x, float y) { - w = 8; - h = 24; - r = 8; - // Add the box to the box2d world - makeBody(new Vec2(x, y)); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+w*h) { - killBody(); - return true; - } - return false; - } - - // Drawing the lollipop - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x, pos.y); - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - - rect(0,0,w,h); - ellipse(0, -h/2, r*2, r*2); - popMatrix(); - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center) { - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - CircleShape circle = new CircleShape(); - circle.m_radius = box2d.scalarPixelsToWorld(r); - Vec2 offset = new Vec2(0,-h/2); - offset = box2d.vectorPixelsToWorld(offset); - circle.m_p.set(offset.x,offset.y); - - PolygonShape ps = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - ps.setAsBox(box2dW, box2dH); - - body.createFixture(ps,1.0); - body.createFixture(circle, 1.0); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/NOC_5_5_MultiShapes.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/NOC_5_5_MultiShapes.pde deleted file mode 100644 index 132b03ba6..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_5_MultiShapes/NOC_5_5_MultiShapes.pde +++ /dev/null @@ -1,71 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of falling rectangles - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; -// A list for all of our rectangles -ArrayList pops; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this,20); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0, -20); - - // Create ArrayLists - pops = new ArrayList(); - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-50,10,0)); - boundaries.add(new Boundary(3*width/4,height-50,width/2-50,10,0)); - boundaries.add(new Boundary(width-5,height/2,10,height,0)); - boundaries.add(new Boundary(5,height/2,10,height,0)); -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - // Display all the people - for (Lollipop p: pops) { - p.display(); - } - - // people that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - for (int i = pops.size()-1; i >= 0; i--) { - Lollipop p = pops.get(i); - if (p.done()) { - pops.remove(i); - } - } -} - -void mousePressed() { - Lollipop p = new Lollipop(mouseX,mouseY); - pops.add(p); -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Boundary.pde deleted file mode 100644 index 9a17026a1..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Boundary.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/NOC_5_6_DistanceJoint.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/NOC_5_6_DistanceJoint.pde deleted file mode 100644 index 489468ebb..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/NOC_5_6_DistanceJoint.pde +++ /dev/null @@ -1,78 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example demonstrating distance joints -// A bridge is formed by connected a series of particles with joints - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - - -// A list for all of our rectangles -ArrayList pairs; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Create ArrayLists - pairs = new ArrayList(); - - boundaries = new ArrayList(); - - // Add a bunch of fixed boundaries - boundaries.add(new Boundary(width/4,height-5,width/2-50,10)); - boundaries.add(new Boundary(3*width/4,height-50,width/2-50,10)); - -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // When the mouse is clicked, add a new Box object - - // Display all the boxes - for (Pair p: pairs) { - p.display(); - } - - // Display all the boundaries - for (Boundary wall: boundaries) { - wall.display(); - } - - fill(0); - text("Click mouse to add connected particles.",10,20); -} - -void mousePressed() { - Pair p = new Pair(mouseX,mouseY); - pairs.add(p); -} - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Pair.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Pair.pde deleted file mode 100644 index 780a8e316..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Pair.pde +++ /dev/null @@ -1,47 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Series of Particles connected with distance joints - -class Pair { - - Particle p1; - Particle p2; - - float len; - // Chain constructor - Pair(float x, float y) { - len = 32; - - p1 = new Particle(x,y); - p2 = new Particle(x+random(-1,1),y+random(-1,1)); - - DistanceJointDef djd = new DistanceJointDef(); - // Connection between previous particle and this one - djd.bodyA = p1.body; - djd.bodyB = p2.body; - // Equilibrium length - djd.length = box2d.scalarPixelsToWorld(len); - - // These properties affect how springy the joint is - djd.frequencyHz = 3; // Try a value less than 5 (0 for no elasticity) - djd.dampingRatio = 0.1; // Ranges between 0 and 1 (1 for no springiness) - - // Make the joint. Note we aren't storing a reference to the joint ourselves anywhere! - // We might need to someday, but for now it's ok - DistanceJoint dj = (DistanceJoint) box2d.world.createJoint(djd); - } - - void display() { - Vec2 pos1 = box2d.getBodyPixelCoord(p1.body); - Vec2 pos2 = box2d.getBodyPixelCoord(p2.body); - stroke(0); - strokeWeight(2); - line(pos1.x,pos1.y,pos2.x,pos2.y); - - p1.display(); - p2.display(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Particle.pde deleted file mode 100644 index ed3d34199..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_6_DistanceJoint/Particle.pde +++ /dev/null @@ -1,76 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y) { - r = 8; - - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x,y); - bd.type = BodyType.DYNAMIC; - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(127); - stroke(0); - strokeWeight(2); - ellipse(0,0,r*2,r*2); - // Let's add a line so we can see the rotation - line(0,0,r,0); - popMatrix(); - } - - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Box.pde deleted file mode 100644 index acf4abdec..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Box.pde +++ /dev/null @@ -1,72 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x, float y, float w_, float h_, boolean lock) { - w = w_; - h = h_; - - // Define and create the body - BodyDef bd = new BodyDef(); - bd.position.set(box2d.coordPixelsToWorld(new Vec2(x,y))); - if (lock) bd.type = BodyType.STATIC; - else bd.type = BodyType.DYNAMIC; - - body = box2d.createBody(bd); - - // Define the shape -- a (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5,5),random(2,5))); - body.setAngularVelocity(random(-5,5)); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - rect(0,0,w,h); - popMatrix(); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/NOC_5_7_RevoluteJoint.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/NOC_5_7_RevoluteJoint.pde deleted file mode 100644 index 74ab0e3f2..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/NOC_5_7_RevoluteJoint.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Example demonstrating revolute joint - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// An object to describe a Windmill (two bodies and one joint) -Windmill windmill; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Make the windmill at an x,y location - windmill = new Windmill(width/2,175); - - // Create the empty list - particles = new ArrayList(); - -} - -// Click the mouse to turn on or off the motor -void mousePressed() { - windmill.toggleMotor(); -} - -void draw() { - background(255); - - if (random(1) < 0.1) { - float sz = random(4,8); - particles.add(new Particle(random(width/2-100,width/2+100),-20,sz)); - } - - - // We must always step through time! - box2d.step(); - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - // Draw the windmill - windmill.display(); - - String status = "OFF"; - if (windmill.motorOn()) status = "ON"; - - fill(0); - text("Click mouse to toggle motor.\nMotor: " + status,10,height-30); - - -} - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Particle.pde deleted file mode 100644 index 89fb8b443..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Particle.pde +++ /dev/null @@ -1,84 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - - rotate(-a); - fill(127); - stroke(0); - strokeWeight(2); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - - body = box2d.world.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - - fd.density = 2.0; - fd.friction = 0.01; - fd.restitution = 0.3; // Restitution is bounciness - - body.createFixture(fd); - - // Give it a random initial velocity (and angular velocity) - //body.setLinearVelocity(new Vec2(random(-10f,10f),random(5f,10f))); - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Windmill.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Windmill.pde deleted file mode 100644 index 5a819a81e..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_7_RevoluteJoint/Windmill.pde +++ /dev/null @@ -1,61 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Class to describe a fixed spinning object - -class Windmill { - - // Our object is two boxes and one joint - // Consider making the fixed box much smaller and not drawing it - RevoluteJoint joint; - Box box1; - Box box2; - - Windmill(float x, float y) { - - // Initialize locations of two boxes - box1 = new Box(x, y-20, 120, 10, false); - box2 = new Box(x, y, 10, 40, true); - - // Define joint as between two bodies - RevoluteJointDef rjd = new RevoluteJointDef(); - - rjd.initialize(box1.body, box2.body, box1.body.getWorldCenter()); - - // Turning on a motor (optional) - rjd.motorSpeed = PI*2; // how fast? - rjd.maxMotorTorque = 1000.0; // how powerful? - rjd.enableMotor = false; // is it on? - - // There are many other properties you can set for a Revolute joint - // For example, you can limit its angle between a minimum and a maximum - // See box2d manual for more - - - // Create the joint - joint = (RevoluteJoint) box2d.world.createJoint(rjd); - } - - // Turn the motor on or off - void toggleMotor() { - joint.enableMotor(!joint.isMotorEnabled()); - } - - boolean motorOn() { - return joint.isMotorEnabled(); - } - - - void display() { - box2.display(); - box1.display(); - - // Draw anchor just for debug - Vec2 anchor = box2d.coordWorldToPixels(box1.body.getWorldCenter()); - fill(0); - noStroke(); - ellipse(anchor.x, anchor.y, 8, 8); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Boundary.pde deleted file mode 100644 index 61491af26..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Boundary.pde +++ /dev/null @@ -1,62 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class (now incorporates angle) - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_, float a) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.angle = a; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - noFill(); - stroke(127); - fill(127); - strokeWeight(1); - rectMode(CENTER); - - float a = b.getAngle(); - - pushMatrix(); - translate(x,y); - rotate(-a); - rect(0,0,w,h); - popMatrix(); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Box.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Box.pde deleted file mode 100644 index db935b7a4..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Box.pde +++ /dev/null @@ -1,88 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A rectangular box - -class Box { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - // Constructor - Box(float x_, float y_) { - float x = x_; - float y = y_; - w = 24; - h = 24; - // Add the box to the box2d world - makeBody(new Vec2(x,y),w,h); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - boolean contains(float x, float y) { - Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); - Fixture f = body.getFixtureList(); - boolean inside = f.testPoint(worldPoint); - return inside; - } - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(PConstants.CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(a); - fill(127); - stroke(0); - strokeWeight(2); - rect(0,0,w,h); - popMatrix(); - } - - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_) { - // Define and create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - body = box2d.createBody(bd); - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - body.createFixture(fd); - //body.setMassFromShapes(); - - // Give it some initial random velocity - body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); - body.setAngularVelocity(random(-5, 5)); - } - -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/NOC_5_8_MouseJoint.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/NOC_5_8_MouseJoint.pde deleted file mode 100644 index 0d77536d6..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/NOC_5_8_MouseJoint.pde +++ /dev/null @@ -1,83 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with the mouse (by attaching a spring) - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -// A list we'll use to track fixed objects -ArrayList boundaries; - -// Just a single box this time -Box box; - -// The Spring that will attach to the box from the mouse -Spring spring; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Make the box - box = new Box(width/2,height/2); - - // Make the spring (it doesn't really get initialized until the mouse is clicked) - spring = new Spring(); - - // Add a bunch of fixed boundaries - boundaries = new ArrayList(); - boundaries.add(new Boundary(width/2,height-5,width,10,0)); - boundaries.add(new Boundary(width/2,5,width,10,0)); - boundaries.add(new Boundary(width-5,height/2,10,height,0)); - boundaries.add(new Boundary(5,height/2,10,height,0)); -} - -// When the mouse is released we're done with the spring -void mouseReleased() { - spring.destroy(); -} - -// When the mouse is pressed we. . . -void mousePressed() { - // Check to see if the mouse was clicked on the box - if (box.contains(mouseX, mouseY)) { - // And if so, bind the mouse location to the box with a spring - spring.bind(mouseX,mouseY,box); - } -} - -void draw() { - background(255); - - // We must always step through time! - box2d.step(); - - // Always alert the spring to the new mouse location - spring.update(mouseX,mouseY); - - // Draw the boundaries - for (int i = 0; i < boundaries.size(); i++) { - Boundary wall = (Boundary) boundaries.get(i); - wall.display(); - } - - // Draw the box - box.display(); - // Draw the spring (it only appears when active) - spring.display(); -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Spring.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Spring.pde deleted file mode 100644 index 4daa97765..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_8_MouseJoint/Spring.pde +++ /dev/null @@ -1,77 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Class to describe the spring joint (displayed as a line) - -class Spring { - - // This is the box2d object we need to create - MouseJoint mouseJoint; - - Spring() { - // At first it doesn't exist - mouseJoint = null; - } - - // If it exists we set its target to the mouse location - void update(float x, float y) { - if (mouseJoint != null) { - // Always convert to world coordinates! - Vec2 mouseWorld = box2d.coordPixelsToWorld(x,y); - mouseJoint.setTarget(mouseWorld); - } - } - - void display() { - if (mouseJoint != null) { - // We can get the two anchor points - Vec2 v1 = new Vec2(0,0); - mouseJoint.getAnchorA(v1); - Vec2 v2 = new Vec2(0,0); - mouseJoint.getAnchorB(v2); - // Convert them to screen coordinates - v1 = box2d.coordWorldToPixels(v1); - v2 = box2d.coordWorldToPixels(v2); - // And just draw a line - stroke(0); - strokeWeight(1); - line(v1.x,v1.y,v2.x,v2.y); - } - } - - - // This is the key function where - // we attach the spring to an x,y location - // and the Box object's location - void bind(float x, float y, Box box) { - // Define the joint - MouseJointDef md = new MouseJointDef(); - // Body A is just a fake ground body for simplicity (there isn't anything at the mouse) - md.bodyA = box2d.getGroundBody(); - // Body 2 is the box's boxy - md.bodyB = box.body; - // Get the mouse location in world coordinates - Vec2 mp = box2d.coordPixelsToWorld(x,y); - // And that's the target - md.target.set(mp); - // Some stuff about how strong and bouncy the spring should be - md.maxForce = 1000.0 * box.body.m_mass; - md.frequencyHz = 5.0; - md.dampingRatio = 0.9; - - // Make the joint! - mouseJoint = (MouseJoint) box2d.world.createJoint(md); - } - - void destroy() { - // We can get rid of the joint when the mouse is released - if (mouseJoint != null) { - box2d.world.destroyJoint(mouseJoint); - mouseJoint = null; - } - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Boundary.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Boundary.pde deleted file mode 100644 index ff6226252..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Boundary.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A fixed boundary class - -class Boundary { - - // A boundary is a simple rectangle with x,y,width,and height - float x; - float y; - float w; - float h; - - // But we also have to make a body for box2d to know about it - Body b; - - Boundary(float x_,float y_, float w_, float h_) { - x = x_; - y = y_; - w = w_; - h = h_; - - // Define the polygon - PolygonShape sd = new PolygonShape(); - // Figure out the box2d coordinates - float box2dW = box2d.scalarPixelsToWorld(w/2); - float box2dH = box2d.scalarPixelsToWorld(h/2); - // We're just a box - sd.setAsBox(box2dW, box2dH); - - - // Create the body - BodyDef bd = new BodyDef(); - bd.type = BodyType.STATIC; - bd.position.set(box2d.coordPixelsToWorld(x,y)); - b = box2d.createBody(bd); - - // Attached the shape to the body using a Fixture - b.createFixture(sd,1); - - b.setUserData(this); - } - - // Draw the boundary, if it were at an angle we'd have to do something fancier - void display() { - fill(0); - stroke(0); - rectMode(CENTER); - rect(x,y,w,h); - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/NOC_5_9_CollisionListening.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/NOC_5_9_CollisionListening.pde deleted file mode 100644 index c4b1688c7..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/NOC_5_9_CollisionListening.pde +++ /dev/null @@ -1,108 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Basic example of controlling an object with our own motion (by attaching a MouseJoint) -// Also demonstrates how to know which object was hit - -import pbox2d.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.joints.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.collision.shapes.Shape; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; -import org.jbox2d.dynamics.contacts.*; - -// A reference to our box2d world -PBox2D box2d; - -// An ArrayList of particles that will fall on the surface -ArrayList particles; - -Boundary wall; - -void setup() { - size(640, 360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - - // Turn on collision listening! - box2d.listenForCollisions(); - - // Create the empty list - particles = new ArrayList(); - - wall = new Boundary(width/2, height-5, width, 10); -} - -void draw() { - background(255); - - if (random(1) < 0.1) { - float sz = random(4, 8); - particles.add(new Particle(random(width), 20, sz)); - } - - - // We must always step through time! - box2d.step(); - - // Look at all particles - for (int i = particles.size()-1; i >= 0; i--) { - Particle p = particles.get(i); - p.display(); - // Particles that leave the screen, we delete them - // (note they have to be deleted from both the box2d world and our list - if (p.done()) { - particles.remove(i); - } - } - - wall.display(); -} - - -// Collision event functions! -void beginContact(Contact cp) { - // Get both fixtures - Fixture f1 = cp.getFixtureA(); - Fixture f2 = cp.getFixtureB(); - // Get both bodies - Body b1 = f1.getBody(); - Body b2 = f2.getBody(); - - // Get our objects that reference these bodies - Object o1 = b1.getUserData(); - Object o2 = b2.getUserData(); - - if (o1.getClass() == Particle.class && o2.getClass() == Particle.class) { - Particle p1 = (Particle) o1; - p1.change(); - Particle p2 = (Particle) o2; - p2.change(); - } - -} - -// Objects stop touching each other -void endContact(Contact cp) { -} - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Particle.pde deleted file mode 100644 index 6d3bf38d5..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/NOC_5_9_CollisionListening/Particle.pde +++ /dev/null @@ -1,90 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A circular particle - -class Particle { - - // We need to keep track of a Body and a radius - Body body; - float r; - - color col; - - Particle(float x, float y, float r_) { - r = r_; - // This function puts the particle in the Box2d world - makeBody(x, y, r); - body.setUserData(this); - col = color(127); - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - // Change color when hit - void change() { - col = color(255, 0, 0); - } - - // Is the particle ready for deletion? - boolean done() { - // Let's find the screen position of the particle - Vec2 pos = box2d.getBodyPixelCoord(body); - // Is it off the bottom of the screen? - if (pos.y > height+r*2) { - killBody(); - return true; - } - return false; - } - - - // - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - // Get its angle of rotation - float a = body.getAngle(); - pushMatrix(); - translate(pos.x, pos.y); - rotate(a); - fill(col); - stroke(0); - strokeWeight(2); - ellipse(0, 0, r*2, r*2); - // Let's add a line so we can see the rotation - line(0, 0, r, 0); - popMatrix(); - } - - // Here's our function that adds the particle to the Box2D world - void makeBody(float x, float y, float r) { - // Define a body - BodyDef bd = new BodyDef(); - // Set its position - bd.position = box2d.coordPixelsToWorld(x, y); - bd.type = BodyType.DYNAMIC; - body = box2d.createBody(bd); - - // Make the body's shape a circle - CircleShape cs = new CircleShape(); - cs.m_radius = box2d.scalarPixelsToWorld(r); - - FixtureDef fd = new FixtureDef(); - fd.shape = cs; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.01; - fd.restitution = 0.3; - - // Attach fixture to body - body.createFixture(fd); - - body.setAngularVelocity(random(-10, 10)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/VectorStuff/VectorStuff.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/VectorStuff/VectorStuff.pde deleted file mode 100644 index 49345575d..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/box2d/VectorStuff/VectorStuff.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Just demo-ing the basics of Vec2 vs. PVector - -import org.jbox2d.common.*; - -void setup() { - size(400,300); -// PVector a = new PVector(1,-1); -// PVector b = new PVector(3,4); -// a.add(b); -// -// PVector a = new PVector(1,-1); -// PVector b = new PVector(3,4); -// PVector c = PVector.add(a,b); -// -// Vec2 a = new Vec2(1,-1); -// Vec2 b = new Vec2(3,4); -// a.addLocal(b); -// -// Vec2 a = new Vec2(1,-1); -// Vec2 b = new Vec2(3,4); -// Vec2 c = a.add(b); -// -// PVector a = new PVector(1,-1); -// float n = 5; -// a.mult(n); -// -// PVector a = new PVector(1,-1); -// float n = 5; -// PVector c = PVector.mult(a,n); -// -// Vec2 a = new Vec2(1,-1); -// float n = 5; -// a.mulLocal(n); -// -// Vec2 a = new Vec2(1,-1); -// float n = 5; -// Vec2 c = a.mul(n); -// -// PVector a = new PVector(1,-1); -// float m = a.mag(); -// a.normalize(); - - Vec2 a = new Vec2(1,-1); - float m = a.length(); - a.normalize(); - println(a.x + "," + a.y); -} - -void draw() { - noLoop(); -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/readme.txt b/java/examples/Books/Nature of Code/chp5_physicslibraries/readme.txt deleted file mode 100644 index 99d3a27ad..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -For the box2d examples you will need PBox2D! - -https://github.com/shiffman/PBox2D \ No newline at end of file diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Blanket.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Blanket.pde deleted file mode 100644 index 1efcdb2ef..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Blanket.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Blanket { - ArrayList particles; - ArrayList springs; - - Blanket() { - particles = new ArrayList(); - springs = new ArrayList(); - - int w = 20; - int h = 20; - - float len = 10; - float strength = 0.125; - - for(int y=0; y< h; y++) { - for(int x=0; x < w; x++) { - - Particle p = new Particle(new Vec2D(width/2+x*len-w*len/2,y*len)); - physics.addParticle(p); - particles.add(p); - - if (x > 0) { - Particle previous = particles.get(particles.size()-2); - Connection c = new Connection(p,previous,len,strength); - physics.addSpring(c); - springs.add(c); - } - - if (y > 0) { - Particle above = particles.get(particles.size()-w-1); - Connection c=new Connection(p,above,len,strength); - physics.addSpring(c); - springs.add(c); - } - } - } - - Particle topleft= particles.get(0); - topleft.lock(); - - Particle topright = particles.get(w-1); - topright.lock(); - } - - void display() { - for (Connection c : springs) { - c.display(); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Connection.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Connection.pde deleted file mode 100644 index bbbe2655c..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Connection.pde +++ /dev/null @@ -1,15 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Connection extends VerletSpring2D { - Connection(Particle p1, Particle p2, float len, float strength) { - super(p1,p2,len,strength); - } - - void display() { - stroke(0); - line(a.x,a.y,b.x,b.y); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Exercise_5_13_SoftBodySquareAdapted.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Exercise_5_13_SoftBodySquareAdapted.pde deleted file mode 100644 index cf2b469c7..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Exercise_5_13_SoftBodySquareAdapted.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -/** - * This example is adapted from Karsten Schmidt's SoftBodySquare example - */ - -/*

Softbody square demo is showing how to create a 2D square mesh out of - * verlet particles and make it stable enough to avoid total structural - * deformation by including an inner skeleton.

- * - *

Usage: move mouse to drag/deform the square

- */ - -/* - * Copyright (c) 2008-2009 Karsten Schmidt - * - * This demo & library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * http://creativecommons.org/licenses/LGPL/2.1/ - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -import toxi.physics2d.behaviors.*; -import toxi.physics2d.*; - -import toxi.geom.*; -import toxi.math.*; - -VerletPhysics2D physics; - -Blanket b; - - -void setup() { - size(640,360); - physics=new VerletPhysics2D(); - physics.addBehavior(new GravityBehavior(new Vec2D(0,0.1))); - - b = new Blanket(); -} - -void draw() { - - background(255); - - physics.update(); - - b.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Particle.pde deleted file mode 100644 index c4fef5474..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_13_SoftBodySquareAdapted/Particle.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Notice how we are using inheritance here! -// We could have just stored a reference to a VerletParticle object -// inside the Particle class, but inheritance is a nice alternative - -class Particle extends VerletParticle2D { - - Particle(Vec2D loc) { - super(loc); - } - - // All we're doing really is adding a display() function to a VerletParticle - void display() { - fill(175); - stroke(0); - ellipse(x,y,16,16); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Cluster.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Cluster.pde deleted file mode 100644 index db0cfe2c2..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Cluster.pde +++ /dev/null @@ -1,98 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Force directed graph -// Heavily based on: http://code.google.com/p/fidgen/ - -class Cluster { - - // A cluster is a grouping of nodes - ArrayList nodes; - - float diameter; - - // We initialize a Cluster with a number of nodes, a diameter, and centerpoint - Cluster(int n, float d, Vec2D center) { - - // Initialize the ArrayList - nodes = new ArrayList(); - - // Set the diameter - diameter = d; - - // Create the nodes - for (int i = 0; i < n; i++) { - // We can't put them right on top of each other - nodes.add(new Node(center.add(Vec2D.randomVector()))); - } - - // Connect all the nodes with a Spring - for (int i = 1; i < nodes.size(); i++) { - VerletParticle2D pi = (VerletParticle2D) nodes.get(i); - for (int j = 0; j < i; j++) { - VerletParticle2D pj = (VerletParticle2D) nodes.get(j); - // A Spring needs two particles, a resting length, and a strength - physics.addSpring(new VerletSpring2D(pi,pj,diameter,0.01)); - } - } - } - - void display() { - // Show all the nodes - for (int i = 0; i < nodes.size(); i++) { - Node n = (Node) nodes.get(i); - n.display(); - } - } - - // This functons connects one cluster to another - // Each point of one cluster connects to each point of the other cluster - // The connection is a "VerletMinDistanceSpring" - // A VerletMinDistanceSpring is a string which only enforces its rest length if the - // current distance is less than its rest length. This is handy if you just want to - // ensure objects are at least a certain distance from each other, but don't - // care if it's bigger than the enforced minimum. - void connect(Cluster other) { - ArrayList otherNodes = other.getNodes(); - for (int i = 0; i < nodes.size(); i++) { - VerletParticle2D pi = (VerletParticle2D) nodes.get(i); - for (int j = 0; j < otherNodes.size(); j++) { - VerletParticle2D pj = (VerletParticle2D) otherNodes.get(j); - // Create the spring - physics.addSpring(new VerletMinDistanceSpring2D(pi,pj,(diameter+other.diameter)*0.5,0.05)); - } - } - } - - - // Draw all the internal connections - void showConnections() { - stroke(0,150); - for (int i = 0; i < nodes.size(); i++) { - VerletParticle2D pi = (VerletParticle2D) nodes.get(i); - for (int j = i+1; j < nodes.size(); j++) { - VerletParticle2D pj = (VerletParticle2D) nodes.get(j); - line(pi.x,pi.y,pj.x,pj.y); - } - } - } - - // Draw all the connections between this Cluster and another Cluster - void showConnections(Cluster other) { - stroke(0,50); - strokeWeight(2); - ArrayList otherNodes = other.getNodes(); - for (int i = 0; i < nodes.size(); i++) { - VerletParticle2D pi = (VerletParticle2D) nodes.get(i); - for (int j = 0; j < otherNodes.size(); j++) { - VerletParticle2D pj = (VerletParticle2D) otherNodes.get(j); - line(pi.x,pi.y,pj.x,pj.y); - } - } - } - - ArrayList getNodes() { - return nodes; - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Exercise_5_15_ForceDirectedGraph.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Exercise_5_15_ForceDirectedGraph.pde deleted file mode 100644 index f3dd8e190..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Exercise_5_15_ForceDirectedGraph.pde +++ /dev/null @@ -1,133 +0,0 @@ -/** - *

Force directed graph, - * heavily based on: fid.gen
- * The Nature of Code
- * Spring 2010

- */ - -/* - * Copyright (c) 2010 Daniel Shiffman - * - * This demo & library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * http://creativecommons.org/licenses/LGPL/2.1/ - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -import toxi.geom.*; -import toxi.physics2d.*; -import toxi.physics2d.behaviors.*; - -// Reference to physics world -VerletPhysics2D physics; - -// A list of cluster objects -ArrayList clusters; - -// Boolean that indicates whether we draw connections or not -boolean showPhysics = true; -boolean showParticles = true; - -// Font -PFont f; - -void setup() { - size(640,360); - f = createFont("Georgia",12,true); - - // Initialize the physics - physics=new VerletPhysics2D(); - physics.setWorldBounds(new Rect(10,10,width-20,height-20)); - - // Spawn a new random graph - newGraph(); - -} - -// Spawn a new random graph -void newGraph() { - - // Clear physics - physics.clear(); - - // Create new ArrayList (clears old one) - clusters = new ArrayList(); - - // Create 8 random clusters - for (int i = 0; i < 8; i++) { - Vec2D center = new Vec2D(width/2,height/2); - clusters.add(new Cluster((int) random(3,8),random(20,100),center)); - } - - // All clusters connect to all clusters - for (int i = 0; i < clusters.size(); i++) { - for (int j = i+1; j < clusters.size(); j++) { - Cluster ci = (Cluster) clusters.get(i); - Cluster cj = (Cluster) clusters.get(j); - ci.connect(cj); - } - } - -} - -void draw() { - - // Update the physics world - physics.update(); - - background(255); - - // Display all points - if (showParticles) { - for (int i = 0; i < clusters.size(); i++) { - Cluster c = (Cluster) clusters.get(i); - c.display(); - } - } - - // If we want to see the physics - if (showPhysics) { - for (int i = 0; i < clusters.size(); i++) { - // Cluster internal connections - Cluster ci = (Cluster) clusters.get(i); - ci.showConnections(); - - // Cluster connections to other clusters - for (int j = i+1; j < clusters.size(); j++) { - Cluster cj = (Cluster) clusters.get(j); - ci.showConnections(cj); - } - } - } - - // Instructions - fill(0); - textFont(f); - text("'p' to display or hide particles\n'c' to display or hide connections\n'n' for new graph",10,20); -} - -// Key press commands -void keyPressed() { - if (key == 'c') { - showPhysics = !showPhysics; - if (!showPhysics) showParticles = true; - } - else if (key == 'p') { - showParticles = !showParticles; - if (!showParticles) showPhysics = true; - } - else if (key == 'n') { - newGraph(); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Node.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Node.pde deleted file mode 100644 index 54dc835b4..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/Exercise_5_15_ForceDirectedGraph/Node.pde +++ /dev/null @@ -1,26 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Force directed graph -// Heavily based on: http://code.google.com/p/fidgen/ - -// Notice how we are using inheritance here! -// We could have just stored a reference to a VerletParticle object -// inside the Node class, but inheritance is a nice alternative - -class Node extends VerletParticle2D { - - Node(Vec2D pos) { - super(pos); - } - - // All we're doing really is adding a display() function to a VerletParticle - void display() { - fill(0,150); - stroke(0); - strokeWeight(2); - ellipse(x,y,16,16); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/NOC_5_10_SimpleSpring.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/NOC_5_10_SimpleSpring.pde deleted file mode 100644 index eeaaf48e0..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/NOC_5_10_SimpleSpring.pde +++ /dev/null @@ -1,68 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Toxiclibs Spring - -import toxi.physics2d.*; -import toxi.physics2d.behaviors.*; -import toxi.geom.*; - -// Reference to physics world -VerletPhysics2D physics; - -Particle p1; -Particle p2; - -void setup() { - size(640,360); - - // Initialize the physics - physics=new VerletPhysics2D(); - physics.addBehavior(new GravityBehavior(new Vec2D(0,0.5))); - - // Set the world's bounding box - physics.setWorldBounds(new Rect(0,0,width,height)); - - // Make two particles - p1 = new Particle(new Vec2D(width/2,20)); - p2 = new Particle(new Vec2D(width/2+160,20)); - // Lock one in place - p1.lock(); - - // Make a spring connecting both Particles - VerletSpring2D spring=new VerletSpring2D(p1,p2,160,0.01); - - // Anything we make, we have to add into the physics world - physics.addParticle(p1); - physics.addParticle(p2); - physics.addSpring(spring); -} - -void draw() { - - // Update the physics world - physics.update(); - - background(255); - - // Draw a line between the particles - stroke(0); - strokeWeight(2); - line(p1.x,p1.y,p2.x,p2.y); - - // Display the particles - p1.display(); - p2.display(); - - // Move the second one according to the mouse - if (mousePressed) { - p2.lock(); - p2.x = mouseX; - p2.y = mouseY; - p2.unlock(); - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/Particle.pde deleted file mode 100644 index 06bb533dc..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_10_SimpleSpring/Particle.pde +++ /dev/null @@ -1,22 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Notice how we are using inheritance here! - -// We could have just stored a reference to a VerletParticle object -// inside the Particle class, but inheritance is a nice alternative - -class Particle extends VerletParticle2D { - - Particle(Vec2D loc) { - super(loc); - } - - // All we're doing really is adding a display() function to a VerletParticle - void display() { - fill(127); - stroke(0); - strokeWeight(2); - ellipse(x,y,32,32); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Chain.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Chain.pde deleted file mode 100644 index 91b68c9b6..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Chain.pde +++ /dev/null @@ -1,103 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A soft pendulum (series of connected springs) - -class Chain { - - // Chain properties - float totalLength; // How long - int numPoints; // How many points - float strength; // Strength of springs - float radius; // Radius of ball at tail - - // This list is redundant since we can ask for physics.particles, but in case we have many of these - // it's a convenient to keep track of our own list - ArrayList particles; - - // Let's keep an extra reference to the tail particle - // This is just the last particle in the ArrayList - Particle tail; - - // Some variables for mouse dragging - PVector offset = new PVector(); - boolean dragged = false; - - // Chain constructor - Chain(float l, int n, float r, float s) { - particles = new ArrayList(); - - totalLength = l; - numPoints = n; - radius = r; - strength = s; - - float len = totalLength / numPoints; - - // Here is the real work, go through and add particles to the chain itself - for(int i=0; i < numPoints; i++) { - // Make a new particle with an initial starting location - Particle particle=new Particle(width/2,i*len); - - // Redundancy, we put the particles both in physics and in our own ArrayList - physics.addParticle(particle); - particles.add(particle); - - // Connect the particles with a Spring (except for the head) - if (i != 0) { - Particle previous = particles.get(i-1); - VerletSpring2D spring = new VerletSpring2D(particle,previous,len,strength); - // Add the spring to the physics world - physics.addSpring(spring); - } - } - - // Keep the top fixed - Particle head=particles.get(0); - head.lock(); - - // Store reference to the tail - tail = particles.get(numPoints-1); - tail.radius = radius; - } - - // Check if a point is within the ball at the end of the chain - // If so, set dragged = true; - void contains(int x, int y) { - float d = dist(x,y,tail.x,tail.y); - if (d < radius) { - offset.x = tail.x - x; - offset.y = tail.y - y; - tail.lock(); - dragged = true; - } - } - - // Release the ball - void release() { - tail.unlock(); - dragged = false; - } - - // Update tail location if being dragged - void updateTail(int x, int y) { - if (dragged) { - tail.set(x+offset.x,y+offset.y); - } - } - - // Draw the chain - void display() { - // Draw line connecting all points - beginShape(); - stroke(0); - strokeWeight(2); - noFill(); - for (Particle p : particles) { - vertex(p.x,p.y); - } - endShape(); - tail.display(); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/NOC_5_11_SoftStringPendulum.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/NOC_5_11_SoftStringPendulum.pde deleted file mode 100644 index 1e9b6aa25..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/NOC_5_11_SoftStringPendulum.pde +++ /dev/null @@ -1,68 +0,0 @@ -/** - *

A soft pendulum (series of connected springs)
- * The Nature of Code
- * Spring 2010

- */ - -/* - * Copyright (c) 2010 Daniel Shiffman - * - * This demo & library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * http://creativecommons.org/licenses/LGPL/2.1/ - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -import toxi.physics2d.*; -import toxi.physics2d.behaviors.*; -import toxi.geom.*; - -// Reference to physics "world" (2D) -VerletPhysics2D physics; - -// Our "Chain" object -Chain chain; - -void setup() { - size(640, 360); - // Initialize the physics world - physics=new VerletPhysics2D(); - physics.addBehavior(new GravityBehavior(new Vec2D(0, 0.1))); - physics.setWorldBounds(new Rect(0, 0, width, height)); - - // Initialize the chain - chain = new Chain(180, 20, 16, 0.2); -} - -void draw() { - background(255); - - // Update physics - physics.update(); - // Update chain's tail according to mouse location - chain.updateTail(mouseX, mouseY); - // Display chain - chain.display(); -} - -void mousePressed() { - // Check to see if we're grabbing the chain - chain.contains(mouseX, mouseY); -} - -void mouseReleased() { - // Release the chain - chain.release(); -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Particle.pde deleted file mode 100644 index 99ca7dac3..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_11_SoftStringPendulum/Particle.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Notice how we are using inheritance here! -// We could have just stored a reference to a VerletParticle object -// inside the Particle class, but inheritance is a nice alternative - -class Particle extends VerletParticle2D { - - float radius = 4; // Adding a radius for each particle - - Particle(float x, float y) { - super(x,y); - } - - // All we're doing really is adding a display() function to a VerletParticle - void display() { - fill(127); - stroke(0); - strokeWeight(2); - ellipse(x,y,radius*2,radius*2); - } -} diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Cluster.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Cluster.pde deleted file mode 100644 index 241520f2b..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Cluster.pde +++ /dev/null @@ -1,64 +0,0 @@ -// The Nature of Code -// -// Spring 2010 -// Toxiclibs example: http://toxiclibs.org/ - -// Force directed graph -// Heavily based on: http://code.google.com/p/fidgen/ - -class Cluster { - - // A cluster is a grouping of nodes - ArrayList nodes; - - float diameter; - - // We initialize a Cluster with a number of nodes, a diameter, and centerpoint - Cluster(int n, float d, Vec2D center) { - - // Initialize the ArrayList - nodes = new ArrayList(); - - // Set the diameter - diameter = d; - - // Create the nodes - for (int i = 0; i < n; i++) { - // We can't put them right on top of each other - nodes.add(new Node(center.add(Vec2D.randomVector()))); - } - - // Connect all the nodes with a Spring - for (int i = 0; i < nodes.size()-1; i++) { - VerletParticle2D ni = nodes.get(i); - for (int j = i+1; j < nodes.size(); j++) { - VerletParticle2D nj = nodes.get(j); - // A Spring needs two particles, a resting length, and a strength - physics.addSpring(new VerletSpring2D(ni, nj, diameter, 0.01)); - } - } - } - - void display() { - // Show all the nodes - for (Node n : nodes) { - n.display(); - } - } - - - // Draw all the internal connections - void showConnections() { - stroke(0, 150); - strokeWeight(2); - for (int i = 0; i < nodes.size()-1; i++) { - VerletParticle2D pi = (VerletParticle2D) nodes.get(i); - for (int j = i+1; j < nodes.size(); j++) { - VerletParticle2D pj = (VerletParticle2D) nodes.get(j); - - line(pi.x, pi.y, pj.x, pj.y); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/NOC_5_12_SimpleCluster.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/NOC_5_12_SimpleCluster.pde deleted file mode 100644 index 043803d67..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/NOC_5_12_SimpleCluster.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Force directed graph, -// heavily based on: http://code.google.com/p/fidgen/ - -import toxi.geom.*; -import toxi.physics2d.*; - -// Reference to physics world -VerletPhysics2D physics; - -// A list of cluster objects -Cluster cluster; - -// Boolean that indicates whether we draw connections or not -boolean showPhysics = true; -boolean showParticles = true; - -// Font -PFont f; - -void setup() { - size(640, 360); - f = createFont("Georgia", 12, true); - - // Initialize the physics - physics=new VerletPhysics2D(); - physics.setWorldBounds(new Rect(10, 10, width-20, height-20)); - - // Spawn a new random graph - cluster = new Cluster(8, 100, new Vec2D(width/2, height/2)); -} - -void draw() { - - // Update the physics world - physics.update(); - - background(255); - - // Display all points - if (showParticles) { - cluster.display(); - } - - // If we want to see the physics - if (showPhysics) { - cluster.showConnections(); - } - - // Instructions - fill(0); - textFont(f); - text("'p' to display or hide particles\n'c' to display or hide connections\n'n' for new graph",10,20); -} - -// Key press commands -void keyPressed() { - if (key == 'c') { - showPhysics = !showPhysics; - if (!showPhysics) showParticles = true; - } - else if (key == 'p') { - showParticles = !showParticles; - if (!showParticles) showPhysics = true; - } - else if (key == 'n') { - physics.clear(); - cluster = new Cluster(int(random(2, 20)), random(10, width/2), new Vec2D(width/2, height/2)); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Node.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Node.pde deleted file mode 100644 index 6fe3b5144..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_12_SimpleCluster/Node.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// -// Spring 2010 -// Toxiclibs example: http://toxiclibs.org/ - -// Force directed graph -// Heavily based on: http://code.google.com/p/fidgen/ - -// Notice how we are using inheritance here! -// We could have just stored a reference to a VerletParticle object -// inside the Node class, but inheritance is a nice alternative - -class Node extends VerletParticle2D { - - Node(Vec2D pos) { - super(pos); - } - - // All we're doing really is adding a display() function to a VerletParticle - void display() { - fill(0,150); - stroke(0); - strokeWeight(2); - ellipse(x,y,16,16); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Attractor.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Attractor.pde deleted file mode 100644 index 69e7ecb1d..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Attractor.pde +++ /dev/null @@ -1,21 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Attractor extends VerletParticle2D { - - float r; - - Attractor (Vec2D loc) { - super (loc); - r = 24; - physics.addParticle(this); - physics.addBehavior(new AttractionBehavior(this, width, 0.1)); - } - - void display () { - fill(0); - ellipse (x, y, r*2, r*2); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/NOC_5_13_AttractRepel.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/NOC_5_13_AttractRepel.pde deleted file mode 100644 index 4359d202c..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/NOC_5_13_AttractRepel.pde +++ /dev/null @@ -1,40 +0,0 @@ -import toxi.geom.*; -import toxi.physics2d.*; -import toxi.physics2d.behaviors.*; - -ArrayList particles; -Attractor attractor; - -VerletPhysics2D physics; - -void setup () { - size (640, 360); - physics = new VerletPhysics2D (); - physics.setDrag (0.01); - - particles = new ArrayList(); - for (int i = 0; i < 50; i++) { - particles.add(new Particle(new Vec2D(random(width),random(height)))); - } - - attractor = new Attractor(new Vec2D(width/2,height/2)); -} - - -void draw () { - background (255); - physics.update (); - - attractor.display(); - for (Particle p: particles) { - p.display(); - } - - if (mousePressed) { - attractor.lock(); - attractor.set(mouseX,mouseY); - } else { - attractor.unlock(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Particle.pde b/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Particle.pde deleted file mode 100644 index 8096405d4..000000000 --- a/java/examples/Books/Nature of Code/chp5_physicslibraries/toxiclibs/NOC_5_13_AttractRepel/Particle.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// class Spore extends the class "VerletParticle2D" -class Particle extends VerletParticle2D { - - float r; - - Particle (Vec2D loc) { - super(loc); - r = 8; - physics.addParticle(this); - physics.addBehavior(new AttractionBehavior(this, r*4, -1)); - } - - void display () { - fill (127); - stroke (0); - strokeWeight(2); - ellipse (x, y, r*2, r*2); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Alignment/Alignment.pde b/java/examples/Books/Nature of Code/chp6_agents/Alignment/Alignment.pde deleted file mode 100644 index 09404bbe5..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Alignment/Alignment.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Separation -// Via Reynolds: http://www.red3d.com/cwr/steer/ - -// A list of vehicles -ArrayList vehicles; - -void setup() { - size(640,360); - // We are now making random vehicles and storing them in an ArrayList - vehicles = new ArrayList(); - for (int i = 0; i < 100; i++) { - vehicles.add(new Vehicle(random(width),random(height))); - } -} - -void draw() { - background(255); - - for (Vehicle v : vehicles) { - // Path following and separation are worked on in this function - v.align(vehicles); - // Call the generic run method (update, borders, display, etc.) - v.update(); - v.borders(); - v.display(); - } - - // Instructions - fill(0); - text("Drag the mouse to generate new vehicles.",10,height-16); -} - - -void mouseDragged() { - vehicles.add(new Vehicle(mouseX,mouseY)); -} - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Alignment/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/Alignment/Vehicle.pde deleted file mode 100644 index 43e3f8bbc..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Alignment/Vehicle.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Vehicle class - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle(float x, float y) { - location = new PVector(x, y); - r = 12; - maxspeed = 3; - maxforce = 0.2; - acceleration = new PVector(0, 0); - velocity = PVector.random2D(); - velocity.mult(random(1,4)); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - void align (ArrayList boids) { - float neighbordist = 30; - PVector sum = new PVector(0, 0); - int count = 0; - for (Vehicle other : vehicles) { - float d = PVector.dist(location, other.location); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.velocity); - count++; - } - } - if (count > 0) { - sum.div((float)count); - sum.normalize(); - sum.mult(maxspeed); - PVector steer = PVector.sub(sum, velocity); - steer.limit(maxforce); - applyForce(steer); - } - } - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - ellipse(0, 0, r, r); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Exercise_6_04_Wander.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Exercise_6_04_Wander.pde deleted file mode 100644 index daeda1da7..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Exercise_6_04_Wander.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Demonstration of Craig Reynolds' "Wandering" behavior -// See: http://www.red3d.com/cwr/ - -// Click mouse to turn on and off rendering of the wander circle - -Vehicle wanderer; -boolean debug = true; - -void setup() { - size(640,360); - wanderer = new Vehicle(width/2,height/2); -} - -void draw() { - background(255); - wanderer.wander(); - wanderer.run(); -} - -void mousePressed() { - debug = !debug; -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Vehicle.pde deleted file mode 100644 index fb979e8c5..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_04_Wander/Vehicle.pde +++ /dev/null @@ -1,123 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The "Vehicle" class (for wandering) - -class Vehicle { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float wandertheta; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(float x, float y) { - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - location = new PVector(x,y); - r = 6; - wandertheta = 0; - maxspeed = 2; - maxforce = 0.05; - } - - void run() { - update(); - borders(); - display(); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void wander() { - float wanderR = 25; // Radius for our "wander circle" - float wanderD = 80; // Distance for our "wander circle" - float change = 0.3; - wandertheta += random(-change,change); // Randomly change wander theta - - // Now we have to calculate the new location to steer towards on the wander circle - PVector circleloc = velocity.get(); // Start with velocity - circleloc.normalize(); // Normalize to get heading - circleloc.mult(wanderD); // Multiply by distance - circleloc.add(location); // Make it relative to boid's location - - float h = velocity.heading2D(); // We need to know the heading to offset wandertheta - - PVector circleOffSet = new PVector(wanderR*cos(wandertheta+h),wanderR*sin(wandertheta+h)); - PVector target = PVector.add(circleloc,circleOffSet); - seek(target); - - // Render wandering circle, etc. - if (debug) drawWanderStuff(location,circleloc,target,wanderR); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - - applyForce(steer); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(127); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - -// A method just to draw the circle associated with wandering -void drawWanderStuff(PVector location, PVector circle, PVector target, float rad) { - stroke(0); - noFill(); - ellipseMode(CENTER); - ellipse(circle.x,circle.y,rad*2,rad*2); - ellipse(target.x,target.y,4,4); - line(location.x,location.y,circle.x,circle.y); - line(circle.x,circle.y,target.x,target.y); -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Exercise_6_08_FlowField3DNoise.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Exercise_6_08_FlowField3DNoise.pde deleted file mode 100644 index 88a6b3bf6..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Exercise_6_08_FlowField3DNoise.pde +++ /dev/null @@ -1,52 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following -// Via Reynolds: http://www.red3d.com/cwr/steer/FlowFollow.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = true; - -// Flowfield object -FlowField flowfield; -// An ArrayList of vehicles -ArrayList vehicles; - -void setup() { - size(640, 360); - // Make a new flow field with "resolution" of 16 - flowfield = new FlowField(20); - vehicles = new ArrayList(); - // Make a whole bunch of vehicles with random maxspeed and maxforce values - for (int i = 0; i < 120; i++) { - vehicles.add(new Vehicle(new PVector(random(width), random(height)), random(2, 5), random(0.1, 0.5))); - } -} - -void draw() { - background(255); - flowfield.update(); - - // Display the flowfield in "debug" mode - if (debug) flowfield.display(); - // Tell all the vehicles to follow the flow field - for (Vehicle v : vehicles) { - v.follow(flowfield); - v.run(); - } - - // Instructions - fill(0); - text("Hit space bar to toggle debugging lines.\nClick the mouse to generate a new flow field.",10,height-20); -} - - -void keyPressed() { - if (key == ' ') { - debug = !debug; - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/FlowField.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/FlowField.pde deleted file mode 100644 index f10539eb6..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/FlowField.pde +++ /dev/null @@ -1,81 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class FlowField { - - // A flow field is a two dimensional array of PVectors - PVector[][] field; - int cols, rows; // Columns and Rows - int resolution; // How large is each "cell" of the flow field - - float zoff = 0.0; // 3rd dimension of noise - - FlowField(int r) { - resolution = r; - // Determine the number of columns and rows based on sketch's width and height - cols = width/resolution; - rows = height/resolution; - field = new PVector[cols][rows]; - update(); - } - - void update() { - float xoff = 0; - for (int i = 0; i < cols; i++) { - float yoff = 0; - for (int j = 0; j < rows; j++) { - float theta = map(noise(xoff,yoff,zoff),0,1,0,TWO_PI); - // Make a vector from an angle - field[i][j] = PVector.fromAngle(theta); - yoff += 0.1; - } - xoff += 0.1; - } - // Animate by changing 3rd dimension of noise every frame - zoff += 0.01; - } - - // Draw every vector - void display() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - drawVector(field[i][j],i*resolution,j*resolution,resolution-2); - } - } - - } - - // Renders a vector object 'v' as an arrow and a location 'x,y' - void drawVector(PVector v, float x, float y, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(x,y); - stroke(0,150); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - //line(len,0,len-arrowsize,+arrowsize/2); - //line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); - } - - PVector lookup(PVector lookup) { - int column = int(constrain(lookup.x/resolution,0,cols-1)); - int row = int(constrain(lookup.y/resolution,0,rows-1)); - return field[column][row].get(); - } - - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Vehicle.pde deleted file mode 100644 index 2326a1e7c..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_08_FlowField3DNoise/Vehicle.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class Vehicle { - - // The usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(PVector l, float ms, float mf) { - location = l.get(); - r = 3.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - } - - public void run() { - update(); - borders(); - display(); - } - - - // Implementing Reynolds' flow field following algorithm - // http://www.red3d.com/cwr/steer/FlowFollow.html - void follow(FlowField flow) { - // What is the vector at that spot in the flow field? - PVector desired = flow.lookup(location); - // Scale it up by maxspeed - desired.mult(maxspeed); - // Steering is desired minus velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_09_AngleBetween/Exercise_6_09_AngleBetween.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_09_AngleBetween/Exercise_6_09_AngleBetween.pde deleted file mode 100644 index b5f145f6b..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_09_AngleBetween/Exercise_6_09_AngleBetween.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Angle Between Two Vectors -// Using the dot product to compute the angle between two vectors - -void setup() { - size(640, 360); -} - -void draw() { - background(255); - - // A "vector" (really a point) to store the mouse location and screen center location - PVector mouseLoc = new PVector(mouseX, mouseY); - PVector centerLoc = new PVector(width/2, height/2); - - // Aha, a vector to store the displacement between the mouse and center - PVector v = PVector.sub(mouseLoc, centerLoc); - v.normalize(); - v.mult(75); - - PVector xaxis = new PVector(75, 0); - // Render the vector - drawVector(v, centerLoc, 1.0); - drawVector(xaxis, centerLoc, 1.0); - - - float theta = PVector.angleBetween(v, xaxis); - - fill(0); - text(int(degrees(theta)) + " degrees\n" + theta + " radians", 10, 160); -} - -// Renders a vector object 'v' as an arrow and a location 'loc' -void drawVector(PVector v, PVector loc, float scayl) { - pushMatrix(); - float arrowsize = 6; - // Translate to location to render vector - translate(loc.x, loc.y); - stroke(0); - strokeWeight(2); - // Call vector heading function to get direction (pointing up is a heading of 0) - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow - line(0, 0, len, 0); - line(len, 0, len-arrowsize, +arrowsize/2); - line(len, 0, len-arrowsize, -arrowsize/2); - popMatrix(); -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Exercise_6_13_CrowdPathFollowing.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Exercise_6_13_CrowdPathFollowing.pde deleted file mode 100644 index 43be58653..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Exercise_6_13_CrowdPathFollowing.pde +++ /dev/null @@ -1,77 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Crowd Path Following -// Via Reynolds: http://www.red3d.com/cwr/steer/CrowdPath.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = false; - - -// A path object (series of connected points) -Path path; - -// Two vehicles -ArrayList vehicles; - -void setup() { - size(640,360); - // Call a function to generate new Path object - newPath(); - - // We are now making random vehicles and storing them in an ArrayList - vehicles = new ArrayList(); - for (int i = 0; i < 120; i++) { - newVehicle(random(width),random(height)); - } -} - -void draw() { - background(255); - // Display the path - path.display(); - - for (Vehicle v : vehicles) { - // Path following and separation are worked on in this function - v.applyBehaviors(vehicles,path); - // Call the generic run method (update, borders, display, etc.) - v.run(); - } - - // Instructions - fill(0); - textAlign(CENTER); - text("Hit 'd' to toggle debugging lines.\nClick the mouse to generate new vehicles.",width/2,height-20); -} - -void newPath() { - // A path is a series of connected points - // A more sophisticated path might be a curve - path = new Path(); - float offset = 30; - path.addPoint(offset,offset); - path.addPoint(width-offset,offset); - path.addPoint(width-offset,height-offset); - path.addPoint(width/2,height-offset*3); - path.addPoint(offset,height-offset); -} - -void newVehicle(float x, float y) { - float maxspeed = random(2,4); - float maxforce = 0.3; - vehicles.add(new Vehicle(new PVector(x,y),maxspeed,maxforce)); -} - -void keyPressed() { - if (key == 'd') { - debug = !debug; - } -} - -void mousePressed() { - newVehicle(mouseX,mouseY); -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Path.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Path.pde deleted file mode 100644 index 755be5b1f..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Path.pde +++ /dev/null @@ -1,52 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following - -class Path { - - // A Path is an arraylist of points (PVector objects) - ArrayList points; - // A path has a radius, i.e how far is it ok for the boid to wander off - float radius; - - Path() { - // Arbitrary radius of 20 - radius = 20; - points = new ArrayList(); - } - - // Add a point to the path - void addPoint(float x, float y) { - PVector point = new PVector(x, y); - points.add(point); - } - - // Draw the path - void display() { - strokeJoin(ROUND); - - // Draw thick line for radius - stroke(175); - strokeWeight(radius*2); - noFill(); - beginShape(); - for (PVector v : points) { - vertex(v.x, v.y); - } - endShape(CLOSE); - // Draw thin line for center of path - stroke(0); - strokeWeight(1); - noFill(); - beginShape(); - for (PVector v : points) { - vertex(v.x, v.y); - } - endShape(CLOSE); - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Vehicle.pde deleted file mode 100644 index 14a2947e7..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_13_CrowdPathFollowing/Vehicle.pde +++ /dev/null @@ -1,240 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following -// Vehicle class - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle( PVector l, float ms, float mf) { - location = l.get(); - r = 12; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0, 0); - velocity = new PVector(maxspeed, 0); - } - - // A function to deal with path following and separation - void applyBehaviors(ArrayList vehicles, Path path) { - // Follow path force - PVector f = follow(path); - // Separate from other boids force - PVector s = separate(vehicles); - // Arbitrary weighting - f.mult(3); - s.mult(1); - // Accumulate in acceleration - applyForce(f); - applyForce(s); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - - // Main "run" function - public void run() { - update(); - borders(); - render(); - } - - - // This function implements Craig Reynolds' path following algorithm - // http://www.red3d.com/cwr/steer/PathFollow.html - PVector follow(Path p) { - - // Predict location 25 (arbitrary choice) frames ahead - PVector predict = velocity.get(); - predict.normalize(); - predict.mult(25); - PVector predictLoc = PVector.add(location, predict); - - // Now we must find the normal to the path from the predicted location - // We look at the normal for each line segment and pick out the closest one - PVector normal = null; - PVector target = null; - float worldRecord = 1000000; // Start with a very high worldRecord distance that can easily be beaten - - // Loop through all points of the path - for (int i = 0; i < p.points.size(); i++) { - - // Look at a line segment - PVector a = p.points.get(i); - PVector b = p.points.get((i+1)%p.points.size()); // Note Path has to wraparound - - // Get the normal point to that line - PVector normalPoint = getNormalPoint(predictLoc, a, b); - - // Check if normal is on line segment - PVector dir = PVector.sub(b, a); - // If it's not within the line segment, consider the normal to just be the end of the line segment (point b) - //if (da + db > line.mag()+1) { - if (normalPoint.x < min(a.x,b.x) || normalPoint.x > max(a.x,b.x) || normalPoint.y < min(a.y,b.y) || normalPoint.y > max(a.y,b.y)) { - normalPoint = b.get(); - // If we're at the end we really want the next line segment for looking ahead - a = p.points.get((i+1)%p.points.size()); - b = p.points.get((i+2)%p.points.size()); // Path wraps around - dir = PVector.sub(b, a); - } - - // How far away are we from the path? - float d = PVector.dist(predictLoc, normalPoint); - // Did we beat the worldRecord and find the closest line segment? - if (d < worldRecord) { - worldRecord = d; - normal = normalPoint; - - // Look at the direction of the line segment so we can seek a little bit ahead of the normal - dir.normalize(); - // This is an oversimplification - // Should be based on distance to path & velocity - dir.mult(25); - target = normal.get(); - target.add(dir); - - } - } - - // Draw the debugging stuff - if (debug) { - // Draw predicted future location - stroke(0); - fill(0); - line(location.x, location.y, predictLoc.x, predictLoc.y); - ellipse(predictLoc.x, predictLoc.y, 4, 4); - - // Draw normal location - stroke(0); - fill(0); - ellipse(normal.x, normal.y, 4, 4); - // Draw actual target (red if steering towards it) - line(predictLoc.x, predictLoc.y, target.x, target.y); - if (worldRecord > p.radius) fill(255, 0, 0); - noStroke(); - ellipse(target.x, target.y, 8, 8); - } - - // Only if the distance is greater than the path's radius do we bother to steer - if (worldRecord > p.radius) { - return seek(target); - } - else { - return new PVector(0, 0); - } - } - - - // A function to get the normal point from a point (p) to a line segment (a-b) - // This function could be optimized to make fewer new Vector objects - PVector getNormalPoint(PVector p, PVector a, PVector b) { - // Vector from a to p - PVector ap = PVector.sub(p, a); - // Vector from a to b - PVector ab = PVector.sub(b, a); - ab.normalize(); // Normalize the line - // Project vector "diff" onto line by using the dot product - ab.mult(ap.dot(ab)); - PVector normalPoint = PVector.add(a, ab); - return normalPoint; - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate (ArrayList boids) { - float desiredseparation = r*2; - PVector steer = new PVector(0, 0, 0); - int count = 0; - // For every boid in the system, check if it's too close - for (int i = 0 ; i < boids.size(); i++) { - Vehicle other = (Vehicle) boids.get(i); - float d = PVector.dist(location, other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location, other.location); - diff.normalize(); - diff.div(d); // Weight by distance - steer.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer.div((float)count); - } - - // As long as the vector is greater than 0 - if (steer.mag() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mult(maxspeed); - steer.sub(velocity); - steer.limit(maxforce); - } - return steer; - } - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target, location); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocationity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - - return steer; - } - - - void render() { - // Simpler boid is just a circle - fill(75); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - ellipse(0, 0, r, r); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - //if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - //if (location.y > height+r) location.y = -r; - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Boid.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Boid.pde deleted file mode 100644 index e5ba60546..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Boid.pde +++ /dev/null @@ -1,242 +0,0 @@ -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - - color col; - Boid(float x, float y) { - acceleration = new PVector(0, 0); - velocity = new PVector(random(-1, 1), random(-1, 1)); - location = new PVector(x, y); - r = 5.0; - maxspeed = 3; - maxforce = 0.05; - - col = color(175); - } - - void run(ArrayList boids) { - //flock(boids); - update(); - borders(); - render(); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // We accumulate a new acceleration each time based on three rules - void flock(ArrayList boids) { - PVector sep = separate(boids); // Separation - PVector ali = align(boids); // Alignment - PVector coh = cohesion(boids); // Cohesion - - // Not for every boid yet - // PVector view = view(boids); // view - - // Arbitrarily weight these forces - sep.mult(1.5); - ali.mult(1.0); - coh.mult(1.0); - - // Not for every boid yet - // view.mult(1.0); - - // Add the force vectors to acceleration - applyForce(sep); - applyForce(ali); - applyForce(coh); - - // Not for every boid yet - // applyForce(view); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target, location); // A vector pointing from the location to the target - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - return steer; - } - - void render() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading() + radians(90); - fill(col); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate (ArrayList boids) { - float desiredseparation = 25.0f; - PVector steer = new PVector(0, 0, 0); - int count = 0; - // For every boid in the system, check if it's too close - for (Boid other : boids) { - float d = PVector.dist(location, other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location, other.location); - diff.normalize(); - diff.div(d); // Weight by distance - steer.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer.div((float)count); - } - - // As long as the vector is greater than 0 - if (steer.mag() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mult(maxspeed); - steer.sub(velocity); - steer.limit(maxforce); - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - PVector align (ArrayList boids) { - float neighbordist = 50; - PVector sum = new PVector(0, 0); - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(location, other.location); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.velocity); - count++; - } - } - if (count > 0) { - sum.div((float)count); - sum.normalize(); - sum.mult(maxspeed); - PVector steer = PVector.sub(sum, velocity); - steer.limit(maxforce); - return steer; - } - else { - return new PVector(0, 0); - } - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - PVector cohesion (ArrayList boids) { - float neighbordist = 50; - PVector sum = new PVector(0, 0); // Start with empty vector to accumulate all locations - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(location, other.location); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.location); // Add location - count++; - } - } - if (count > 0) { - sum.div(count); - return seek(sum); // Steer towards the location - } - else { - return new PVector(0, 0); - } - } - - // View - // move laterally away from any boid that blocks the view - // Right now we are just drawing the view and highlighting boids - PVector view (ArrayList boids) { - - // How far can it see? - float sightDistance = 100; - float periphery = PI/4; - - for (Boid other : boids) { - // A vector that points to another boid and that angle - PVector comparison = PVector.sub(other.location, location); - - // How far is it - float d = PVector.dist(location, other.location); - - // What is the angle between the other boid and this one's current direction - float diff = PVector.angleBetween(comparison, velocity); - - // If it's within the periphery and close enough to see it - if (diff < periphery && d > 0 && d < sightDistance) { - // Just change its color - other.highlight(); - } - } - - - // Debug Drawing - float currentHeading = velocity.heading(); - pushMatrix(); - translate(location.x, location.y); - rotate(currentHeading); - fill(0, 100); - arc(0, 0, sightDistance*2, sightDistance*2, -periphery, periphery); - popMatrix(); - - return new PVector(); - } - - void highlight() { - col = color(255, 0, 0); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Exercise_6_17_View.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Exercise_6_17_View.pde deleted file mode 100644 index 8aa3f5011..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Exercise_6_17_View.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Exercise 6.17: Implement Flake's "View" rule - -// This answer doesn't implement the rule, but rather demonstrates how a boid can -// detect what is "in front" of it based on peripheral vision - -Flock flock; - -void setup() { - size(640,360); - flock = new Flock(); - // Add an initial set of boids into the system - for (int i = 0; i < 25; i++) { - Boid b = new Boid(width/2+random(0,75),height/2+random(0,75)); - flock.addBoid(b); - } -} - -void draw() { - background(255); - - flock.run(); -} - -// Add a new boid into the System -void mouseDragged() { - flock.addBoid(new Boid(mouseX,mouseY)); -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Flock.pde b/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Flock.pde deleted file mode 100644 index 6b7b1c9e0..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/Exercise_6_17_View/Flock.pde +++ /dev/null @@ -1,37 +0,0 @@ -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2011 - -// Flock class -// Does very little, simply manages the ArrayList of all the boids - -class Flock { - ArrayList boids; // An ArrayList for all the boids - - Flock() { - boids = new ArrayList(); // Initialize the ArrayList - } - - void run() { - for (Boid b : boids) { - b.col = color(175); - } - - Boid b1 = boids.get(0); - b1.col = color(0, 0, 255); - b1.view(boids); - - for (Boid b : boids) { - b.flock(boids); // Passing the entire list of boids to each boid individually - } - - for (Boid b : boids) { - b.run(boids); // Passing the entire list of boids to each boid individually - } - } - - void addBoid(Boid b) { - boids.add(b); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowField.pde b/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowField.pde deleted file mode 100644 index 370c83f47..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowField.pde +++ /dev/null @@ -1,85 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class FlowField { - - // A flow field is a two dimensional array of PVectors - PVector[][] field; - int cols, rows; // Columns and Rows - int resolution; // How large is each "cell" of the flow field - - FlowField(int r) { - resolution = r; - // Determine the number of columns and rows based on sketch's width and height - cols = width/resolution; - rows = height/resolution; - field = new PVector[cols][rows]; - init(); - } - - void init() { - // Reseed noise so we get a new flow field every time - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - - int x = i*resolution; - int y = j*resolution; - int c = img.pixels[x + y * img.width]; - - // Map brightness to an angle - float theta = 0;//map(brightness(c),0,255,0,PI/2); - // Polar to cartesian coordinate transformation to get x and y components of the vector - field[i][j] = PVector.fromAngle(theta); - - // Map magnitude to an angle (how fast is the desired velocity in the flow field) - float m = map(brightness(c),0,255,0,1); - field[i][j].mult(m); - } - } - } - - // Draw every vector - void display() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - drawVector(field[i][j],i*resolution,j*resolution,resolution-2); - } - } - - } - - // Renders a vector object 'v' as an arrow and a location 'x,y' - void drawVector(PVector v, float x, float y, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(x,y); - strokeWeight(2); - stroke(255,0,0); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - //line(len,0,len-arrowsize,+arrowsize/2); - //line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); - } - - PVector lookup(PVector lookup) { - int column = int(constrain(lookup.x/resolution,0,cols-1)); - int row = int(constrain(lookup.y/resolution,0,rows-1)); - return field[column][row].get(); - } - - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowfieldImage.pde b/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowfieldImage.pde deleted file mode 100644 index b023de6d6..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/FlowfieldImage.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following -// Via Reynolds: http://www.red3d.com/cwr/steer/FlowFollow.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = true; - -PImage img; - -// Flowfield object -FlowField flowfield; -// An ArrayList of vehicles -ArrayList vehicles; - -void setup() { - size(600, 568); - img = loadImage("sil.jpg"); - // Make a new flow field with "resolution" of 16 - flowfield = new FlowField(20); - vehicles = new ArrayList(); - // Make a whole bunch of vehicles with random maxspeed and maxforce values - for (int i = 0; i < 120; i++) { - vehicles.add(new Vehicle(new PVector(random(width), random(height)), random(2, 5), random(0.1, 0.5))); - } -} - -void draw() { - background(255); - image(img,0,0); - // Display the flowfield in "debug" mode - if (debug) flowfield.display(); - // Tell all the vehicles to follow the flow field - for (Vehicle v : vehicles) { - v.follow(flowfield); - v.run(); - } - - // Instructions - fill(0); - text("Hit space bar to toggle debugging lines.\nClick the mouse to generate a new flow field.",10,height-20); -} - - -void keyPressed() { - if (key == ' ') { - debug = !debug; - } -} - -// Make a new flowfield -void mousePressed() { - flowfield.init(); -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/Vehicle.pde deleted file mode 100644 index 2326a1e7c..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/FlowfieldImage/Vehicle.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class Vehicle { - - // The usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(PVector l, float ms, float mf) { - location = l.get(); - r = 3.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - } - - public void run() { - update(); - borders(); - display(); - } - - - // Implementing Reynolds' flow field following algorithm - // http://www.red3d.com/cwr/steer/FlowFollow.html - void follow(FlowField flow) { - // What is the vector at that spot in the flow field? - PVector desired = flow.lookup(location); - // Scale it up by maxspeed - desired.mult(maxspeed); - // Steering is desired minus velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/NOC_6_01_Seek.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/NOC_6_01_Seek.pde deleted file mode 100644 index f06b2d10f..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/NOC_6_01_Seek.pde +++ /dev/null @@ -1,35 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Two "vehicles" follow the mouse position - -// Implements Craig Reynold's autonomous steering behaviors -// One vehicle "seeks" -// One vehicle "arrives" -// See: http://www.red3d.com/cwr/ - -Vehicle v; - -void setup() { - size(640, 360); - v = new Vehicle(width/2, height/2); -} - -void draw() { - background(255); - - PVector mouse = new PVector(mouseX, mouseY); - - // Draw an ellipse at the mouse location - fill(200); - stroke(0); - strokeWeight(2); - ellipse(mouse.x, mouse.y, 48, 48); - - // Call the appropriate steering behaviors for our agents - v.seek(mouse); - v.update(); - v.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/Vehicle.pde deleted file mode 100644 index 8c469b5d5..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek/Vehicle.pde +++ /dev/null @@ -1,77 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Seek_Arrive - -// The "Vehicle" class - -class Vehicle { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(float x, float y) { - acceleration = new PVector(0,0); - velocity = new PVector(0,-2); - location = new PVector(x,y); - r = 6; - maxspeed = 4; - maxforce = 0.1; - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelerationelertion to 0 each cycle - acceleration.mult(0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - - // Scale to maximum speed - desired.setMag(maxspeed); - - // Steering = Desired minus velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - - applyForce(steer); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + PI/2; - fill(127); - stroke(0); - strokeWeight(1); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(CLOSE); - popMatrix(); - - - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/NOC_6_01_Seek_trail.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/NOC_6_01_Seek_trail.pde deleted file mode 100644 index 5ec2d5091..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/NOC_6_01_Seek_trail.pde +++ /dev/null @@ -1,33 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Implements Craig Reynold's autonomous steering behaviors -// One vehicle "seeks" -// See: http://www.red3d.com/cwr/ - -Vehicle v; - -void setup() { - size(800, 200); - v = new Vehicle(width/2, height/2); -} - -void draw() { - - background(255); - - PVector mouse = new PVector(mouseX, mouseY); - - // Draw an ellipse at the mouse location - fill(200); - stroke(0); - strokeWeight(2); - ellipse(mouse.x, mouse.y, 48, 48); - - // Call the appropriate steering behaviors for our agents - v.seek(mouse); - v.update(); - v.display(); -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/Vehicle.pde deleted file mode 100644 index d0b33d652..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_01_Seek_trail/Vehicle.pde +++ /dev/null @@ -1,91 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The "Vehicle" class - -class Vehicle { - ArrayList history = new ArrayList(); - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(float x, float y) { - acceleration = new PVector(0,0); - velocity = new PVector(0,-2); - location = new PVector(x,y); - r = 6; - maxspeed = 4; - maxforce = 0.1; - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelerationelertion to 0 each cycle - acceleration.mult(0); - - history.add(location.get()); - if (history.size() > 100) { - history.remove(0); - } - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - - applyForce(steer); - } - - void display() { - beginShape(); - stroke(0); - strokeWeight(1); - noFill(); - for(PVector v: history) { - vertex(v.x,v.y); - } - endShape(); - - - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + PI/2; - fill(127); - stroke(0); - strokeWeight(1); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(CLOSE); - popMatrix(); - - - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/NOC_6_02_Arrive.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/NOC_6_02_Arrive.pde deleted file mode 100644 index bd445d818..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/NOC_6_02_Arrive.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// One vehicle "arrives" -// See: http://www.red3d.com/cwr/ - -Vehicle v; - -void setup() { - size(640, 360); - v = new Vehicle(width/2, height/2); -} - -void draw() { - background(255); - - PVector mouse = new PVector(mouseX, mouseY); - - // Draw an ellipse at the mouse location - fill(200); - stroke(0); - strokeWeight(2); - ellipse(mouse.x, mouse.y, 48, 48); - - // Call the appropriate steering behaviors for our agents - v.arrive(mouse); - v.update(); - v.display(); -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/Vehicle.pde deleted file mode 100644 index a00eb9c4f..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_02_Arrive/Vehicle.pde +++ /dev/null @@ -1,80 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The "Vehicle" class - -class Vehicle { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(float x, float y) { - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - location = new PVector(x,y); - r = 6; - maxspeed = 4; - maxforce = 0.1; - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelerationelertion to 0 each cycle - acceleration.mult(0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void arrive(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - float d = desired.mag(); - // Scale with arbitrary damping within 100 pixels - if (d < 100) { - float m = map(d,0,100,0,maxspeed); - desired.setMag(m); - } else { - desired.setMag(maxspeed); - } - - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - } - - void display() { - - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + PI/2; - fill(127); - stroke(0); - strokeWeight(1); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(CLOSE); - popMatrix(); - - - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/NOC_6_03_StayWithinWalls.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/NOC_6_03_StayWithinWalls.pde deleted file mode 100644 index dbc5d3a5a..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/NOC_6_03_StayWithinWalls.pde +++ /dev/null @@ -1,36 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stay Within Walls -// "Made-up" Steering behavior to stay within walls - - -Vehicle v; -boolean debug = true; - -float d = 25; - -void setup() { - size(640, 360); - v = new Vehicle(width/2, height/2); -} - -void draw() { - background(255); - - if (debug) { - stroke(175); - noFill(); - rectMode(CENTER); - rect(width/2, height/2, width-d*2, height-d*2); - } - - v.boundaries(); - v.run(); -} - -void mousePressed() { - debug = !debug; -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/Vehicle.pde deleted file mode 100644 index 9a507181c..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls/Vehicle.pde +++ /dev/null @@ -1,92 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The "Vehicle" class - -class Vehicle { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - - float maxspeed; - float maxforce; - - Vehicle(float x, float y) { - acceleration = new PVector(0, 0); - velocity = new PVector(3, -2); - velocity.mult(5); - location = new PVector(x, y); - r = 6; - maxspeed = 3; - maxforce = 0.15; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void boundaries() { - - PVector desired = null; - - if (location.x < d) { - desired = new PVector(maxspeed, velocity.y); - } - else if (location.x > width -d) { - desired = new PVector(-maxspeed, velocity.y); - } - - if (location.y < d) { - desired = new PVector(velocity.x, maxspeed); - } - else if (location.y > height-d) { - desired = new PVector(velocity.x, -maxspeed); - } - - if (desired != null) { - desired.normalize(); - desired.mult(maxspeed); - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); - applyForce(steer); - } - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(127); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/NOC_6_03_StayWithinWalls_trail.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/NOC_6_03_StayWithinWalls_trail.pde deleted file mode 100644 index c260f716a..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/NOC_6_03_StayWithinWalls_trail.pde +++ /dev/null @@ -1,37 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stay Within Walls -// "Made-up" Steering behavior to stay within walls - - -Vehicle v; -boolean debug = true; - -float d = 25; - - -void setup() { - size(640, 360); - v = new Vehicle(width/2, height/2); -} - -void draw() { - background(255); - - if (debug) { - stroke(175); - noFill(); - rectMode(CENTER); - rect(width/2, height/2, width-d*2, height-d*2); - } - - v.boundaries(); - v.run(); -} - -void mousePressed() { - debug = !debug; -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/Vehicle.pde deleted file mode 100644 index 0d94054a4..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_03_StayWithinWalls_trail/Vehicle.pde +++ /dev/null @@ -1,108 +0,0 @@ -// Wander -// Daniel Shiffman -// The Nature of Code - -// The "Vehicle" class - -class Vehicle { - ArrayList history = new ArrayList(); - - PVector location; - PVector velocity; - PVector acceleration; - float r; - - float maxspeed; - float maxforce; - - Vehicle(float x, float y) { - acceleration = new PVector(0, 0); - velocity = new PVector(3, -2); - velocity.mult(5); - location = new PVector(x, y); - r = 6; - maxspeed = 3; - maxforce = 0.15; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - - history.add(location.get()); - if (history.size() > 500) { - history.remove(0); - } - } - - void boundaries() { - - PVector desired = null; - - if (location.x < d) { - desired = new PVector(maxspeed, velocity.y); - } - else if (location.x > width -d) { - desired = new PVector(-maxspeed, velocity.y); - } - - if (location.y < d) { - desired = new PVector(velocity.x, maxspeed); - } - else if (location.y > height-d) { - desired = new PVector(velocity.x, -maxspeed); - } - - if (desired != null) { - desired.normalize(); - desired.mult(maxspeed); - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); - applyForce(steer); - } - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - void display() { - beginShape(); - stroke(0); - strokeWeight(1); - noFill(); - for(PVector v: history) { - vertex(v.x,v.y); - } - endShape(); - - - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(127); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/FlowField.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/FlowField.pde deleted file mode 100644 index 75b471b29..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/FlowField.pde +++ /dev/null @@ -1,94 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class FlowField { - - // A flow field is a two dimensional array of PVectors - PVector[][] field; - int cols, rows; // Columns and Rows - int resolution; // How large is each "cell" of the flow field - - FlowField(int r) { - resolution = r; - // Determine the number of columns and rows based on sketch's width and height - cols = width/resolution; - rows = height/resolution; - field = new PVector[cols][rows]; - init(); - } - - void init() { - // Reseed noise so we get a new flow field every time - noiseSeed((int)random(10000)); - float xoff = 0; - for (int i = 0; i < cols; i++) { - float yoff = 0; - for (int j = 0; j < rows; j++) { - //float theta = random(TWO_PI); - //float theta = map(noise(xoff,yoff),0,1,0,TWO_PI); - float x = i*resolution; - float y = j*resolution; - PVector v = new PVector(width/2-x,-y); - v.normalize(); - // Polar to cartesian coordinate transformation to get x and y components of the vector - field[i][j] = v;// new PVector(cos(theta),sin(theta)); - yoff += 0.1; - } - xoff += 0.1; - } - } - - // Draw every vector - void display() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - //drawVector(field[i][j],i*resolution,j*resolution,resolution-2); - pushMatrix(); - //translate(i*resolution+arrow.width/2,j*resolution+arrow.height/2); - translate(i*resolution,j*resolution); - rotate(field[i][j].heading2D()); - imageMode(CENTER); - //scale(0.2); - image(a,0,0); - //shape(arrow,-arrow.width/2,-arrow.height/2); - //ellipse(0,0,8,8); - popMatrix(); - } - } - - } - - // Renders a vector object 'v' as an arrow and a location 'x,y' - void drawVector(PVector v, float x, float y, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(x,y); - stroke(0,100); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - line(len,0,len-arrowsize,+arrowsize/2); - line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); - } - - PVector lookup(PVector lookup) { - int column = int(constrain(lookup.x/resolution,0,cols-1)); - int row = int(constrain(lookup.y/resolution,0,rows-1)); - return field[column][row].get(); - } - - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/NOC_6_04_Flow_Figures.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/NOC_6_04_Flow_Figures.pde deleted file mode 100644 index beb0642c9..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/NOC_6_04_Flow_Figures.pde +++ /dev/null @@ -1,35 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -// Via Reynolds: http://www.red3d.com/cwr/steer/FlowFollow.html - -// Flowfield object -FlowField flowfield; -PShape arrow; -PImage a; - -void setup() { - size(1800, 60*9); - // Make a new flow field with "resolution" of 16 - flowfield = new FlowField(60); - arrow = loadShape("arrow.svg"); - a = loadImage("arrow60.png"); -} - -void draw() { - background(255); - // Display the flowfield in "debug" mode - translate(30,30); - flowfield.display(); - saveFrame("ch6_exc6.png"); - noLoop(); -} -// Make a new flowfield -void mousePressed() { - flowfield.init(); -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/Vehicle.pde deleted file mode 100644 index 2326a1e7c..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/Vehicle.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class Vehicle { - - // The usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(PVector l, float ms, float mf) { - location = l.get(); - r = 3.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - } - - public void run() { - update(); - borders(); - display(); - } - - - // Implementing Reynolds' flow field following algorithm - // http://www.red3d.com/cwr/steer/FlowFollow.html - void follow(FlowField flow) { - // What is the vector at that spot in the flow field? - PVector desired = flow.lookup(location); - // Scale it up by maxspeed - desired.mult(maxspeed); - // Steering is desired minus velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/data/arrow.svg b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/data/arrow.svg deleted file mode 100644 index 0f34115e7..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flow_Figures/data/arrow.svg +++ /dev/null @@ -1,5149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/FlowField.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/FlowField.pde deleted file mode 100644 index 08bf7eb23..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/FlowField.pde +++ /dev/null @@ -1,79 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class FlowField { - - // A flow field is a two dimensional array of PVectors - PVector[][] field; - int cols, rows; // Columns and Rows - int resolution; // How large is each "cell" of the flow field - - FlowField(int r) { - resolution = r; - // Determine the number of columns and rows based on sketch's width and height - cols = width/resolution; - rows = height/resolution; - field = new PVector[cols][rows]; - init(); - } - - void init() { - // Reseed noise so we get a new flow field every time - noiseSeed((int)random(10000)); - float xoff = 0; - for (int i = 0; i < cols; i++) { - float yoff = 0; - for (int j = 0; j < rows; j++) { - float theta = map(noise(xoff,yoff),0,1,0,TWO_PI); - // Polar to cartesian coordinate transformation to get x and y components of the vector - field[i][j] = new PVector(cos(theta),sin(theta)); - yoff += 0.1; - } - xoff += 0.1; - } - } - - // Draw every vector - void display() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - drawVector(field[i][j],i*resolution,j*resolution,resolution-2); - } - } - - } - - // Renders a vector object 'v' as an arrow and a location 'x,y' - void drawVector(PVector v, float x, float y, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(x,y); - stroke(0,100); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading2D()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - //line(len,0,len-arrowsize,+arrowsize/2); - //line(len,0,len-arrowsize,-arrowsize/2); - popMatrix(); - } - - PVector lookup(PVector lookup) { - int column = int(constrain(lookup.x/resolution,0,cols-1)); - int row = int(constrain(lookup.y/resolution,0,rows-1)); - return field[column][row].get(); - } - - -} - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/NOC_6_04_Flowfield.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/NOC_6_04_Flowfield.pde deleted file mode 100644 index 86a2c4c29..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/NOC_6_04_Flowfield.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following -// Via Reynolds: http://www.red3d.com/cwr/steer/FlowFollow.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = true; - -// Flowfield object -FlowField flowfield; -// An ArrayList of vehicles -ArrayList vehicles; - -void setup() { - size(640, 360); - // Make a new flow field with "resolution" of 16 - flowfield = new FlowField(20); - vehicles = new ArrayList(); - // Make a whole bunch of vehicles with random maxspeed and maxforce values - for (int i = 0; i < 120; i++) { - vehicles.add(new Vehicle(new PVector(random(width), random(height)), random(2, 5), random(0.1, 0.5))); - } -} - -void draw() { - background(255); - // Display the flowfield in "debug" mode - if (debug) flowfield.display(); - // Tell all the vehicles to follow the flow field - for (Vehicle v : vehicles) { - v.follow(flowfield); - v.run(); - } - - // Instructions - fill(0); - text("Hit space bar to toggle debugging lines.\nClick the mouse to generate a new flow field.",10,height-20); -} - - -void keyPressed() { - if (key == ' ') { - debug = !debug; - } -} - -// Make a new flowfield -void mousePressed() { - flowfield.init(); -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/Vehicle.pde deleted file mode 100644 index 2326a1e7c..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_04_Flowfield/Vehicle.pde +++ /dev/null @@ -1,87 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flow Field Following - -class Vehicle { - - // The usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Vehicle(PVector l, float ms, float mf) { - location = l.get(); - r = 3.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0,0); - velocity = new PVector(0,0); - } - - public void run() { - update(); - borders(); - display(); - } - - - // Implementing Reynolds' flow field following algorithm - // http://www.red3d.com/cwr/steer/FlowFollow.html - void follow(FlowField flow) { - // What is the vector at that spot in the flow field? - PVector desired = flow.lookup(location); - // Scale it up by maxspeed - desired.mult(maxspeed); - // Steering is desired minus velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/NOC_6_05_PathFollowingSimple.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/NOC_6_05_PathFollowingSimple.pde deleted file mode 100644 index abe2f5e9a..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/NOC_6_05_PathFollowingSimple.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following -// Path is a just a straight line in this example -// Via Reynolds: // http://www.red3d.com/cwr/steer/PathFollow.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = true; - -// A path object (series of connected points) -Path path; - -// Two vehicles -Vehicle car1; -Vehicle car2; - -void setup() { - size(640, 360); - path = new Path(); - - // Each vehicle has different maxspeed and maxforce for demo purposes - car1 = new Vehicle(new PVector(0, height/2), 2, 0.02); - car2 = new Vehicle(new PVector(0, height/2), 3, 0.05); -} - -void draw() { - background(255); - // Display the path - path.display(); - // The boids follow the path - car1.follow(path); - car2.follow(path); - // Call the generic run method (update, borders, display, etc.) - car1.run(); - car2.run(); - - // Check if it gets to the end of the path since it's not a loop - car1.borders(path); - car2.borders(path); - - // Instructions - fill(0); - text("Hit space bar to toggle debugging lines.", 10, height-30); -} - -public void keyPressed() { - if (key == ' ') { - debug = !debug; - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Path.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Path.pde deleted file mode 100644 index 3d222214d..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Path.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following - -class Path { - - // A Path is line between two points (PVector objects) - PVector start; - PVector end; - // A path has a radius, i.e how far is it ok for the boid to wander off - float radius; - - Path() { - // Arbitrary radius of 20 - radius = 20; - start = new PVector(0,height/3); - end = new PVector(width,2*height/3); - } - - // Draw the path - void display() { - - strokeWeight(radius*2); - stroke(0,100); - line(start.x,start.y,end.x,end.y); - - strokeWeight(1); - stroke(0); - line(start.x,start.y,end.x,end.y); - } -} - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Vehicle.pde deleted file mode 100644 index 1fdbd172e..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_05_PathFollowingSimple/Vehicle.pde +++ /dev/null @@ -1,160 +0,0 @@ -// Path Following -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Vehicle class - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle( PVector l, float ms, float mf) { - location = l.get(); - r = 4.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0, 0); - velocity = new PVector(maxspeed, 0); - } - - // Main "run" function - void run() { - update(); - display(); - } - - - // This function implements Craig Reynolds' path following algorithm - // http://www.red3d.com/cwr/steer/PathFollow.html - void follow(Path p) { - - // Predict location 50 (arbitrary choice) frames ahead - PVector predict = velocity.get(); - predict.normalize(); - predict.mult(50); - PVector predictLoc = PVector.add(location, predict); - - // Look at the line segment - PVector a = p.start; - PVector b = p.end; - - // Get the normal point to that line - PVector normalPoint = getNormalPoint(predictLoc, a, b); - - // Find target point a little further ahead of normal - PVector dir = PVector.sub(b, a); - dir.normalize(); - dir.mult(10); // This could be based on velocity instead of just an arbitrary 10 pixels - PVector target = PVector.add(normalPoint, dir); - - // How far away are we from the path? - float distance = PVector.dist(predictLoc, normalPoint); - // Only if the distance is greater than the path's radius do we bother to steer - if (distance > p.radius) { - seek(target); - } - - - // Draw the debugging stuff - if (debug) { - fill(0); - stroke(0); - line(location.x, location.y, predictLoc.x, predictLoc.y); - ellipse(predictLoc.x, predictLoc.y, 4, 4); - - // Draw normal location - fill(0); - stroke(0); - line(predictLoc.x, predictLoc.y, normalPoint.x, normalPoint.y); - ellipse(normalPoint.x, normalPoint.y, 4, 4); - stroke(0); - if (distance > p.radius) fill(255, 0, 0); - noStroke(); - ellipse(target.x+dir.x, target.y+dir.y, 8, 8); - } - } - - - // A function to get the normal point from a point (p) to a line segment (a-b) - // This function could be optimized to make fewer new Vector objects - PVector getNormalPoint(PVector p, PVector a, PVector b) { - // Vector from a to p - PVector ap = PVector.sub(p, a); - // Vector from a to b - PVector ab = PVector.sub(b, a); - ab.normalize(); // Normalize the line - // Project vector "diff" onto line by using the dot product - ab.mult(ap.dot(ab)); - PVector normalPoint = PVector.add(a, ab); - return normalPoint; - } - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void seek(PVector target) { - PVector desired = PVector.sub(target, location); // A vector pointing from the location to the target - - // If the magnitude of desired equals 0, skip out of here - // (We could optimize this to check if x and y are 0 to avoid mag() square root - if (desired.mag() == 0) return; - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - - applyForce(steer); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(PConstants.TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders(Path p) { - if (location.x > p.end.x + r) { - location.x = p.start.x - r; - location.y = p.start.y + (location.y-p.end.y); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/NOC_6_06_PathFollowing.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/NOC_6_06_PathFollowing.pde deleted file mode 100644 index b07b478dd..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/NOC_6_06_PathFollowing.pde +++ /dev/null @@ -1,67 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following -// Via Reynolds: // http://www.red3d.com/cwr/steer/PathFollow.html - -// Using this variable to decide whether to draw all the stuff -boolean debug = true; - -// A path object (series of connected points) -Path path; - -// Two vehicles -Vehicle car1; -Vehicle car2; - -void setup() { - size(640, 360); - // Call a function to generate new Path object - newPath(); - - // Each vehicle has different maxspeed and maxforce for demo purposes - car1 = new Vehicle(new PVector(0, height/2), 2, 0.04); - car2 = new Vehicle(new PVector(0, height/2), 3, 0.1); -} - -void draw() { - background(255); - // Display the path - path.display(); - // The boids follow the path - car1.follow(path); - car2.follow(path); - // Call the generic run method (update, borders, display, etc.) - car1.run(); - car2.run(); - - car1.borders(path); - car2.borders(path); - - // Instructions - fill(0); - text("Hit space bar to toggle debugging lines.\nClick the mouse to generate a new path.", 10, height-30); -} - -void newPath() { - // A path is a series of connected points - // A more sophisticated path might be a curve - path = new Path(); - path.addPoint(-20, height/2); - path.addPoint(random(0, width/2), random(0, height)); - path.addPoint(random(width/2, width), random(0, height)); - path.addPoint(width+20, height/2); -} - -public void keyPressed() { - if (key == ' ') { - debug = !debug; - } -} - -public void mousePressed() { - newPath(); -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Path.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Path.pde deleted file mode 100644 index 8d28b73cb..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Path.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following - -class Path { - - // A Path is an arraylist of points (PVector objects) - ArrayList points; - // A path has a radius, i.e how far is it ok for the boid to wander off - float radius; - - Path() { - // Arbitrary radius of 20 - radius = 20; - points = new ArrayList(); - } - - // Add a point to the path - void addPoint(float x, float y) { - PVector point = new PVector(x, y); - points.add(point); - } - - PVector getStart() { - return points.get(0); - } - - PVector getEnd() { - return points.get(points.size()-1); - } - - - // Draw the path - void display() { - // Draw thick line for radius - stroke(175); - strokeWeight(radius*2); - noFill(); - beginShape(); - for (PVector v : points) { - vertex(v.x, v.y); - } - endShape(); - // Draw thin line for center of path - stroke(0); - strokeWeight(1); - noFill(); - beginShape(); - for (PVector v : points) { - vertex(v.x, v.y); - } - endShape(); - } -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Vehicle.pde deleted file mode 100644 index 72bd7d1fe..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_06_PathFollowing/Vehicle.pde +++ /dev/null @@ -1,192 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Path Following - -// Vehicle class - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle( PVector l, float ms, float mf) { - location = l.get(); - r = 4.0; - maxspeed = ms; - maxforce = mf; - acceleration = new PVector(0, 0); - velocity = new PVector(maxspeed, 0); - } - - // Main "run" function - public void run() { - update(); - display(); - } - - - // This function implements Craig Reynolds' path following algorithm - // http://www.red3d.com/cwr/steer/PathFollow.html - void follow(Path p) { - - // Predict location 50 (arbitrary choice) frames ahead - // This could be based on speed - PVector predict = velocity.get(); - predict.normalize(); - predict.mult(50); - PVector predictLoc = PVector.add(location, predict); - - // Now we must find the normal to the path from the predicted location - // We look at the normal for each line segment and pick out the closest one - - PVector normal = null; - PVector target = null; - float worldRecord = 1000000; // Start with a very high record distance that can easily be beaten - - // Loop through all points of the path - for (int i = 0; i < p.points.size()-1; i++) { - - // Look at a line segment - PVector a = p.points.get(i); - PVector b = p.points.get(i+1); - - // Get the normal point to that line - PVector normalPoint = getNormalPoint(predictLoc, a, b); - // This only works because we know our path goes from left to right - // We could have a more sophisticated test to tell if the point is in the line segment or not - if (normalPoint.x < a.x || normalPoint.x > b.x) { - // This is something of a hacky solution, but if it's not within the line segment - // consider the normal to just be the end of the line segment (point b) - normalPoint = b.get(); - } - - // How far away are we from the path? - float distance = PVector.dist(predictLoc, normalPoint); - // Did we beat the record and find the closest line segment? - if (distance < worldRecord) { - worldRecord = distance; - // If so the target we want to steer towards is the normal - normal = normalPoint; - - // Look at the direction of the line segment so we can seek a little bit ahead of the normal - PVector dir = PVector.sub(b, a); - dir.normalize(); - // This is an oversimplification - // Should be based on distance to path & velocity - dir.mult(10); - target = normalPoint.get(); - target.add(dir); - } - } - - // Only if the distance is greater than the path's radius do we bother to steer - if (worldRecord > p.radius) { - seek(target); - } - - - // Draw the debugging stuff - if (debug) { - // Draw predicted future location - stroke(0); - fill(0); - line(location.x, location.y, predictLoc.x, predictLoc.y); - ellipse(predictLoc.x, predictLoc.y, 4, 4); - - // Draw normal location - stroke(0); - fill(0); - ellipse(normal.x, normal.y, 4, 4); - // Draw actual target (red if steering towards it) - line(predictLoc.x, predictLoc.y, normal.x, normal.y); - if (worldRecord > p.radius) fill(255, 0, 0); - noStroke(); - ellipse(target.x, target.y, 8, 8); - } - } - - - // A function to get the normal point from a point (p) to a line segment (a-b) - // This function could be optimized to make fewer new Vector objects - PVector getNormalPoint(PVector p, PVector a, PVector b) { - // Vector from a to p - PVector ap = PVector.sub(p, a); - // Vector from a to b - PVector ab = PVector.sub(b, a); - ab.normalize(); // Normalize the line - // Project vector "diff" onto line by using the dot product - ab.mult(ap.dot(ab)); - PVector normalPoint = PVector.add(a, ab); - return normalPoint; - } - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void seek(PVector target) { - PVector desired = PVector.sub(target, location); // A vector pointing from the location to the target - - // If the magnitude of desired equals 0, skip out of here - // (We could optimize this to check if x and y are 0 to avoid mag() square root - if (desired.mag() == 0) return; - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); // Limit to maximum steering force - - applyForce(steer); - } - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(PConstants.TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders(Path p) { - if (location.x > p.getEnd().x + r) { - location.x = p.getStart().x - r; - location.y = p.getStart().y + (location.y-p.getEnd().y); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/NOC_6_07_Separation.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/NOC_6_07_Separation.pde deleted file mode 100644 index d884461f2..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/NOC_6_07_Separation.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Separation -// Via Reynolds: http://www.red3d.com/cwr/steer/ - -// A list of vehicles -ArrayList vehicles; - -void setup() { - size(640,360); - // We are now making random vehicles and storing them in an ArrayList - vehicles = new ArrayList(); - for (int i = 0; i < 100; i++) { - vehicles.add(new Vehicle(random(width),random(height))); - } -} - -void draw() { - background(255); - - for (Vehicle v : vehicles) { - // Path following and separation are worked on in this function - v.separate(vehicles); - // Call the generic run method (update, borders, display, etc.) - v.update(); - v.borders(); - v.display(); - } - - // Instructions - fill(0); - text("Drag the mouse to generate new vehicles.",10,height-16); -} - - -void mouseDragged() { - vehicles.add(new Vehicle(mouseX,mouseY)); -} - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/Vehicle.pde deleted file mode 100644 index f0a5ddb96..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_07_Separation/Vehicle.pde +++ /dev/null @@ -1,99 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Vehicle class - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle(float x, float y) { - location = new PVector(x, y); - r = 12; - maxspeed = 3; - maxforce = 0.2; - acceleration = new PVector(0, 0); - velocity = new PVector(0, 0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // Separation - // Method checks for nearby vehicles and steers away - void separate (ArrayList vehicles) { - float desiredseparation = r*2; - PVector sum = new PVector(); - int count = 0; - // For every boid in the system, check if it's too close - for (Vehicle other : vehicles) { - float d = PVector.dist(location, other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location, other.location); - diff.normalize(); - diff.div(d); // Weight by distance - sum.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - sum.div(count); - // Our desired vector is the average scaled to maximum speed - sum.normalize(); - sum.mult(maxspeed); - // Implement Reynolds: Steering = Desired - Velocity - PVector steer = PVector.sub(sum, velocity); - steer.limit(maxforce); - applyForce(steer); - } - } - - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - ellipse(0, 0, r, r); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } -} - - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/NOC_6_08_SeparationAndSeek.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/NOC_6_08_SeparationAndSeek.pde deleted file mode 100644 index bc744a1b8..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/NOC_6_08_SeparationAndSeek.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A list of vehicles -ArrayList vehicles; - -void setup() { - size(640,360); - // We are now making random vehicles and storing them in an ArrayList - vehicles = new ArrayList(); - for (int i = 0; i < 100; i++) { - vehicles.add(new Vehicle(random(width),random(height))); - } -} - -void draw() { - background(255); - - for (Vehicle v : vehicles) { - // Path following and separation are worked on in this function - v.applyBehaviors(vehicles); - // Call the generic run method (update, borders, display, etc.) - v.update(); - v.display(); - } - - // Instructions - fill(0); - text("Drag the mouse to generate new vehicles.",10,height-16); -} - - -void mouseDragged() { - vehicles.add(new Vehicle(mouseX,mouseY)); -} - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/Vehicle.pde deleted file mode 100644 index b4270972e..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_08_SeparationAndSeek/Vehicle.pde +++ /dev/null @@ -1,113 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Vehicle { - - // All the usual stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - // Constructor initialize all values - Vehicle(float x, float y) { - location = new PVector(x, y); - r = 12; - maxspeed = 3; - maxforce = 0.2; - acceleration = new PVector(0, 0); - velocity = new PVector(0, 0); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - void applyBehaviors(ArrayList vehicles) { - PVector separateForce = separate(vehicles); - PVector seekForce = seek(new PVector(mouseX,mouseY)); - separateForce.mult(2); - seekForce.mult(1); - applyForce(separateForce); - applyForce(seekForce); - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - - return steer; - } - - // Separation - // Method checks for nearby vehicles and steers away - PVector separate (ArrayList vehicles) { - float desiredseparation = r*2; - PVector sum = new PVector(); - int count = 0; - // For every boid in the system, check if it's too close - for (Vehicle other : vehicles) { - float d = PVector.dist(location, other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location, other.location); - diff.normalize(); - diff.div(d); // Weight by distance - sum.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - sum.div(count); - // Our desired vector is the average scaled to maximum speed - sum.normalize(); - sum.mult(maxspeed); - // Implement Reynolds: Steering = Desired - Velocity - sum.sub(velocity); - sum.limit(maxforce); - } - return sum; - } - - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void display() { - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - ellipse(0, 0, r, r); - popMatrix(); - } - -} - - - - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Boid.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Boid.pde deleted file mode 100644 index 194dfc362..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Boid.pde +++ /dev/null @@ -1,182 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Boid(float x, float y) { - acceleration = new PVector(0,0); - velocity = new PVector(random(-1,1),random(-1,1)); - location = new PVector(x,y); - r = 3.0; - maxspeed = 3; - maxforce = 0.05; - } - - void run(ArrayList boids) { - flock(boids); - update(); - borders(); - render(); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - // We accumulate a new acceleration each time based on three rules - void flock(ArrayList boids) { - PVector sep = separate(boids); // Separation - PVector ali = align(boids); // Alignment - PVector coh = cohesion(boids); // Cohesion - // Arbitrarily weight these forces - sep.mult(1.5); - ali.mult(1.0); - coh.mult(1.0); - // Add the force vectors to acceleration - applyForce(sep); - applyForce(ali); - applyForce(coh); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target,location); // A vector pointing from the location to the target - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired,velocity); - steer.limit(maxforce); // Limit to maximum steering force - return steer; - } - - void render() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate (ArrayList boids) { - float desiredseparation = 25.0f; - PVector steer = new PVector(0,0,0); - int count = 0; - // For every boid in the system, check if it's too close - for (Boid other : boids) { - float d = PVector.dist(location,other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location,other.location); - diff.normalize(); - diff.div(d); // Weight by distance - steer.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer.div((float)count); - } - - // As long as the vector is greater than 0 - if (steer.mag() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mult(maxspeed); - steer.sub(velocity); - steer.limit(maxforce); - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - PVector align (ArrayList boids) { - float neighbordist = 50; - PVector sum = new PVector(0,0); - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(location,other.location); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.velocity); - count++; - } - } - if (count > 0) { - sum.div((float)count); - sum.normalize(); - sum.mult(maxspeed); - PVector steer = PVector.sub(sum,velocity); - steer.limit(maxforce); - return steer; - } else { - return new PVector(0,0); - } - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - PVector cohesion (ArrayList boids) { - float neighbordist = 50; - PVector sum = new PVector(0,0); // Start with empty vector to accumulate all locations - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(location,other.location); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.location); // Add location - count++; - } - } - if (count > 0) { - sum.div(count); - return seek(sum); // Steer towards the location - } else { - return new PVector(0,0); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Flock.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Flock.pde deleted file mode 100644 index b548b2469..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/Flock.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flock class -// Does very little, simply manages the ArrayList of all the boids - -class Flock { - ArrayList boids; // An ArrayList for all the boids - - Flock() { - boids = new ArrayList(); // Initialize the ArrayList - } - - void run() { - for (Boid b : boids) { - b.run(boids); // Passing the entire list of boids to each boid individually - } - } - - void addBoid(Boid b) { - boids.add(b); - } - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/NOC_6_09_Flocking.pde b/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/NOC_6_09_Flocking.pde deleted file mode 100644 index 921f0d250..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/NOC_6_09_Flocking/NOC_6_09_Flocking.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Demonstration of Craig Reynolds' "Flocking" behavior -// See: http://www.red3d.com/cwr/ -// Rules: Cohesion, Separation, Alignment - -// Click mouse to add boids into the system - -Flock flock; - -void setup() { - size(640,360); - flock = new Flock(); - // Add an initial set of boids into the system - for (int i = 0; i < 200; i++) { - Boid b = new Boid(width/2,height/2); - flock.addBoid(b); - } - smooth(); -} - -void draw() { - background(255); - flock.run(); - - // Instructions - fill(0); - //text("Drag the mouse to generate new boids.",10,height-16); -} - -// Add a new boid into the System -void mouseDragged() { - flock.addBoid(new Boid(mouseX,mouseY)); -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/SimpleScalarProjection/SimpleScalarProjection.pde b/java/examples/Books/Nature of Code/chp6_agents/SimpleScalarProjection/SimpleScalarProjection.pde deleted file mode 100644 index dbd09f94e..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/SimpleScalarProjection/SimpleScalarProjection.pde +++ /dev/null @@ -1,41 +0,0 @@ - -void setup() { - size(600, 360); -} - -void draw() { - background(255); - - PVector a = new PVector(20,300); - PVector b = new PVector(500,250); - PVector mouse = new PVector(mouseX,mouseY); - - stroke(0); - strokeWeight(2); - line(a.x,a.y,b.x,b.y); - line(a.x,a.y,mouse.x,mouse.y); - fill(0); - ellipse(a.x,a.y,8,8); - ellipse(b.x,b.y,8,8); - ellipse(mouse.x,mouse.y,8,8); - - PVector norm = scalarProjection(mouse,a,b); - strokeWeight(1); - stroke(50); - line(mouse.x,mouse.y,norm.x,norm.y); - - noStroke(); - fill(255,0,0); - ellipse(norm.x,norm.y,16,16); -} - - -PVector scalarProjection(PVector p, PVector a, PVector b) { - PVector ap = PVector.sub(p, a); - PVector ab = PVector.sub(b, a); - ab.normalize(); // Normalize the line - ab.mult(ap.dot(ab)); - PVector normalPoint = PVector.add(a, ab); - return normalPoint; -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/StayWithinCircle.pde b/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/StayWithinCircle.pde deleted file mode 100644 index 0c2d43c86..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/StayWithinCircle.pde +++ /dev/null @@ -1,41 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stay Within Circle -// "Made-up" Steering behavior to stay within walls - -Vehicle v; -boolean debug = true; - - -PVector circleLocation; -float circleRadius; - - - -void setup() { - size(640, 360); - v = new Vehicle(width/2, height/4); - - circleLocation = new PVector(width/2,height/2); - circleRadius = height/2-25; -} - -void draw() { - background(255); - - if (debug) { - stroke(175); - noFill(); - ellipse(circleLocation.x,circleLocation.y, circleRadius*2,circleRadius*2); - } - - v.boundaries(); - v.run(); -} - -void mousePressed() { - debug = !debug; -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/Vehicle.pde b/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/Vehicle.pde deleted file mode 100644 index 7bc96d2fa..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/StayWithinCircle/Vehicle.pde +++ /dev/null @@ -1,93 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Vehicle { - - PVector location; - PVector velocity; - PVector acceleration; - float r; - - float maxspeed; - float maxforce; - - Vehicle(float x, float y) { - acceleration = new PVector(0, 0); - velocity = new PVector(1,0); - velocity.mult(5); - location = new PVector(x, y); - r = 3; - maxspeed = 3; - maxforce = 0.15; - } - - void run() { - update(); - display(); - } - - // Method to update location - void update() { - // Update velocity - velocity.add(acceleration); - // Limit speed - velocity.limit(maxspeed); - location.add(velocity); - // Reset accelertion to 0 each cycle - acceleration.mult(0); - } - - void boundaries() { - - PVector desired = null; - - // Predict location 25 (arbitrary choice) frames ahead - PVector predict = velocity.get(); - predict.mult(25); - PVector futureLocation = PVector.add(location, predict); - float distance = PVector.dist(futureLocation,circleLocation); - - if (distance > circleRadius) { - PVector toCenter = PVector.sub(circleLocation,location); - toCenter.normalize(); - toCenter.mult(velocity.mag()); - desired = PVector.add(velocity,toCenter); - desired.normalize(); - desired.mult(maxspeed); - } - - if (desired != null) { - PVector steer = PVector.sub(desired, velocity); - steer.limit(maxforce); - applyForce(steer); - } - - fill(255,0,0); - ellipse(futureLocation.x,futureLocation.y,4,4); - - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration.add(force); - } - - - void display() { - // Draw a triangle rotated in the direction of velocity - float theta = velocity.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/Thing.pde b/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/Thing.pde deleted file mode 100644 index 7a739186b..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/Thing.pde +++ /dev/null @@ -1,33 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Daniel Shiffman - -// Simple class describing an ellipse living on our screen - -class Thing { - - float x,y; - boolean highlight; - float r; - - Thing (float x_, float y_) { - x = x_; - y = y_; - highlight = false; - r = random(8) + 1; - } - - void move() { - x += random(-1,1); - y += random(-1,1); - } - - void render() { - noStroke(); - if (highlight) fill(255); - else fill(100); - ellipse(x,y,r,r); - } - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/intersection.pde b/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/intersection.pde deleted file mode 100644 index a8474b9c3..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection/intersection.pde +++ /dev/null @@ -1,105 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Bin-Lattice Spatial Subdivision -// http://www.red3d.com/cwr/papers/2000/pip.pdf - -// Example demonstrating optimized intersection test for large # of objects -// Each object registers its location in a virtual grid -// Only the objects in neighboring cells on the grid are tested against each other - -int totalThings = 2000; - -ArrayList a; // ArrayList for all "things" -ArrayList[][] grid; // Grid of ArrayLists for intersection test -int scl = 4; // Size of each grid cell -int cols, rows; // Total coluns and rows - -void setup() { - size(640,360); - a = new ArrayList(); // Create the list - cols = width/scl; // Calculate cols & rows - rows = height/scl; - - // Initialize grid as 2D array of empty ArrayLists - grid = new ArrayList[cols][rows]; - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - grid[i][j] = new ArrayList(); - } - } - - // Put 2000 Things in the system - for (int i = 0; i < totalThings; i++) { - a.add(new Thing(random(width),random(height))); - } - -} - -void draw() { - background(0); - - // Every time through draw clear all the lists - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - grid[i][j].clear(); - } - } - - // Register every Thing object in the grid according to it's location - for (Thing t : a) { - t.highlight = false; - int x = int(t.x) / scl; - int y = int (t.y) /scl; - // It goes in 9 cells, i.e. every Thing is tested against other Things in its cell - // as well as its 8 neighbors - for (int n = -1; n <= 1; n++) { - for (int m = -1; m <= 1; m++) { - if (x+n >= 0 && x+n < cols && y+m >= 0 && y+m< rows) grid[x+n][y+m].add(t); - } - } - } - - // Run through the Grid - stroke(255); - for (int i = 0; i < cols; i++) { - //line(i*scl,0,i*scl,height); - for (int j = 0; j < rows; j++) { - //line(0,j*scl,width,j*scl); - - // For every list in the grid - ArrayList temp = grid[i][j]; - // Check every Thing - for (Thing t : temp) { - // Against every other Thing - for (Thing other : temp) { - // As long as its not the same one - if (other != t) { - // Check to see if they are touching - // (We could do many other things here besides just intersection tests, such - // as apply forces, etc.) - float d = dist(t.x,t.y,other.x,other.y); - if (d < t.r/2 + other.r/2) { - t.highlight = true; - } - } - } - } - } - } - - // Display and move all Things - for (Thing t : a) { - t.render(); - t.move(); - } - - fill(0); - rect(0,height-20,width,20); - fill(255); - text("Framerate: " + int(frameRate),10,height-6); - - - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/Thing.pde b/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/Thing.pde deleted file mode 100644 index 7a739186b..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/Thing.pde +++ /dev/null @@ -1,33 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Daniel Shiffman - -// Simple class describing an ellipse living on our screen - -class Thing { - - float x,y; - boolean highlight; - float r; - - Thing (float x_, float y_) { - x = x_; - y = y_; - highlight = false; - r = random(8) + 1; - } - - void move() { - x += random(-1,1); - y += random(-1,1); - } - - void render() { - noStroke(); - if (highlight) fill(255); - else fill(100); - ellipse(x,y,r,r); - } - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/intersection_slow.pde b/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/intersection_slow.pde deleted file mode 100644 index f8303c06e..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/binlatticespatialsubdivision/intersection/intersection_slow/intersection_slow.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The old way to do intersection tests, look how slow!! - -int totalThings = 2000; - -ArrayList a; // ArrayList for all "things" - -void setup() { - size(640,360); - a = new ArrayList(); // Create the list - - // Put 2000 Things in the system - for (int i = 0; i < totalThings; i++) { - a.add(new Thing(random(width),random(height))); - } - -} - -void draw() { - background(0); - fill(255); - noStroke(); - // Run through the Grid - stroke(255); - for (Thing t : a) { - t.highlight = false; - for (Thing other : a) { - // As long as its not the same one - if (t != other) { - // Check to see if they are touching - // (We could do many other things here besides just intersection tests, such - // as apply forces, etc.) - float d = dist(t.x,t.y,other.x,other.y); - if (d < t.r/2 + other.r/2) { - t.highlight = true; - } - } - } - } - - // Display and move all Things - for (Thing t : a) { - t.render(); - t.move(); - } - - fill(0); - rect(0,height-20,width,20); - fill(255); - text("Framerate: " + int(frameRate),10,height-6); - - - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Boid.pde b/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Boid.pde deleted file mode 100644 index 85150e404..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Boid.pde +++ /dev/null @@ -1,257 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flocking - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - - // We need to keep track of a Body and a width and height - Body body; - float w; - float h; - - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - Boid(PVector loc) { - w = 12; - h = 12; - // Add the box to the box2d world - makeBody(new Vec2(loc.x,loc.y),w,h,new Vec2(0,0),0); - maxspeed = 20; - maxforce = 10; - } - - // This function removes the particle from the box2d world - void killBody() { - box2d.destroyBody(body); - } - - void run(ArrayList boids) { - flock(boids); - borders(); - display(); - } - - // We accumulate a new acceleration each time based on three rules - void flock(ArrayList boids) { - Vec2 sep = separate(boids); // Separation - Vec2 ali = align(boids); // Alignment - Vec2 coh = cohesion(boids); // Cohesion - // Arbitrarily weight these forces - sep.mulLocal(1.5); - ali.mulLocal(1); - coh.mulLocal(1); - // Add the force vectors to acceleration - Vec2 loc = body.getWorldCenter(); - body.applyForce(sep,loc); - body.applyForce(ali,loc); - body.applyForce(coh,loc); - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - Vec2 seek(Vec2 target) { - Vec2 loc = body.getWorldCenter(); - Vec2 desired = target.sub(loc); // A vector pointing from the location to the target - - // If the magnitude of desired equals 0, skip out of here - // (We could optimize this to check if x and y are 0 to avoid mag() square root - if (desired.length() == 0) return new Vec2(0,0); - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mulLocal(maxspeed); - // Steering = Desired minus Velocity - - Vec2 vel = body.getLinearVelocity(); - Vec2 steer = desired.sub(vel); - - float len = steer.length(); - if (len > maxforce) { - steer.normalize(); - steer.mulLocal(maxforce); - } - return steer; - } - - - - // Drawing the box - void display() { - // We look at each body and get its screen position - Vec2 pos = box2d.getBodyPixelCoord(body); - - // Get its angle of rotation - float a = body.getAngle(); - - rectMode(CENTER); - pushMatrix(); - translate(pos.x,pos.y); - rotate(-a); - fill(175); - strokeWeight(2); - stroke(0); - rect(0,0,w,h); - popMatrix(); - } - - // Wraparound - void borders() { - Vec2 loc = box2d.getBodyPixelCoord(body); - Vec2 vel = body.getLinearVelocity(); - float a = body.getAngularVelocity(); - if (loc.x < -w) { - killBody(); - makeBody(new Vec2(width+w,loc.y),w,h,vel,a); - } else if (loc.y < -w) { - killBody(); - makeBody(new Vec2(loc.x,height+w),w,h,vel,a); - } else if (loc.x > width+w) { - killBody(); - makeBody(new Vec2(-w,loc.y),w,h,vel,a); - } else if (loc.y > height+w) { - killBody(); - makeBody(new Vec2(loc.x,-w),w,h,vel,a); - } - } - - // Separation - // Method checks for nearby boids and steers away - Vec2 separate (ArrayList boids) { - float desiredseparation = box2d.scalarPixelsToWorld(30); - - Vec2 steer = new Vec2(0,0); - int count = 0; - // For every boid in the system, check if it's too close - Vec2 locA = body.getWorldCenter(); - for (Boid other : boids) { - Vec2 locB = other.body.getWorldCenter(); - float d = dist(locA.x,locA.y,locB.x,locB.y); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - Vec2 diff = locA.sub(locB); - diff.normalize(); - diff.mulLocal(1.0/d); // Weight by distance - steer.addLocal(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer.mulLocal(1.0/count); - } - - // As long as the vector is greater than 0 - if (steer.length() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mulLocal(maxspeed); - Vec2 vel = body.getLinearVelocity(); - steer.subLocal(vel); - float len = steer.length(); - if (len > maxforce) { - steer.normalize(); - steer.mulLocal(maxforce); - } - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - Vec2 align (ArrayList boids) { - float neighbordist = box2d.scalarPixelsToWorld(50); - Vec2 steer = new Vec2(0,0); - int count = 0; - Vec2 locA = body.getWorldCenter(); - for (Boid other : boids) { - Vec2 locB = other.body.getWorldCenter(); - float d = dist(locA.x,locA.y,locB.x,locB.y); - if ((d > 0) && (d < neighbordist)) { - Vec2 vel = other.body.getLinearVelocity(); - steer.addLocal(vel); - count++; - } - } - if (count > 0) { - steer.mulLocal(1.0/count); - } - - // As long as the vector is greater than 0 - if (steer.length() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mulLocal(maxspeed); - Vec2 vel = body.getLinearVelocity(); - steer.subLocal(vel); - float len = steer.length(); - if (len > maxforce) { - steer.normalize(); - steer.mulLocal(maxforce); - } - } - return steer; - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - Vec2 cohesion (ArrayList boids) { - float neighbordist = box2d.scalarPixelsToWorld(50); - Vec2 sum = new Vec2(0,0); // Start with empty vector to accumulate all locations - int count = 0; - Vec2 locA = body.getWorldCenter(); - for (Boid other : boids) { - Vec2 locB = other.body.getWorldCenter(); - - float d = dist(locA.x,locA.y,locB.x,locB.y); - if ((d > 0) && (d < neighbordist)) { - sum.addLocal(locB); // Add location - count++; - } - } - if (count > 0) { - sum.mulLocal(1.0/count); - return seek(sum); // Steer towards the location - } - return sum; - } - - // This function adds the rectangle to the box2d world - void makeBody(Vec2 center, float w_, float h_, Vec2 vel, float avel) { - - // Define a polygon (this is what we use for a rectangle) - PolygonShape sd = new PolygonShape(); - float box2dW = box2d.scalarPixelsToWorld(w_/2); - float box2dH = box2d.scalarPixelsToWorld(h_/2); - sd.setAsBox(box2dW, box2dH); - - // Define a fixture - FixtureDef fd = new FixtureDef(); - fd.shape = sd; - // Parameters that affect physics - fd.density = 1; - fd.friction = 0.3; - fd.restitution = 0.5; - - // Define the body and make it from the shape - BodyDef bd = new BodyDef(); - bd.type = BodyType.DYNAMIC; - bd.position.set(box2d.coordPixelsToWorld(center)); - - body = box2d.createBody(bd); - body.createFixture(fd); - - body.setLinearVelocity(vel); - body.setAngularVelocity(avel); - - } - - -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flock.pde b/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flock.pde deleted file mode 100644 index 47b0e7b16..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flock.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flocking - -// Flock class -// Does very little, simply manages the ArrayList of all the boids - -class Flock { - ArrayList boids; // An arraylist for all the boids - - Flock() { - boids = new ArrayList(); // Initialize the arraylist - } - - void run() { - for (Boid b : boids) { - b.run(boids); // Passing the entire list of boids to each boid individually - } - } - - void addBoid(Boid b) { - boids.add(b); - } - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flocking_box2d.pde b/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flocking_box2d.pde deleted file mode 100644 index e037a4db9..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/box2d/Flocking_box2d/Flocking_box2d.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flocking - -// Demonstration of Craig Reynolds' "Flocking" behavior -// See: http://www.red3d.com/cwr/ -// Rules: Cohesion, Separation, Alignment - -// Click mouse to add boids into the system - -import pbox2d.*; -import org.jbox2d.collision.shapes.*; -import org.jbox2d.common.*; -import org.jbox2d.dynamics.*; - -// A reference to our box2d world -PBox2D box2d; - -Flock flock; - -void setup() { - size(640,360); - // Initialize box2d physics and create the world - box2d = new PBox2D(this); - box2d.createWorld(); - // We are setting a custom gravity - box2d.setGravity(0,0); - - flock = new Flock(); - // Add an initial set of boids into the system - for (int i = 0; i < 50; i++) { - flock.addBoid(new Boid(new PVector(random(width),random(height)))); - } -} - -void draw() { - // We must always step through time! - box2d.step(); - - background(255); - flock.run(); -} - -void mousePressed() { - flock.addBoid(new Boid(new PVector(mouseX,mouseY))); -} - -void mouseDragged() { - flock.addBoid(new Boid(new PVector(mouseX,mouseY))); -} - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Boid.pde b/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Boid.pde deleted file mode 100644 index 808b7c6d5..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Boid.pde +++ /dev/null @@ -1,185 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float swt = 25.0; //sep.mult(25.0f); -float awt = 4.0; //ali.mult(4.0f); -float cwt = 5.0; //coh.mult(5.0f); -float maxspeed = 1; -float maxforce = 0.025; - - -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - - PVector loc; - PVector vel; - PVector acc; - float r; - - Boid(float x, float y) { - acc = new PVector(0,0); - vel = new PVector(random(-1,1),random(-1,1)); - loc = new PVector(x,y); - r = 2.0; - } - - void run(ArrayList boids) { - flock(boids); - update(); - borders(); - render(); - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acc.add(force); - } - - // We accumulate a new acceleration each time based on three rules - void flock(ArrayList boids) { - PVector sep = separate(boids); // Separation - PVector ali = align(boids); // Alignment - PVector coh = cohesion(boids); // Cohesion - // Arbitrarily weight these forces - sep.mult(swt); - ali.mult(awt); - coh.mult(cwt); - // Add the force vectors to acceleration - applyForce(sep); - applyForce(ali); - applyForce(coh); - } - - // Method to update location - void update() { - // Update velocity - vel.add(acc); - // Limit speed - vel.limit(maxspeed); - loc.add(vel); - // Reset accelertion to 0 each cycle - acc.mult(0); - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = PVector.sub(target,loc); // A vector pointing from the location to the target - - // Normalize desired and scale to maximum speed - desired.normalize(); - desired.mult(maxspeed); - // Steering = Desired minus Velocity - PVector steer = PVector.sub(desired,vel); - steer.limit(maxforce); // Limit to maximum steering force - - return steer; - } - - void render() { - // Draw a triangle rotated in the direction of velocity - float theta = vel.heading2D() + radians(90); - fill(175); - stroke(0); - pushMatrix(); - translate(loc.x,loc.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - // Wraparound - void borders() { - if (loc.x < -r) loc.x = width+r; - if (loc.y < -r) loc.y = height+r; - if (loc.x > width+r) loc.x = -r; - if (loc.y > height+r) loc.y = -r; - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate (ArrayList boids) { - float desiredseparation = 25.0; - PVector steer = new PVector(0,0); - int count = 0; - // For every boid in the system, check if it's too close - for (Boid other : boids) { - float d = PVector.dist(loc,other.loc); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(loc,other.loc); - diff.normalize(); - diff.div(d); // Weight by distance - steer.add(diff); - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer.div((float)count); - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mult(maxspeed); - steer.sub(vel); - steer.limit(maxforce); - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - PVector align (ArrayList boids) { - float neighbordist = 50.0; - PVector steer = new PVector(); - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(loc,other.loc); - if ((d > 0) && (d < neighbordist)) { - steer.add(other.vel); - count++; - } - } - if (count > 0) { - steer.div((float)count); - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer.mult(maxspeed); - steer.sub(vel); - steer.limit(maxforce); - } - return steer; - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - PVector cohesion (ArrayList boids) { - float neighbordist = 50.0; - PVector sum = new PVector(0,0); // Start with empty vector to accumulate all locations - int count = 0; - for (Boid other : boids) { - float d = PVector.dist(loc,other.loc); - if ((d > 0) && (d < neighbordist)) { - sum.add(other.loc); // Add location - count++; - } - } - if (count > 0) { - sum.div((float)count); - return seek(sum); // Steer towards the location - } - return sum; - } -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Flock.pde b/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Flock.pde deleted file mode 100644 index b548b2469..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/Flock.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Flock class -// Does very little, simply manages the ArrayList of all the boids - -class Flock { - ArrayList boids; // An ArrayList for all the boids - - Flock() { - boids = new ArrayList(); // Initialize the ArrayList - } - - void run() { - for (Boid b : boids) { - b.run(boids); // Passing the entire list of boids to each boid individually - } - } - - void addBoid(Boid b) { - boids.add(b); - } - -} diff --git a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/flocking_sliders.pde b/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/flocking_sliders.pde deleted file mode 100644 index afbf53ec4..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/flocking_sliders.pde +++ /dev/null @@ -1,57 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - - -// Flocking -// Demonstration of Craig Reynolds' "Flocking" behavior -// See: http://www.red3d.com/cwr/ -// Rules: Cohesion, Separation, Alignment - -// Click mouse to add boids into the system -Flock flock; -PVector center; - -boolean showvalues = true; -boolean scrollbar = false; - - -void setup() { - size(displayWidth,displayHeight,P2D); - setupScrollbars(); - center = new PVector(width/2,height/2); - colorMode(RGB,255,255,255,100); - flock = new Flock(); - // Add an initial set of boids into the system - for (int i = 0; i < 120; i++) { - flock.addBoid(new Boid(width/2,height/2)); - } - smooth(); -} - - -void draw() { - - background(255); - flock.run(); - drawScrollbars(); - - if (mousePressed && !scrollbar) { - flock.addBoid(new Boid(mouseX,mouseY)); - } - - - if (showvalues) { - fill(0); - textAlign(LEFT); - text("Total boids: " + flock.boids.size() + "\n" + "Framerate: " + round(frameRate) + "\nPress any key to show/hide sliders and text\nClick mouse to add more boids",5,100); - } -} - -void keyPressed() { - showvalues = !showvalues; -} - -void mousePressed() { -} - diff --git a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/keyPressed.pde b/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/keyPressed.pde deleted file mode 100644 index b28b04f64..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/keyPressed.pde +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/scrollbar.pde b/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/scrollbar.pde deleted file mode 100644 index 3a6bc39be..000000000 --- a/java/examples/Books/Nature of Code/chp6_agents/flocking_sliders/scrollbar.pde +++ /dev/null @@ -1,137 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Code based on "Scrollbar" by Casey Reas - -HScrollbar[] hs = new HScrollbar[5];// -String[] labels = {"separation", "alignment","cohesion","maxspeed","maxforce"}; - -int x = 5; -int y = 20; -int w = 50; -int h = 8; -int l = 2; -int spacing = 4; - -void setupScrollbars() { - for (int i = 0; i < hs.length; i++) { - hs[i] = new HScrollbar(x, y + i*(h+spacing), w, h, l); - } - - hs[0].setPos(0.5); - hs[1].setPos(0.5); - hs[2].setPos(0.5); - hs[3].setPos(0.5); - hs[4].setPos(0.05); - -} - -void drawScrollbars() { - //if (showvalues) { - swt = hs[0].getPos()*10.0f; //sep.mult(25.0f); - awt = hs[1].getPos()*2.0f; //sep.mult(25.0f); - cwt = hs[2].getPos()*2.0f; //sep.mult(25.0f); - maxspeed = hs[3].getPos()*10.0f; - maxforce = hs[4].getPos()*0.5; - - - if (showvalues) { - for (int i = 0; i < hs.length; i++) { - hs[i].update(); - hs[i].draw(); - fill(0); - textAlign(LEFT); - text(labels[i],x+w+spacing,y+i*(h+spacing)+spacing); - //text(hs[i].getPos(),x+w+spacing+75,y+i*(h+spacing)+spacing); - } - } -} - - -class HScrollbar -{ - int swidth, sheight; // width and height of bar - int xpos, ypos; // x and y position of bar - float spos, newspos; // x position of slider - int sposMin, sposMax; // max and min values of slider - int loose; // how loose/heavy - boolean over; // is the mouse over the slider? - boolean locked; - float ratio; - - HScrollbar (int xp, int yp, int sw, int sh, int l) { - swidth = sw; - sheight = sh; - int widthtoheight = sw - sh; - ratio = (float)sw / (float)widthtoheight; - xpos = xp; - ypos = yp-sheight/2; - spos = xpos; - newspos = spos; - sposMin = xpos; - sposMax = xpos + swidth - sheight; - loose = l; - } - - void update() { - if(over()) { - over = true; - } - else { - over = false; - } - if(mousePressed && over) { - scrollbar = true; - locked = true; - } - if(!mousePressed) { - locked = false; - scrollbar = false; - } - if(locked) { - newspos = constrain(mouseX-sheight/2, sposMin, sposMax); - } - if(abs(newspos - spos) > 0) { - spos = spos + (newspos-spos)/loose; - } - } - - int constrain(int val, int minv, int maxv) { - return min(max(val, minv), maxv); - } - - boolean over() { - if(mouseX > xpos && mouseX < xpos+swidth && - mouseY > ypos && mouseY < ypos+sheight) { - return true; - } - else { - return false; - } - } - - void draw() { - fill(255); - rectMode(CORNER); - rect(xpos, ypos, swidth, sheight); - if(over || locked) { - fill(153, 102, 0); - } - else { - fill(102, 102, 102); - } - rect(spos, ypos, sheight, sheight); - } - - void setPos(float s) { - spos = xpos + s*(sposMax-sposMin); - newspos = spos; - } - - float getPos() { - // convert spos to be values between - // 0 and the total width of the scrollbar - return ((spos-xpos))/(sposMax-sposMin);// * ratio; - } -} diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/CA.pde deleted file mode 100644 index 57f208c2c..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/CA.pde +++ /dev/null @@ -1,98 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int[] cells; // An array of 0s and 1s - int generation; // How many generations? - - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - - int w = 5; - - CA(int[] r) { - ruleset = r; - cells = new int[width/w]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cells.length; i++) { - cells[i] = 0; - } - cells[cells.length/2] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - // First we create an empty array for the new values - int[] nextgen = new int[cells.length]; - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 1; i < cells.length-1; i++) { - int left = cells[i-1]; // Left neighbor state - int me = cells[i]; // Current state - int right = cells[i+1]; // Right neighbor state - nextgen[i] = rules(left, me, right); // Compute next generation state based on ruleset - } - // The current generation is the new generation - cells = nextgen; - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for (int i = 0; i < cells.length; i++) { - if (cells[i] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, generation*w, w, w); - } - } - - // Implementing the Wolfram rules - // This is the concise conversion to binary way - /*int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - }*/ - // For JavaScript Mode - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[0]; - if (a == 1 && b == 1 && c == 0) return ruleset[1]; - if (a == 1 && b == 0 && c == 1) return ruleset[2]; - if (a == 1 && b == 0 && c == 0) return ruleset[3]; - if (a == 0 && b == 1 && c == 1) return ruleset[4]; - if (a == 0 && b == 1 && c == 0) return ruleset[5]; - if (a == 0 && b == 0 && c == 1) return ruleset[6]; - if (a == 0 && b == 0 && c == 0) return ruleset[7]; - return 0; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/Exercise_7_01_WolframCA_randomizedrules.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/Exercise_7_01_WolframCA_randomizedrules.pde deleted file mode 100644 index f39ae6b7f..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_01_WolframCA_randomizedrules/Exercise_7_01_WolframCA_randomizedrules.pde +++ /dev/null @@ -1,45 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// When the system reaches bottom of the window, it restarts with a new ruleset -// Mouse click restarts as well - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - -int delay = 0; - -void setup() { - size(800, 200); - background(255); - int[] ruleset = { - 0, 1, 0, 1, 1, 0, 1, 0 - }; // An initial rule system - ca = new CA(ruleset); // Initialize CA - frameRate(30); -} - -void draw() { - ca.display(); // Draw the CA - ca.generate(); - - if (ca.finished()) { // If we're done, clear the screen, pick a new ruleset and restart - delay++; - if (delay > 30) { - background(255); - ca.randomize(); - ca.restart(); - delay = 0; - } - } -} - -void mousePressed() { - background(255); - ca.randomize(); - ca.restart(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/CA.pde deleted file mode 100644 index aadb60528..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/CA.pde +++ /dev/null @@ -1,97 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int generation; // How many generations? - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - int w = 4; - int[][] matrix; // Store a history of generations in 2D array, not just one - - int cols; - int rows; - - - CA(int[] r) { - ruleset = r; - cols = width/w; - rows = height/w; - matrix = new int[cols][rows]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - matrix[i][j] = 0; - } - } - matrix[cols/2][0] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 0; i < cols; i++) { - int left = matrix[(i+cols-1)%cols][generation%rows]; // Left neighbor state - int me = matrix[i][generation%rows]; // Current state - int right = matrix[(i+1)%cols][generation%rows]; // Right neighbor state - matrix[i][(generation+1)%rows] = rules(left, me, right); // Compute next generation state based on ruleset - } - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - int offset = generation%rows; - - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - int y = j - offset; - if (y <= 0) y = rows + y; - // Only draw if cell state is 1 - if (matrix[i][j] == 1) { - fill(0); - noStroke(); - rect(i*w, (y-1)*w, w, w); - } - } - } - } - - // Implementing the Wolfram rules - // This is the concise conversion to binary way - int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/Exercise_7_04_WolframCA_scrolling.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/Exercise_7_04_WolframCA_scrolling.pde deleted file mode 100644 index 4107ec882..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling/Exercise_7_04_WolframCA_scrolling.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// with the system scrolling by -// Also implements wrap around - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - - -void setup() { - size(640, 800); - frameRate(24); - background(255); - //int[] ruleset = {0,1,1,1,1,0,1,1}; // Rule 222 - //int[] ruleset = {0,1,1,1,1,1,0,1}; // Rule 190 - //int[] ruleset = {0,1,1,1,1,0,0,0}; // Rule 30 - //int[] ruleset = {0,1,1,1,0,1,1,0}; // Rule 110 - int[] ruleset = {0,1,0,1,1,0,1,0}; // Rule 90 - - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - background(255); - ca.display(); // Draw the CA - ca.generate(); -} diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/CA.pde deleted file mode 100644 index fa62c817f..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/CA.pde +++ /dev/null @@ -1,107 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int generation; // How many generations? - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - int w = 5; - int[][] matrix; // Store a history of generations in 2D array, not just one - - int cols; - int rows; - - - CA(int[] r) { - ruleset = r; - cols = width/w; - rows = height/w; - matrix = new int[cols][rows]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - matrix[i][j] = 0; - } - } - matrix[cols/2][0] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 0; i < cols; i++) { - int left = matrix[(i+cols-1)%cols][generation%rows]; // Left neighbor state - int me = matrix[i][generation%rows]; // Current state - int right = matrix[(i+1)%cols][generation%rows]; // Right neighbor state - matrix[i][(generation+1)%rows] = rules(left, me, right); // Compute next generation state based on ruleset - } - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - int offset = generation%rows; - - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - int y = j - offset; - if (y <= 0) y = rows + y; - if (matrix[i][j] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, (y-1)*w, w, w); - } - } - } - - // Implementing the Wolfram rules - // This is the concise conversion to binary way - /*int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - }*/ - // For JavaScript Mode - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[7]; - if (a == 1 && b == 1 && c == 0) return ruleset[6]; - if (a == 1 && b == 0 && c == 1) return ruleset[5]; - if (a == 1 && b == 0 && c == 0) return ruleset[4]; - if (a == 0 && b == 1 && c == 1) return ruleset[3]; - if (a == 0 && b == 1 && c == 0) return ruleset[2]; - if (a == 0 && b == 0 && c == 1) return ruleset[1]; - if (a == 0 && b == 0 && c == 0) return ruleset[0]; - return 0; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/Exercise_7_04_WolframCA_scrolling_110.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/Exercise_7_04_WolframCA_scrolling_110.pde deleted file mode 100644 index fbf426702..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_110/Exercise_7_04_WolframCA_scrolling_110.pde +++ /dev/null @@ -1,29 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// with the system scrolling by -// Also implements wrap around - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - - -void setup() { - size(800, 100); - frameRate(30); - background(255); - //int[] ruleset = {0,1,1,1,1,0,1,1}; // Rule 222 - //int[] ruleset = {0,1,1,1,1,1,0,1}; // Rule 190 - //int[] ruleset = {0,1,1,1,1,0,0,0}; // Rule 30 - int[] ruleset = {0,1,1,1,0,1,1,0}; // Rule 110 - - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - ca.display(); // Draw the CA - ca.generate(); -} diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/CA.pde deleted file mode 100644 index fa62c817f..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/CA.pde +++ /dev/null @@ -1,107 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int generation; // How many generations? - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - int w = 5; - int[][] matrix; // Store a history of generations in 2D array, not just one - - int cols; - int rows; - - - CA(int[] r) { - ruleset = r; - cols = width/w; - rows = height/w; - matrix = new int[cols][rows]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - matrix[i][j] = 0; - } - } - matrix[cols/2][0] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 0; i < cols; i++) { - int left = matrix[(i+cols-1)%cols][generation%rows]; // Left neighbor state - int me = matrix[i][generation%rows]; // Current state - int right = matrix[(i+1)%cols][generation%rows]; // Right neighbor state - matrix[i][(generation+1)%rows] = rules(left, me, right); // Compute next generation state based on ruleset - } - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - int offset = generation%rows; - - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - int y = j - offset; - if (y <= 0) y = rows + y; - if (matrix[i][j] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, (y-1)*w, w, w); - } - } - } - - // Implementing the Wolfram rules - // This is the concise conversion to binary way - /*int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - }*/ - // For JavaScript Mode - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[7]; - if (a == 1 && b == 1 && c == 0) return ruleset[6]; - if (a == 1 && b == 0 && c == 1) return ruleset[5]; - if (a == 1 && b == 0 && c == 0) return ruleset[4]; - if (a == 0 && b == 1 && c == 1) return ruleset[3]; - if (a == 0 && b == 1 && c == 0) return ruleset[2]; - if (a == 0 && b == 0 && c == 1) return ruleset[1]; - if (a == 0 && b == 0 && c == 0) return ruleset[0]; - return 0; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/Exercise_7_04_WolframCA_scrolling_190.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/Exercise_7_04_WolframCA_scrolling_190.pde deleted file mode 100644 index bf9542216..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_190/Exercise_7_04_WolframCA_scrolling_190.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// with the system scrolling by -// Also implements wrap around - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - - -void setup() { - size(800, 100); - frameRate(30); - background(255); - //int[] ruleset = {0,1,1,1,1,0,1,1}; // Rule 222 - int[] ruleset = {0,1,1,1,1,1,0,1}; // Rule 190 - //int[] ruleset = {0,1,1,1,1,0,0,0}; // Rule 30 - //int[] ruleset = {0,1,1,1,0,1,1,0}; // Rule 110 - - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - ca.display(); // Draw the CA - ca.generate(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/CA.pde deleted file mode 100644 index fa62c817f..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/CA.pde +++ /dev/null @@ -1,107 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int generation; // How many generations? - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - int w = 5; - int[][] matrix; // Store a history of generations in 2D array, not just one - - int cols; - int rows; - - - CA(int[] r) { - ruleset = r; - cols = width/w; - rows = height/w; - matrix = new int[cols][rows]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - matrix[i][j] = 0; - } - } - matrix[cols/2][0] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 0; i < cols; i++) { - int left = matrix[(i+cols-1)%cols][generation%rows]; // Left neighbor state - int me = matrix[i][generation%rows]; // Current state - int right = matrix[(i+1)%cols][generation%rows]; // Right neighbor state - matrix[i][(generation+1)%rows] = rules(left, me, right); // Compute next generation state based on ruleset - } - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - int offset = generation%rows; - - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - int y = j - offset; - if (y <= 0) y = rows + y; - if (matrix[i][j] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, (y-1)*w, w, w); - } - } - } - - // Implementing the Wolfram rules - // This is the concise conversion to binary way - /*int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - }*/ - // For JavaScript Mode - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[7]; - if (a == 1 && b == 1 && c == 0) return ruleset[6]; - if (a == 1 && b == 0 && c == 1) return ruleset[5]; - if (a == 1 && b == 0 && c == 0) return ruleset[4]; - if (a == 0 && b == 1 && c == 1) return ruleset[3]; - if (a == 0 && b == 1 && c == 0) return ruleset[2]; - if (a == 0 && b == 0 && c == 1) return ruleset[1]; - if (a == 0 && b == 0 && c == 0) return ruleset[0]; - return 0; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/Exercise_7_04_WolframCA_scrolling_222.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/Exercise_7_04_WolframCA_scrolling_222.pde deleted file mode 100644 index 24f356e7e..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_222/Exercise_7_04_WolframCA_scrolling_222.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// with the system scrolling by -// Also implements wrap around - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - - -void setup() { - size(800, 100); - frameRate(30); - background(255); - int[] ruleset = {0,1,1,1,1,0,1,1}; // Rule 222 - //int[] ruleset = {0,1,1,1,1,1,0,1}; // Rule 190 - //int[] ruleset = {0,1,1,1,1,0,0,0}; // Rule 30 - //int[] ruleset = {0,1,1,1,0,1,1,0}; // Rule 110 - - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - ca.display(); // Draw the CA - ca.generate(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/CA.pde deleted file mode 100644 index 2353dcb9b..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/CA.pde +++ /dev/null @@ -1,106 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int generation; // How many generations? - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - int w = 5; - int[][] matrix; // Store a history of generations in 2D array, not just one - - int cols; - int rows; - - - CA(int[] r) { - ruleset = r; - cols = width/w; - rows = height/w; - matrix = new int[cols][rows]; - restart(); - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - matrix[i][j] = 0; - } - } - matrix[cols/2][0] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - - // The process of creating the new generation - void generate() { - - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 0; i < cols; i++) { - int left = matrix[(i+cols-1)%cols][generation%rows]; // Left neighbor state - int me = matrix[i][generation%rows]; // Current state - int right = matrix[(i+1)%cols][generation%rows]; // Right neighbor state - matrix[i][(generation+1)%rows] = rules(left, me, right); // Compute next generation state based on ruleset - } - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - int offset = generation%rows; - - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - int y = j - offset; - if (y <= 0) y = rows + y; - if (matrix[i][j] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, (y-1)*w, w, w); - } - } - } - // Implementing the Wolfram rules - // This is the concise conversion to binary way - /*int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s, 2); - return ruleset[index]; - }*/ - // For JavaScript Mode - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[7]; - if (a == 1 && b == 1 && c == 0) return ruleset[6]; - if (a == 1 && b == 0 && c == 1) return ruleset[5]; - if (a == 1 && b == 0 && c == 0) return ruleset[4]; - if (a == 0 && b == 1 && c == 1) return ruleset[3]; - if (a == 0 && b == 1 && c == 0) return ruleset[2]; - if (a == 0 && b == 0 && c == 1) return ruleset[1]; - if (a == 0 && b == 0 && c == 0) return ruleset[0]; - return 0; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/w) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/Exercise_7_04_WolframCA_scrolling_30.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/Exercise_7_04_WolframCA_scrolling_30.pde deleted file mode 100644 index f77d59cb1..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_04_WolframCA_scrolling_30/Exercise_7_04_WolframCA_scrolling_30.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// with the system scrolling by -// Also implements wrap around - -CA ca; // An object to describe a Wolfram elementary Cellular Automata - - -void setup() { - size(800, 100); - frameRate(30); - background(255); - //int[] ruleset = {0,1,1,1,1,0,1,1}; // Rule 222 - //int[] ruleset = {0,1,1,1,1,1,0,1}; // Rule 190 - int[] ruleset = {0,1,1,1,1,0,0,0}; // Rule 30 - //int[] ruleset = {0,1,1,1,0,1,1,0}; // Rule 110 - - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - ca.display(); // Draw the CA - ca.generate(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Cell.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Cell.pde deleted file mode 100644 index 13acf5b88..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Cell.pde +++ /dev/null @@ -1,42 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Cell { - - float x, y; - float w; - float xoff; - float yoff; - - int state; - - Cell(float x_, float y_, float w_) { - x = x_; - y = y_; - w = w_; - xoff = w/2; - yoff = sin(radians(60))*w; - state = int(random(2)); - } - - - void display() { - - fill(state*255); - stroke(0); - pushMatrix(); - translate(x,y); - beginShape(); - vertex(0, yoff); - vertex(xoff, 0); - vertex(xoff+w, 0); - vertex(2*w, yoff); - vertex(xoff+w, 2*yoff); - vertex(xoff, 2*yoff); - vertex(0, yoff); - endShape(); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Exercise_7_09_HexagonCells.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Exercise_7_09_HexagonCells.pde deleted file mode 100644 index 38b7e4e27..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/Exercise_7_09_HexagonCells.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Outline for game of life -// This is just a grid of hexagons right now - -GOL gol; - -void setup() { - size(640, 360); - gol = new GOL(); -} - -void draw() { - background(255); - gol.display(); -} - -// reset board when mouse is pressed -void mousePressed() { - gol.init(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/GOL.pde b/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/GOL.pde deleted file mode 100644 index 1f1491abe..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Exercise_7_09_HexagonCells/GOL.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class GOL { - - float w = 20; - float h = sin(radians(60))*w; - int columns, rows; - - // Game of life board - Cell[][] board; - - - GOL() { - // Initialize rows, columns and set-up arrays - columns = width/int(w*3); - rows = height/int(h); - board = new Cell[columns][rows]; - init(); - } - - void init() { - float h = sin(radians(60))*w; - for (int i = 0; i < columns; i++) { - for (int j = 0; j < rows; j++) { - if (j % 2 == 0) board[i][j] = new Cell(i*w*3, j*h,w); - else board[i][j] = new Cell(i*w*3+w+h/2, j*h, w); - } - } - } - - - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - board[i][j].display(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/Figure_7_17_cells.pde b/java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/Figure_7_17_cells.pde deleted file mode 100644 index ef16d1b06..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/Figure_7_17_cells.pde +++ /dev/null @@ -1,31 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -size(1800,90); - -int w = 90; - -int total = width/w; - -int[] cells = {1,0,1,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0}; - - -print("int[] cells = {"); -for (int i = 0; i < cells.length; i++) { - if (cells[i] == 0) fill(255); - else fill(64); - stroke(0); - rect(i*w,0,w-1,w-1); - print(cells[i] +","); -} - -saveFrame("cells.png"); - - - - - - - - diff --git a/java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/cells.tif b/java/examples/Books/Nature of Code/chp7_CA/Figure_7_17_cells/cells.tif deleted file mode 100644 index 38ef13501fddfbe9a3b66bc778d2b839a9253b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486768 zcmeI!L5?0)6-427f=C!L0QSHt*g!VG5*RUN@jyE^(vhxShD_?~DDBd3Tb9l}RsDYX z<>Rj(A0Iz|{Ndx@AHVxdUq1i;`t8TBzx?#`=eIB4^2gsl^AEq~ufO-NFTel(`469; z|M7o+_s5SffBOFU=b!rW=ltEjeE%~){o|is|BcUo^Xq@U5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0;r|4HC)zJ4X}jro6k{Yu~)4QhNNz>U@d4KzxinH!ge6}6(Z;#>9; zw!J_DjS^_~Go|Z+1{x*MY(?*G^poYxjb7i1-reXY%UM%2<>fy&xbfR=ync7>b3b8w zaWpQCF3ED{1~*>*dvBBs8ka`9vz)DHuaCy1(e5l~E86R$acQ(W%h`(d`kJCC^`V&? z+^7%DRuqjAXy(SH(Ir{V+~CH`fA5WwLF3YBcb2mi?e)>PG}@izY(;y0G%k&HXE|HZ zUSCr*r9L!sgB$gs*@~i30?pjGG`b|qnH$`A`R~0^GH6^H?ap$xqP;#Emqxp@oULfD zkH)3Z?ks03+UskIrqqXKZg8VMG+R+LN}!n=mqwRlIdg*>FaNzaN(PNfqup7~RkZu z%#BN!WdLv^&e$iuU?wTpI1pa<-zqzNTnOeQ4$e zH|j&P6-A>2nz?albV-&oH@NZg-+QBE(6}_(o#kvrdwn!6jdo`_ThU%0jZ355Sue4yR)3FXs?gPrP1yzXDiz4 zqj71pJImRM_WGKlDfOY58{DW5%~lkR5@_berO_o>&fMU}%YW~Ul0oCrXm^&g747xW zxHQ_GPG}@izY(;y0P0^J4(98{P)Q4s(ibe@E zbK}zJk}PL#aO35__eRN}acQ(W%h`(d`eU6SR@4Q{;r_ueQOG%k&HXE|HZULTE1qup7~RO(U(xKSUPttc8L(9DfXqf4@!xxtN>|K1xVgT|%N?ks03+UuinX|y}b*^2i1 zXj~fY&T_V*y}qVsN_}YN1~=+MvlT_71e&>VX>>`JGdH;L^51)-WYD-Y+MVTWMSFcT zE{%3)Ia|?QAB{_+-C537wAa@ZO{ovf+~7uiXtttglt42#E{!h9a^?m%UjBP;lnfe| zM!U0|t!S^0#--8jEN3g)>!WdLv^&e$iuU@NqAB&EnH$`w56xB-jS^_)#--6ES;>2jgmp*(r9;hXm^&g747xWxHQ_G#1fo5)88eNj*%nfe5{P*4{88j}9c4s+T(Ow^o zOQYRc&Q`S7N8{3Hcb2mi?e#T9Q|d!AH@HzBnyn}rCD6=`OQTD&oVme`m;c@yC4uZXp)Q4tnaHBpnTTwJhpqU$&MwetcbAuZ%|GhU#28~Oj-C537wAV-D z(r9;D~D1l~fTpC@H<;)Fk zy!`jxC>b;^jdo`_ThU%0jZ355ShXm^&g747vkMN{fSGdH+VADXQw8YR%o zjZ33TvYffWjhFx48zqCrrP1yzXDiz4qj71pJImRM_WEdC8tu+O->?MWY0oxp8T9NtQD=xbgDed!uB~xHQ_G*dvBBs8ka`9vz)DHuaCy1(e5l~E86R$ zacQ(W%h`(d`kJCC^`V&?+^7%DRuqjAXy(SH(Ir{V+~CH`fA5WwLF3YBcb2mi?e)>P zG}@izY(;y0G%k&HXE|HZUSCr*r9L!sgB$gs*@~i30?pjGG`b|qnH$`A`R~0^GH6^H z?ap$xqP;#Emqxp@oULfDkH)3Z?ks03+UskIrqqXKZg8VMG+R+LN}!n=mqwRlIdg*> zFaNzaN(PNfqup7~RkZu%#BN!WdLv^&e$iuU?w zTpI1pa<-zqzNTnOeQ4$eH|j&P6-A>2nz?albV-&oH@NZg-+QBE(6}_(o#kvrdwn!6 zjdo`_ThU%0jZ355Sue4 zyR)3FXs?gPrP1yzXDiz4qj71pJImRM_WGKlDfOY58{DW5%~lkR5@_berO_o>&fMU} z%YW~Ul0oCrXm^&g747xWxHQ_GPG}@izY(;y0 zP0^J4(98{P)Q4s(ibe@EbK}zJk}PL#aO35__eRN}acQ(W%h`(d`eU6SR@4Q{;r_ueQOG%k&HXE|HZULTE1 zqup7~RO(U(xKSUPttc8L(9DfXqf4@!xxtN>|K1xVgT|%N z?ks03+UuinX|y}b*^2i1Xj~fY&T_V*y}qVsN_}YN1~=+MvlT_71e&>VX>>`JGdH;L z^51)-WYD-Y+MVTWMSFcTE{%3)Ia|?QAB{_+-C537wAa@ZO{ovf+~7uiXtttglt42# zE{!h9a^?m%UjBP;lnfe|M!U0|t!S^0#--8jEN3g)>!WdLv^&e$iuU@NqAB&EnH$`w z56xB-jS^_)#--6ES;>2jgmp*(r9;h zXm^&g747xWxHQ_G#1fo5)88eNj*%nfe5 z{P*4{88j}9c4s+T(Ow^oOQYRc&Q`S7N8{3Hcb2mi?e#T9Q|d!AH@HzBnyn}rCD6=` zOQTD&oVme`m;c@yC4uZXp)Q4tnaHBpnTTwJhpqU$&MwetcbAuZ% z|GhU#28~Oj-C537wAV-D(r9;D~D1l~fTpC@H<;)Fky!`jxC>b;^jdo`_ThU%0jZ355ShXm^&g747vk zMN{fSGdH+VADXQw8YR%ojZ33TvYffWjhFx48zqCrrP1yzXDiz4qj71pJImRM_WEdC z8tu+O->?MWY0oxp8T9NtQD=xbgDed!uB~xHQ_G*dvBBs8ka`9 zvz)DHuaCy1(e5l~E86R$acQ(W%h`(d`kJCC^`V&?+^7%DRuqjAXy(SH(Ir{V+~CH` zfA5WwLF3YBcb2mi?e)>PG}@izY(;y0G%k&HXE|HZUSCr*r9L!sgB$gs*@~i30?pjG zG`b|qnH$`A`R~0^GH6^H?ap$xqP;#Emqxp@oULfDkH)3Z?ks03+UskIrqqXKZg8VM zG+R+LN}!n=mqwRlIdg*>FaNzaN(PNfqup7~RkZu%#BN!WdLv^&e$iuU?wTpI1pa<-zqzNTnOeQ4$eH|j&P6-A>2nz?albV-&oH@NZg z-+QBE(6}_(o#kvrdwn!6jdo`_ThU%0jZ355Sue4yR)3FXs?gPrP1yzXDiz4qj71pJImRM_WGKlDfOY58{DW5 z%~lkR5@_berO_o>&fMU}%YW~Ul0oCrXm^&g747xWxHQ_GPG}@izY(;y0P0^J4(98{P)Q4s(ibe@EbK}zJk}PL#aO35__eRN}acQ(W z%h`(d`eU6SR@4Q{;r z_ueQOG%k&HXE|HZULTE1qup7~RO(U(xKSUPttc8L(9DfX zqf4@!xxtN>|K1xVgT|%N?ks03+UuinX|y}b*^2i1Xj~fY&T_V*y}qVsN_}YN1~=+M zvlT_71e&>VX>>`JGdH;L^51)-WYD-Y+MVTWMSFcTE{%3)Ia|?QAB{_+-C537wAa@Z zO{ovf+~7uiXtttglt42#E{!h9a^?m%UjBP;lnfe|M!U0|t!S^0#--8jEN3g)>!WdL zv^&e$iuU@NqAB&EnH$`w56xB-jS^_)#--6ES;>2jgmp*(r9;hXm^&g747xWxHQ_G#1fo5)88eNj*%nfe5{P*4{88j}9c4s+T(Ow^oOQYRc&Q`S7N8{3Hcb2mi?e#T9 zQ|d!AH@HzBnyn}rCD6=`OQTD&oVme`m;c@yC4 3)) next[x][y] = 0; // Overpopulation - else if ((board[x][y] == 0) && (neighbors == 3)) next[x][y] = 1; // Reproduction - else next[x][y] = board[x][y]; // Stasis - } - } - - // Next is now our board - board = next; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - if ((board[i][j] == 1)) fill(0); - else fill(255); - stroke(0); - rect(i*w, j*w, w, w); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/GameOfLifeWrapAround/GameOfLifeWrapAround.pde b/java/examples/Books/Nature of Code/chp7_CA/GameOfLifeWrapAround/GameOfLifeWrapAround.pde deleted file mode 100644 index f807dbebc..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/GameOfLifeWrapAround/GameOfLifeWrapAround.pde +++ /dev/null @@ -1,33 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Daniel Shiffman, Nature of Code - -// A basic implementation of John Conway's Game of Life CA -// how could this be improved to use object oriented programming? -// think of it as similar to our particle system, with a "cell" class -// to describe each individual cell and a "cellular automata" class -// to describe a collection of cells - -// Cells wrap around - -GOL gol; - -void setup() { - size(400, 400); - gol = new GOL(); -} - -void draw() { - background(255); - - gol.generate(); - gol.display(); -} - -// reset board when mouse is pressed -void mousePressed() { - gol.init(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/Cell.pde b/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/Cell.pde deleted file mode 100644 index 13acf5b88..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/Cell.pde +++ /dev/null @@ -1,42 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Cell { - - float x, y; - float w; - float xoff; - float yoff; - - int state; - - Cell(float x_, float y_, float w_) { - x = x_; - y = y_; - w = w_; - xoff = w/2; - yoff = sin(radians(60))*w; - state = int(random(2)); - } - - - void display() { - - fill(state*255); - stroke(0); - pushMatrix(); - translate(x,y); - beginShape(); - vertex(0, yoff); - vertex(xoff, 0); - vertex(xoff+w, 0); - vertex(2*w, yoff); - vertex(xoff+w, 2*yoff); - vertex(xoff, 2*yoff); - vertex(0, yoff); - endShape(); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/GOL.pde b/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/GOL.pde deleted file mode 100644 index 1f1491abe..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/GOL.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class GOL { - - float w = 20; - float h = sin(radians(60))*w; - int columns, rows; - - // Game of life board - Cell[][] board; - - - GOL() { - // Initialize rows, columns and set-up arrays - columns = width/int(w*3); - rows = height/int(h); - board = new Cell[columns][rows]; - init(); - } - - void init() { - float h = sin(radians(60))*w; - for (int i = 0; i < columns; i++) { - for (int j = 0; j < rows; j++) { - if (j % 2 == 0) board[i][j] = new Cell(i*w*3, j*h,w); - else board[i][j] = new Cell(i*w*3+w+h/2, j*h, w); - } - } - } - - - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - board[i][j].display(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/HexagonCells.pde b/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/HexagonCells.pde deleted file mode 100644 index 6bd52053b..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/HexagonCells/HexagonCells.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Outline for game of life -// This is just a grid of hexagons right now - -GOL gol; - -void setup() { - size(600, 600); - gol = new GOL(); -} - -void draw() { - background(255); - gol.display(); -} - -// reset board when mouse is pressed -void mousePressed() { - gol.init(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/CA.pde deleted file mode 100644 index b0309e63b..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/CA.pde +++ /dev/null @@ -1,95 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int[] cells; // An array of 0s and 1s - int generation; // How many generations? - - int[] ruleset; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - - CA(int[] r) { - ruleset = r; - cells = new int[width/scl]; - restart(); - } - - CA() { - scl = 1; - cells = new int[width/scl]; - randomize(); - restart(); - } - - // Set the rules of the CA - void setRules(int[] r) { - ruleset = r; - } - - // Make a random ruleset - void randomize() { - for (int i = 0; i < 8; i++) { - ruleset[i] = int(random(2)); - } - } - - // Reset to generation 0 - void restart() { - for (int i = 0; i < cells.length; i++) { - cells[i] = 0; - } - cells[cells.length/2] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - // The process of creating the new generation - void generate() { - // First we create an empty array for the new values - int[] nextgen = new int[cells.length]; - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 1; i < cells.length-1; i++) { - int left = cells[i-1]; // Left neighbor state - int me = cells[i]; // Current state - int right = cells[i+1]; // Right neighbor state - nextgen[i] = rules(left, me, right); // Compute next generation state based on ruleset - } - // The current generation is the new generation - cells = nextgen; - generation++; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void render() { - for (int i = 0; i < cells.length; i++) { - if (cells[i] == 1) fill(0); - else fill(255); - stroke(0); - rect(i*scl, generation*scl, scl, scl); - } - } - - // Implementing the Wolfram rules - // Could be improved and made more concise, but here we can explicitly see what is going on for each case - int rules (int a, int b, int c) { - String s = "" + a + b + c; - int index = Integer.parseInt(s,2); - return ruleset[index]; - } - - // The CA is done if it reaches the bottom of the screen - boolean finished() { - if (generation > height/scl) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/NOC_7_01_WolframCA_figures.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/NOC_7_01_WolframCA_figures.pde deleted file mode 100644 index 8e7ea3f4c..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_figures/NOC_7_01_WolframCA_figures.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata -// When the system reaches bottom of the window, it restarts with a new ruleset -// Mouse click restarts as well - - -CA ca; // An instance object to describe the Wolfram basic Cellular Automata - -int scl = 20; - -void setup() { - size(1800,600); - background(255); - //int[] ruleset = {0,1,0,1,1,0,1,0}; // 90 - int[] ruleset = {0,1,1,1,1,0,1,1}; // An initial rule system - ca = new CA(ruleset); // Initialize CA -} - -void draw() { - ca.render(); // Draw the CA - ca.generate(); // Generate the next level - - if (ca.finished()) { // If we're done, clear the screen, pick a new ruleset and restart - saveFrame("rule222.png"); - noLoop(); - } -} - -void mousePressed() { - background(255); - ca.randomize(); - ca.restart(); -} diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/CA.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/CA.pde deleted file mode 100644 index a6e158470..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/CA.pde +++ /dev/null @@ -1,70 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Wolfram Cellular Automata - -// A class to manage the CA - -class CA { - - int[] cells; // An array of 0s and 1s - int generation; // How many generations? - - int[] ruleset = {0, 1, 0, 1, 1, 0, 1, 0}; // An array to store the ruleset, for example {0,1,1,0,1,1,0,1} - - int w = 10; - - CA() { - cells = new int[width/w]; - for (int i = 0; i < cells.length; i++) { - cells[i] = 0; - } - cells[cells.length/2] = 1; // We arbitrarily start with just the middle cell having a state of "1" - generation = 0; - } - - // The process of creating the new generation - void generate() { - // First we create an empty array for the new values - int[] nextgen = new int[cells.length]; - // For every spot, determine new state by examing current state, and neighbor states - // Ignore edges that only have one neighor - for (int i = 1; i < cells.length-1; i++) { - int left = cells[i-1]; // Left neighbor state - int me = cells[i]; // Current state - int right = cells[i+1]; // Right neighbor state - nextgen[i] = rules(left, me, right); // Compute next generation state based on ruleset - } - // The current generation is the new generation - cells = nextgen; - generation++; - - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for (int i = 0; i < cells.length; i++) { - if (cells[i] == 1) fill(0); - else fill(255); - noStroke(); - rect(i*w, generation*w, w, w); - } - } - - - - // Implementing the Wolfram rules - // Could be improved and made more concise, but here we can explicitly see what is going on for each case - int rules (int a, int b, int c) { - if (a == 1 && b == 1 && c == 1) return ruleset[0]; - if (a == 1 && b == 1 && c == 0) return ruleset[1]; - if (a == 1 && b == 0 && c == 1) return ruleset[2]; - if (a == 1 && b == 0 && c == 0) return ruleset[3]; - if (a == 0 && b == 1 && c == 1) return ruleset[4]; - if (a == 0 && b == 1 && c == 0) return ruleset[5]; - if (a == 0 && b == 0 && c == 1) return ruleset[6]; - if (a == 0 && b == 0 && c == 0) return ruleset[7]; - return 0; - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/NOC_7_01_WolframCA_simple.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/NOC_7_01_WolframCA_simple.pde deleted file mode 100644 index e26b35453..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_01_WolframCA_simple/NOC_7_01_WolframCA_simple.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Wolfram Cellular Automata - -// Simple demonstration of a Wolfram 1-dimensional cellular automata - -CA ca; // An instance object to describe the Wolfram basic Cellular Automata - - -void setup() { - size(800, 400); - background(255); - ca = new CA(); // Initialize CA -} - -void draw() { - ca.display(); // Draw the CA - if (ca.generation < height/ca.w) { - ca.generate(); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/GOL.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/GOL.pde deleted file mode 100644 index 413318d9d..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/GOL.pde +++ /dev/null @@ -1,77 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class GOL { - - int w = 8; - int columns, rows; - - // Game of life board - int[][] board; - - - GOL() { - // Initialize rows, columns and set-up arrays - columns = width/w; - rows = height/w; - board = new int[columns][rows]; - //next = new int[columns][rows]; - // Call function to fill array with random values 0 or 1 - init(); - } - - void init() { - for (int i =1;i < columns-1;i++) { - for (int j =1;j < rows-1;j++) { - board[i][j] = int(random(2)); - } - } - } - - // The process of creating the new generation - void generate() { - - int[][] next = new int[columns][rows]; - - // Loop through every spot in our 2D array and check spots neighbors - for (int x = 1; x < columns-1; x++) { - for (int y = 1; y < rows-1; y++) { - - // Add up all the states in a 3x3 surrounding grid - int neighbors = 0; - for (int i = -1; i <= 1; i++) { - for (int j = -1; j <= 1; j++) { - neighbors += board[x+i][y+j]; - } - } - - // A little trick to subtract the current cell's state since - // we added it in the above loop - neighbors -= board[x][y]; - - // Rules of Life - if ((board[x][y] == 1) && (neighbors < 2)) next[x][y] = 0; // Loneliness - else if ((board[x][y] == 1) && (neighbors > 3)) next[x][y] = 0; // Overpopulation - else if ((board[x][y] == 0) && (neighbors == 3)) next[x][y] = 1; // Reproduction - else next[x][y] = board[x][y]; // Stasis - } - } - - // Next is now our board - board = next; - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - if ((board[i][j] == 1)) fill(0); - else fill(255); - stroke(0); - rect(i*w, j*w, w, w); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/NOC_7_02_GameOfLifeSimple.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/NOC_7_02_GameOfLifeSimple.pde deleted file mode 100644 index 4526630f8..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_02_GameOfLifeSimple/NOC_7_02_GameOfLifeSimple.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A basic implementation of John Conway's Game of Life CA -// how could this be improved to use object oriented programming? -// think of it as similar to our particle system, with a "cell" class -// to describe each individual cell and a "cellular automata" class -// to describe a collection of cells - -GOL gol; - -void setup() { - size(640, 360); - frameRate(24); - gol = new GOL(); -} - -void draw() { - background(255); - - gol.generate(); - gol.display(); -} - -// reset board when mouse is pressed -void mousePressed() { - gol.init(); -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/Cell.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/Cell.pde deleted file mode 100644 index d18e16933..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/Cell.pde +++ /dev/null @@ -1,40 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Cell { - - float x, y; - float w; - - int state; - int previous; - - Cell(float x_, float y_, float w_) { - x = x_; - y = y_; - w = w_; - - state = int(random(2)); - previous = state; - } - - void savePrevious() { - previous = state; - } - - void newState(int s) { - state = s; - } - - void display() { - if (previous == 0 && state == 1) fill(0,0,255); - else if (state == 1) fill(0); - else if (previous == 1 && state == 0) fill(255,0,0); - else fill(255); - stroke(0); - rect(x, y, w, w); - } -} - - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/GOL.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/GOL.pde deleted file mode 100644 index cdf3f3ad2..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/GOL.pde +++ /dev/null @@ -1,73 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class GOL { - - int w = 8; - int columns, rows; - - // Game of life board - Cell[][] board; - - - GOL() { - // Initialize rows, columns and set-up arrays - columns = width/w; - rows = height/w; - board = new Cell[columns][rows]; - init(); - } - - void init() { - for (int i = 0; i < columns; i++) { - for (int j = 0; j < rows; j++) { - board[i][j] = new Cell(i*w, j*w, w); - } - } - } - - // The process of creating the new generation - void generate() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - board[i][j].savePrevious(); - } - } - - - // Loop through every spot in our 2D array and check spots neighbors - for (int x = 0; x < columns; x++) { - for (int y = 0; y < rows; y++) { - - // Add up all the states in a 3x3 surrounding grid - int neighbors = 0; - for (int i = -1; i <= 1; i++) { - for (int j = -1; j <= 1; j++) { - neighbors += board[(x+i+columns)%columns][(y+j+rows)%rows].previous; - } - } - - // A little trick to subtract the current cell's state since - // we added it in the above loop - neighbors -= board[x][y].previous; - - // Rules of Life - if ((board[x][y].state == 1) && (neighbors < 2)) board[x][y].newState(0); // Loneliness - else if ((board[x][y].state == 1) && (neighbors > 3)) board[x][y].newState(0); // Overpopulation - else if ((board[x][y].state == 0) && (neighbors == 3)) board[x][y].newState(1); // Reproduction - // else do nothing! - } - } - } - - // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0' - void display() { - for ( int i = 0; i < columns;i++) { - for ( int j = 0; j < rows;j++) { - board[i][j].display(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/NOC_7_03_GameOfLifeOOP.pde b/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/NOC_7_03_GameOfLifeOOP.pde deleted file mode 100644 index 32227dd01..000000000 --- a/java/examples/Books/Nature of Code/chp7_CA/NOC_7_03_GameOfLifeOOP/NOC_7_03_GameOfLifeOOP.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A basic implementation of John Conway's Game of Life CA - -// Each cell is now an object! - -GOL gol; - -void setup() { - size(640, 360); - gol = new GOL(); -} - -void draw() { - background(255); - - gol.generate(); - gol.display(); -} - -// reset board when mouse is pressed -void mousePressed() { - gol.init(); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/CantorSetArrayList.pde b/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/CantorSetArrayList.pde deleted file mode 100644 index 3c3d86023..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/CantorSetArrayList.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Cantor Set -// Renders a simple fractal, the Cantor Set -// Uses an ArrayList to store list of objects -// Generates when mouse is pressed - -float h = 30; - -// List of line objects -ArrayList cantor; - -void setup() { - size(729, 200); - - // Start with one line - cantor = new ArrayList(); - cantor.add(new CantorLine(0, 100, width)); -} - -// Click the mouse to advance the sequence -void mousePressed() { - generate(); -} - -void draw() { - background(255); - // Always show all the lines - for (CantorLine cl : cantor) { - cl.display(); - } - - fill(0); - text("Click mouse to generate",10,height-20); -} - -void generate() { - // Generate the next set of lines - ArrayList next = new ArrayList(); - for (CantorLine cl : cantor) { - next.add(new CantorLine(cl.x,cl.y,cl.len/3)); - next.add(new CantorLine(cl.x+cl.len*2/3,cl.y,cl.len/3)); - } - cantor = next; -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/Line.pde b/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/Line.pde deleted file mode 100644 index 2677ac37b..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/CantorSetArrayList/Line.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Cantor line is a simple horizontal line with a starting point -// and length - -class CantorLine { - float x,y; - float len; - - CantorLine(float x_, float y_, float len_) { - x = x_; - y = y_; - len = len_; - } - - void display() { - stroke(0); - line(x,y,x+len,y); - } - -} diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_01_RecursionLines/Exercise_8_01_RecursionLines.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_01_RecursionLines/Exercise_8_01_RecursionLines.pde deleted file mode 100644 index e90258a0b..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_01_RecursionLines/Exercise_8_01_RecursionLines.pde +++ /dev/null @@ -1,36 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Recursion - -void setup() { - size(800, 200); -} - -void draw() { - background(255); - drawLines(100,100,700,100); - noLoop(); -} - -void drawLines(float x1, float y1, float x2, float y2) { - - line(x1,y1,x2,y2); - - float dx = x2-x1; - float dy = y2-y1; - - //println(dx + " " + dy); - - if (dx == 0 && dy > 4) { - //println(dy); - drawLines(x1-dy/3,y1,x1+dy/3,y1); - drawLines(x1-dy/3,y2,x1+dy/3,y2); - } else if (dy == 0 && dx > 4) { - //println(dx); - drawLines(x1,y1-dx/3,x1,y1+dx/3); - drawLines(x2,y1-dx/3,x2,y1+dx/3); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/Exercise_8_02_KochSnowFlake.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/Exercise_8_02_KochSnowFlake.pde deleted file mode 100644 index c5e5f6b86..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/Exercise_8_02_KochSnowFlake.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Snowflake - -// Renders a simple fractal, the Koch snowflake -// Each recursive level drawn in sequence - -ArrayList lines ; // A list to keep track of all the lines - -void setup() { - size(600, 692); - background(255); - lines = new ArrayList(); - PVector a = new PVector(0, 173); - PVector b = new PVector(width, 173); - PVector c = new PVector(width/2, 173+width*cos(radians(30))); - - // Starting with additional lines - lines.add(new KochLine(a, b)); - lines.add(new KochLine(b, c)); - lines.add(new KochLine(c, a)); - - for (int i = 0; i < 5; i++) { - generate(); - } -} - -void draw() { - background(255); - for (KochLine l : lines) { - l.display(); - } -} - -void generate() { - ArrayList next = new ArrayList(); // Create emtpy list - for (KochLine l : lines) { - // Calculate 5 koch PVectors (done for us by the line object) - PVector a = l.kochA(); - PVector b = l.kochB(); - PVector c = l.kochC(); - PVector d = l.kochD(); - PVector e = l.kochE(); - // Make line segments between all the PVectors and add them - next.add(new KochLine(a, b)); - next.add(new KochLine(b, c)); - next.add(new KochLine(c, d)); - next.add(new KochLine(d, e)); - } - lines = next; -} - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/KochLine.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/KochLine.pde deleted file mode 100644 index 8b2b5aab9..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_02_KochSnowFlake/KochLine.pde +++ /dev/null @@ -1,75 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve - -// A class to describe one line segment in the fractal -// Includes methods to calculate midPVectors along the line according to the Koch algorithm - -class KochLine { - - // Two PVectors, - // a is the "left" PVector and - // b is the "right PVector - PVector start; - PVector end; - - KochLine(PVector a, PVector b) { - start = a.get(); - end = b.get(); - } - - void display() { - stroke(0); - strokeWeight(2); - line(start.x, start.y, end.x, end.y); - } - - PVector kochA() { - return start.get(); - } - - - // This is easy, just 1/3 of the way - PVector kochB() { - PVector v = PVector.sub(end, start); - v.div(3); - v.add(start); - return v; - } - - // More complicated, have to use a little trig to figure out where this PVector is! - PVector kochC() { - PVector a = start.get(); // Start at the beginning - - PVector v = PVector.sub(end, start); - v.div(3); - a.add(v); // Move to point B - - rotate(v, -radians(60)); // Rotate 60 degrees - a.add(v); // Move to point C - - return a; - } - - // Easy, just 2/3 of the way - PVector kochD() { - PVector v = PVector.sub(end, start); - v.mult(2/3.0); - v.add(start); - return v; - } - - PVector kochE() { - return end.get(); - } -} - -public void rotate(PVector v, float theta) { - float xTemp = v.x; - // Might need to check for rounding errors like with angleBetween function? - v.x = v.x*PApplet.cos(theta) - v.y*PApplet.sin(theta); - v.y = xTemp*PApplet.sin(theta) + v.y*PApplet.cos(theta); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_06_Tree/Exercise_8_06_Tree.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_06_Tree/Exercise_8_06_Tree.pde deleted file mode 100644 index ced569b79..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_06_Tree/Exercise_8_06_Tree.pde +++ /dev/null @@ -1,58 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree - -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -float theta; - -void setup() { - size(1800, 500); - smooth(); -} - -void draw() { - background(255); - // Let's pick an angle 0 to 90 degrees based on the mouse position - theta = PI/6;//map(mouseX,0,width,0,PI/2); - - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(200,0); - save("chapter08_exc06.png"); - noLoop(); -} - -void branch(float len, int level) { - // Each branch will be 2/3rds the size of the previous one - - //float sw = map(len,2,120,1,10); - //strokeWeight(sw); - strokeWeight(2); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - level++; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (level < 5) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(len,level); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-theta); - branch(len,level); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_07_Tree/Exercise_8_07_Tree.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_07_Tree/Exercise_8_07_Tree.pde deleted file mode 100644 index 3019d44ca..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_07_Tree/Exercise_8_07_Tree.pde +++ /dev/null @@ -1,51 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -float theta; - -void setup() { - size(640, 360); -} - -void draw() { - background(255); - // Let's pick an angle 0 to 90 degrees based on the mouse position - theta = map(mouseX,0,width,0,PI/2); - - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(60); -} - -void branch(float len) { - // Each branch will be 2/3rds the size of the previous one - float sw = map(len,2,120,1,10); - strokeWeight(sw); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (len > 2) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(len); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-theta); - branch(len); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Branch.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Branch.pde deleted file mode 100644 index 7c5e8b9c8..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Branch.pde +++ /dev/null @@ -1,68 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree (w/ ArrayList) - -// A class for one branch in the system - -class Branch { - // Each has a location, velocity, and timer - // We could implement this same idea with different data - PVector start; - PVector end; - PVector vel; - float timer; - float timerstart; - - boolean growing = true; - - Branch(PVector l, PVector v, float n) { - start = l.get(); - end = l.get(); - vel = v.get(); - timerstart = n; - timer = timerstart; - } - - // Move location - void update() { - if (growing) { - end.add(vel); - } - } - - // Draw a dot at location - void render() { - stroke(0); - line(start.x,start.y,end.x,end.y); - } - - // Did the timer run out? - boolean timeToBranch() { - timer--; - if (timer < 0 && growing) { - growing = false; - return true; - } - else { - return false; - } - } - - // Create a new branch at the current location, but change direction by a given angle - Branch branch(float angle) { - // What is my current heading - float theta = vel.heading2D(); - // What is my current speed - float mag = vel.mag(); - // Turn me - theta += radians(angle); - // Look, polar coordinates to cartesian!! - PVector newvel = new PVector(mag*cos(theta),mag*sin(theta)); - // Return a new Branch - return new Branch(end,newvel,timerstart*0.66f); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Exercise_8_08_09_TreeArrayListLeaves.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Exercise_8_08_09_TreeArrayListLeaves.pde deleted file mode 100644 index 2900307cf..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Exercise_8_08_09_TreeArrayListLeaves.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree (w/ ArrayList) -// Nature of Code, Chapter 8 - -// Recursive branching "structure" without an explicitly recursive function -// Instead we have an ArrayList to hold onto N number of elements -// For every element in the ArrayList, we add 2 more elements, etc. (this is the recursion) - -// An arraylist that will keep track of all current branches -ArrayList tree; -ArrayList leaves; - -void setup() { - size(640,360); - background(255); - // Setup the arraylist and add one branch to it - tree = new ArrayList(); - leaves = new ArrayList(); - // A branch has a starting location, a starting "velocity", and a starting "timer" - Branch b = new Branch(new PVector(width/2,height),new PVector(0,-1),100); - // Add to arraylist - tree.add(b); -} - -void draw() { - background(255); - - // Let's stop when the arraylist gets too big - // For every branch in the arraylist - for (int i = tree.size()-1; i >= 0; i--) { - // Get the branch, update and draw it - Branch b = tree.get(i); - b.update(); - b.render(); - // If it's ready to split - if (b.timeToBranch()) { - if (tree.size() < 1024) { - //tree.remove(i); // Delete it - tree.add(b.branch( 30)); // Add one going right - tree.add(b.branch(-25)); // Add one going left - } - else { - leaves.add(new Leaf(b.end)); - } - } - } - - for (Leaf leaf : leaves) { - leaf.display(); - } - -} - - - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Leaf.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Leaf.pde deleted file mode 100644 index 94ffd407e..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_08_09_TreeArrayListLeaves/Leaf.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree (w/ ArrayList) - -// A class for a leaf that gets placed at the end of -// the last branches - -class Leaf { - PVector loc; - - Leaf(PVector l) { - loc = l.get(); - } - - void display() { - noStroke(); - fill(50,100); - ellipse(loc.x,loc.y,4,4); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_10_TreeStochasticNoise/Exercise_8_10_TreeStochasticNoise.pde b/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_10_TreeStochasticNoise/Exercise_8_10_TreeStochasticNoise.pde deleted file mode 100644 index 5a0bf3792..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Exercise_8_10_TreeStochasticNoise/Exercise_8_10_TreeStochasticNoise.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stochastic Tree with angles fluctuating with Perlin noise -// Nature of Code, Chapter 8 - -// Perlin noise offset -float yoff = 0; -// Random seed to control randomness while drawing the tree -int seed = 5; - - -void setup() { - size(800, 200); - smooth(); -} - -void draw() { - background(255); - fill(0); - //text("Click mouse to generate a new tree", 10, height-20); - - stroke(0); - // Start the tree from the bottom of the screen - translate(width/2, height); - // Move alogn through noise - yoff += 0.005; - randomSeed(seed); - // Start the recursive branching! - branch(60, 0); -} - - -void mousePressed() { - // New tree starts with new noise offset and new random seed - yoff = random(1000); - seed = millis(); -} - - -void branch(float h, float xoff) { - // thickness of the branch is mapped to its length - float sw = map(h, 2, 100, 1, 5); - strokeWeight(sw); - // Draw the branch - line(0, 0, 0, -h); - // Move along to end - translate(0, -h); - - // Each branch will be 2/3rds the size of the previous one - h *= 0.7f; - - // Move along through noise space - xoff += 0.1; - - if (h > 4) { - // Random number of branches - int n = int(random(0, 5)); - for (int i = 0; i < n; i++) { - - // Here the angle is controlled by perlin noise - // This is a totally arbitrary way to do it, try others! - float theta = map(noise(xoff+i, yoff), 0, 1, -PI/3, PI/3); - if (n%2==0) theta *= -1; - - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(h, xoff); // Ok, now call myself to branch again - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_02_Mandelbrot/Figure_8_02_Mandelbrot.pde b/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_02_Mandelbrot/Figure_8_02_Mandelbrot.pde deleted file mode 100644 index 6883037b6..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_02_Mandelbrot/Figure_8_02_Mandelbrot.pde +++ /dev/null @@ -1,80 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// The Mandelbrot Set - -// Simple rendering of the Mandelbrot set -// c = a + bi -// Iterate z = z^2 + c, i.e. -// z(0) = 0 -// z(1) = 0*0 + c -// z(2) = c*c + c -// z(3) = (c*c + c) * (c*c + c) + c -// etc. - -// c*c = (a+bi) * (a+bi) = a^2 - b^2 + 2abi - -// Establish a range of values on the complex plane -double xmin = -2.5; double ymin = -1; double w = 4; double h = 2; -// A different range will allow us to "zoom" in or out on the fractal -// double xmin = -1.5; double ymin = -.1; double wh = 0.15; - -void setup() { - size(863,863/2); -} - -void draw() { - - loadPixels(); - - // Maximum number of iterations for each point on the complex plane - int maxiterations = 200; - - // x goes from xmin to xmax - double xmax = xmin + w; - // y goes from ymin to ymax - double ymax = ymin + h; - - // Calculate amount we increment x,y for each pixel - double dx = (xmax - xmin) / (width); - double dy = (ymax - ymin) / (height); - - // Start y - double y = ymin; - for(int j = 0; j < height; j++) { - // Start x - double x = xmin; - for(int i = 0; i < width; i++) { - - // Now we test, as we iterate z = z^2 + cm does z tend towards infinity? - double a = x; - double b = y; - int n = 0; - while (n < maxiterations) { - double aa = a * a; - double bb = b * b; - double twoab = 2.0 * a * b; - a = aa - bb + x; - b = twoab + y; - // Infinty in our finite world is simple, let's just consider it 16 - if(aa + bb > 16.0f) { - break; // Bail - } - n++; - } - - // We color each pixel based on how long it takes to get to infinity - // If we never got there, let's pick the color black - if (n == maxiterations) pixels[i+j*width] = color(0); - else pixels[i+j*width] = color(n*16 % 255); // Gosh, we could make fancy colors here if we wanted - x += dx; - } - y += dy; - } - updatePixels(); - - save("chapter08_02.png"); - noLoop(); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/Figure_8_14_Koch.pde b/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/Figure_8_14_Koch.pde deleted file mode 100644 index d9d8b0bee..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/Figure_8_14_Koch.pde +++ /dev/null @@ -1,67 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve - -// Renders a simple fractal, the Koch snowflake -// Each recursive level drawn in sequence - -ArrayList lines ; // A list to keep track of all the lines - -void setup() { - size(1820, 200); - - - smooth(); -} - - - -void draw() { - translate(10,0); - int spacing = 10; - int total = 5; - - background(255); - float w = (1800-spacing*(total-1))/5; - for (int n = 0; n < total; n++) { - lines = new ArrayList(); - PVector start = new PVector(0, height*2/3); - PVector end = new PVector(w, height*2/3); - lines.add(new KochLine(start, end)); - for (int i = 0; i < n; i++) { - generate(); - } - strokeWeight(2); - for (KochLine l : lines) { - l.display(); - } - noFill(); - strokeWeight(1); - stroke(127); - rect(0, 10, w,height-20); - translate(w+spacing, 0); - } - save("chapter08_14.png"); - noLoop(); -} - -void generate() { - ArrayList next = new ArrayList(); // Create emtpy list - for (KochLine l : lines) { - // Calculate 5 koch PVectors (done for us by the line object) - PVector a = l.kochA(); - PVector b = l.kochB(); - PVector c = l.kochC(); - PVector d = l.kochD(); - PVector e = l.kochE(); - // Make line segments between all the PVectors and add them - next.add(new KochLine(a, b)); - next.add(new KochLine(b, c)); - next.add(new KochLine(c, d)); - next.add(new KochLine(d, e)); - } - lines = next; -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/KochLine.pde b/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/KochLine.pde deleted file mode 100644 index 54ed28120..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_14_Koch/KochLine.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve - -// A class to describe one line segment in the fractal -// Includes methods to calculate midPVectors along the line according to the Koch algorithm - -class KochLine { - - // Two PVectors, - // a is the "left" PVector and - // b is the "right PVector - PVector start; - PVector end; - - KochLine(PVector a, PVector b) { - start = a.get(); - end = b.get(); - } - - void display() { - stroke(0); - line(start.x, start.y, end.x, end.y); - } - - PVector kochA() { - return start.get(); - } - - - // This is easy, just 1/3 of the way - PVector kochB() { - PVector v = PVector.sub(end, start); - v.div(3); - v.add(start); - return v; - } - - // More complicated, have to use a little trig to figure out where this PVector is! - PVector kochC() { - PVector a = start.get(); // Start at the beginning - - PVector v = PVector.sub(end, start); - v.div(3); - a.add(v); // Move to point B - - rotate(v, -radians(60)); // Rotate 60 degrees - a.add(v); // Move to point C - - return a; - } - - // Easy, just 2/3 of the way - PVector kochD() { - PVector v = PVector.sub(end, start); - v.mult(2/3.0); - v.add(start); - return v; - } - - PVector kochE() { - return end.get(); - } -} - -public void rotate(PVector v, float theta) { - float xTemp = v.x; - // Might need to check for rounding errors like with angleBetween function? - v.x = v.x*PApplet.cos(theta) - v.y*PApplet.sin(theta); - v.y = xTemp*PApplet.sin(theta) + v.y*PApplet.cos(theta); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_20_Tree/Figure_8_20_Tree.pde b/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_20_Tree/Figure_8_20_Tree.pde deleted file mode 100644 index a81bd3fe8..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_20_Tree/Figure_8_20_Tree.pde +++ /dev/null @@ -1,55 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree - -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -float theta; - -void setup() { - size(800, 200); - smooth(); -} - -void draw() { - background(255); - // Let's pick an angle 0 to 90 degrees based on the mouse position - theta = map(mouseX,0,width,0,PI/2); - - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(60); -} - -void branch(float len) { - // Each branch will be 2/3rds the size of the previous one - - //float sw = map(len,2,120,1,10); - //strokeWeight(sw); - strokeWeight(2); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (len > 2) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(len); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-theta); - branch(len); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_CantorLine/Figure_8_CantorLine.pde b/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_CantorLine/Figure_8_CantorLine.pde deleted file mode 100644 index 135d12ac9..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/Figure_8_CantorLine/Figure_8_CantorLine.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void setup() { - size(800, 60); - background(255); -} - -void cantor(float x, float y, float len) { - line(x, y, x+len, y); - - y += 20; - line(x,y,x+len/3,y); //[bold] - line(x+len*2/3,y,x+len,y); //[bold] -} - -void draw() { - cantor(10, 20, width-20); - save("chapter08_12.png"); - noLoop(); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_01_Recursion/NOC_8_01_Recursion.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_01_Recursion/NOC_8_01_Recursion.pde deleted file mode 100644 index 84b600182..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_01_Recursion/NOC_8_01_Recursion.pde +++ /dev/null @@ -1,27 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Recursion - -void setup() { - size(640,360); -} - -void draw() { - background(255); - drawCircle(width/2,height/2,width); - noLoop(); -} - -// Very simple function that draws one circle -// and recursively calls itself -void drawCircle(int x, int y, float r) { - ellipse(x, y, r, r); - // Exit condition, stop when radius is too small - if(r > 2) { - r *= 0.75f; - // Call the function inside the function! (recursion!) - drawCircle(x, y, r); - } -} diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_02_Recursion/NOC_8_02_Recursion.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_02_Recursion/NOC_8_02_Recursion.pde deleted file mode 100644 index b02eda5fe..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_02_Recursion/NOC_8_02_Recursion.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Recursion - -void setup() { - size(640,360); -} - -void draw() { - background(255); - drawCircle(width/2,height/2,400); - noLoop(); -} - -// Recursive function -void drawCircle(float x, float y, float r) { - stroke(0); - noFill(); - ellipse(x, y, r, r); - if(r > 2) { - // Now we draw two more circles, one to the left - // and one to the right - drawCircle(x + r/2, y, r/2); - drawCircle(x - r/2, y, r/2); - } -} diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_03_Recursion/NOC_8_03_Recursion.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_03_Recursion/NOC_8_03_Recursion.pde deleted file mode 100644 index c7257d242..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_03_Recursion/NOC_8_03_Recursion.pde +++ /dev/null @@ -1,29 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Simple Recursion - -void setup() { - size(640, 360); -} - -void draw() { - background(255); - drawCircle(width/2, height/2, 400); - noLoop(); -} - -void drawCircle(float x, float y, float radius) { - noFill(); - stroke(0); - ellipse(x, y, radius, radius); - if (radius > 8) { - // Four circles! left right, up and down - drawCircle(x + radius/2, y, radius/2); - drawCircle(x - radius/2, y, radius/2); - drawCircle(x, y + radius/2, radius/2); - drawCircle(x, y - radius/2, radius/2); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_CantorSet/NOC_8_04_CantorSet.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_CantorSet/NOC_8_04_CantorSet.pde deleted file mode 100644 index 47da39851..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_CantorSet/NOC_8_04_CantorSet.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Cantor Set -// Renders a simple fractal, the Cantor Set - -void setup() { - size(800, 200); - background(255); - - // Call the recursive function - cantor(35, 0, 730); -} - -void draw() { - // No need to loop - noLoop(); -} - - -void cantor(float x, float y, float len) { - - float h = 30; - - // recursive exit condition - if (len >= 1) { - // Draw line (as rectangle to make it easier to see) - noStroke(); - fill(0); - rect(x, y, len, h/3); - // Go down to next y position - y += h; - // Draw 2 more lines 1/3rd the length (without the middle section) - cantor(x, y, len/3); - cantor(x+len*2/3, y, len/3); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_Tree/NOC_8_04_Tree.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_Tree/NOC_8_04_Tree.pde deleted file mode 100644 index cb35ab15f..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_04_Tree/NOC_8_04_Tree.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -float theta; - -void setup() { - size(300, 200); - smooth(); -} - -void draw() { - background(255); - // Let's pick an angle 0 to 90 degrees based on the mouse position - theta = map(mouseX,0,width,0,PI/2); - - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(60); -} - -void branch(float len) { - // Each branch will be 2/3rds the size of the previous one - - float sw = map(len,2,120,1,10); - strokeWeight(sw); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (len > 2) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(len); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-theta); - branch(len); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochFractal.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochFractal.pde deleted file mode 100644 index 76a8f1cd7..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochFractal.pde +++ /dev/null @@ -1,71 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve -// A class to manage the list of line segments in the snowflake pattern - -class KochFractal { - PVector start; // A PVector for the start - PVector end; // A PVector for the end - ArrayList lines; // A list to keep track of all the lines - int count; - - public KochFractal() { - start = new PVector(0,height-20); - end = new PVector(width,height-20); - lines = new ArrayList(); - restart(); - } - - void nextLevel() { - // For every line that is in the arraylist - // create 4 more lines in a new arraylist - lines = iterate(lines); - count++; - } - - void restart() { - count = 0; // Reset count - lines.clear(); // Empty the array list - lines.add(new KochLine(start,end)); // Add the initial line (from one end PVector to the other) - } - - int getCount() { - return count; - } - - // This is easy, just draw all the lines - void render() { - for(KochLine l : lines) { - l.display(); - } - } - - // This is where the **MAGIC** happens - // Step 1: Create an empty arraylist - // Step 2: For every line currently in the arraylist - // - calculate 4 line segments based on Koch algorithm - // - add all 4 line segments into the new arraylist - // Step 3: Return the new arraylist and it becomes the list of line segments for the structure - - // As we do this over and over again, each line gets broken into 4 lines, which gets broken into 4 lines, and so on. . . - ArrayList iterate(ArrayList before) { - ArrayList now = new ArrayList(); // Create emtpy list - for(KochLine l : before) { - // Calculate 5 koch PVectors (done for us by the line object) - PVector a = l.start(); - PVector b = l.kochleft(); - PVector c = l.kochmiddle(); - PVector d = l.kochright(); - PVector e = l.end(); - // Make line segments between all the PVectors and add them - now.add(new KochLine(a,b)); - now.add(new KochLine(b,c)); - now.add(new KochLine(c,d)); - now.add(new KochLine(d,e)); - } - return now; - } - -} diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochLine.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochLine.pde deleted file mode 100644 index 6f3ff6913..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/KochLine.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve -// A class to describe one line segment in the fractal -// Includes methods to calculate midPVectors along the line according to the Koch algorithm - -class KochLine { - - // Two PVectors, - // a is the "left" PVector and - // b is the "right PVector - PVector a; - PVector b; - - KochLine(PVector start, PVector end) { - a = start.get(); - b = end.get(); - } - - void display() { - stroke(0); - line(a.x, a.y, b.x, b.y); - } - - PVector start() { - return a.get(); - } - - PVector end() { - return b.get(); - } - - // This is easy, just 1/3 of the way - PVector kochleft() { - PVector v = PVector.sub(b, a); - v.div(3); - v.add(a); - return v; - } - - // More complicated, have to use a little trig to figure out where this PVector is! - PVector kochmiddle() { - PVector v = PVector.sub(b, a); - v.div(3); - - PVector p = a.get(); - p.add(v); - - rotate(v,-radians(60)); - p.add(v); - - return p; - } - - - // Easy, just 2/3 of the way - PVector kochright() { - PVector v = PVector.sub(a, b); - v.div(3); - v.add(b); - return v; - } -} - - public void rotate(PVector v, float theta) { - float xTemp = v.x; - // Might need to check for rounding errors like with angleBetween function? - v.x = v.x*cos(theta) - v.y*sin(theta); - v.y = xTemp*sin(theta) + v.y*cos(theta); - } - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/NOC_8_05_Koch.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/NOC_8_05_Koch.pde deleted file mode 100644 index f61293171..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_Koch/NOC_8_05_Koch.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com -// Koch Curve - -// Renders a simple fractal, the Koch snowflake -// Each recursive level drawn in sequence - -KochFractal k; - -void setup() { - size(800,250); - background(255); - frameRate(1); // Animate slowly - k = new KochFractal(); - smooth(); -} - -void draw() { - background(255); - // Draws the snowflake! - k.render(); - // Iterate - k.nextLevel(); - // Let's not do it more than 5 times. . . - if (k.getCount() > 5) { - k.restart(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/KochLine.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/KochLine.pde deleted file mode 100644 index f66510428..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/KochLine.pde +++ /dev/null @@ -1,73 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve -// A class to describe one line segment in the fractal -// Includes methods to calculate midPVectors along the line according to the Koch algorithm - -class KochLine { - - // Two PVectors, - // a is the "left" PVector and - // b is the "right PVector - PVector start; - PVector end; - - KochLine(PVector a, PVector b) { - start = a.get(); - end = b.get(); - } - - void display() { - stroke(0); - line(start.x, start.y, end.x, end.y); - } - - PVector kochA() { - return start.get(); - } - - - // This is easy, just 1/3 of the way - PVector kochB() { - PVector v = PVector.sub(end, start); - v.div(3); - v.add(start); - return v; - } - - // More complicated, have to use a little trig to figure out where this PVector is! - PVector kochC() { - PVector a = start.get(); // Start at the beginning - - PVector v = PVector.sub(end, start); - v.div(3); - a.add(v); // Move to point B - - rotate(v, -radians(60)); // Rotate 60 degrees - a.add(v); // Move to point C - - return a; - } - - // Easy, just 2/3 of the way - PVector kochD() { - PVector v = PVector.sub(end, start); - v.mult(2/3.0); - v.add(start); - return v; - } - - PVector kochE() { - return end.get(); - } -} - -public void rotate(PVector v, float theta) { - float xTemp = v.x; - // Might need to check for rounding errors like with angleBetween function? - v.x = v.x*PApplet.cos(theta) - v.y*PApplet.sin(theta); - v.y = xTemp*PApplet.sin(theta) + v.y*PApplet.cos(theta); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/NOC_8_05_KochSimple.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/NOC_8_05_KochSimple.pde deleted file mode 100644 index b8268ee9f..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_05_KochSimple/NOC_8_05_KochSimple.pde +++ /dev/null @@ -1,51 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Koch Curve -// Renders a simple fractal, the Koch snowflake -// Each recursive level drawn in sequence - -ArrayList lines ; // A list to keep track of all the lines - -void setup() { - size(383, 200); - background(255); - lines = new ArrayList(); - PVector start = new PVector(0, 150); - PVector end = new PVector(width, 150); - lines.add(new KochLine(start, end)); - - for (int i = 0; i < 5; i++) { - generate(); - } - - smooth(); -} - -void draw() { - background(255); - for (KochLine l : lines) { - l.display(); - } -} - -void generate() { - ArrayList next = new ArrayList(); // Create emtpy list - for (KochLine l : lines) { - // Calculate 5 koch PVectors (done for us by the line object) - PVector a = l.kochA(); - PVector b = l.kochB(); - PVector c = l.kochC(); - PVector d = l.kochD(); - PVector e = l.kochE(); - // Make line segments between all the PVectors and add them - next.add(new KochLine(a, b)); - next.add(new KochLine(b, c)); - next.add(new KochLine(c, d)); - next.add(new KochLine(d, e)); - } - lines = next; -} - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_SimpleLSystem/NOC_8_06_SimpleLSystem.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_SimpleLSystem/NOC_8_06_SimpleLSystem.pde deleted file mode 100644 index b14d7b021..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_SimpleLSystem/NOC_8_06_SimpleLSystem.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// L-System -// Just demonstrating working with L-System strings -// No drawing - -// Start with "A" -String current = "A"; -// Number of generations -int count = 0; - -void setup() { - size(200, 200); - println("Generation " + count + ": " + current); -} - -void draw() { - background(255); - fill(0); - text("Click mouse to generate", 10, height-20); - noLoop(); -} - -void mousePressed() { - // A new StringBuffer for the next generation - StringBuffer next = new StringBuffer(); - - // Look through the current String to replace according to L-System rules - for (int i = 0; i < current.length(); i++) { - char c = current.charAt(i); - if (c == 'A') { - // If we find A replace with AB - next.append("AB"); - } else if (c == 'B') { - // If we find B replace with A - next.append("A"); - } - } - // The current String is now the next one - current = next.toString(); - count++; - // Print to message console - println("Generation " + count + ": " + current); - println(count + " " + current.length()); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree/NOC_8_06_Tree.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree/NOC_8_06_Tree.pde deleted file mode 100644 index f2853c124..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree/NOC_8_06_Tree.pde +++ /dev/null @@ -1,53 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Recursive Tree -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -float theta; - -void setup() { - size(640, 360); -} - -void draw() { - background(255); - // Let's pick an angle 0 to 90 degrees based on the mouse position - theta = map(mouseX,0,width,0,PI/2); - - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(60); -} - -void branch(float len) { - // Each branch will be 2/3rds the size of the previous one - - //float sw = map(len,2,120,1,10); - //strokeWeight(sw); - strokeWeight(2); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (len > 2) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(len); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-theta); - branch(len); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree_static/NOC_8_06_Tree_static.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree_static/NOC_8_06_Tree_static.pde deleted file mode 100644 index 92805fdb4..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_06_Tree_static/NOC_8_06_Tree_static.pde +++ /dev/null @@ -1,45 +0,0 @@ -// Recursive Tree -// Daniel Shiffman -// Nature of Code, Chapter 8 - -// Renders a simple tree-like structure via recursion -// Branching angle calculated as a function of horizontal mouse location - -void setup() { - size(800, 200); - smooth(); -} - -void draw() { - background(255); - // Start the tree from the bottom of the screen - translate(width/2, height); - stroke(0); - branch(60); - noLoop(); -} - -void branch(float len) { - strokeWeight(2); - - line(0, 0, 0, -len); - // Move to the end of that line - translate(0, -len); - - len *= 0.66; - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (len > 2) { - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(PI/5); // Rotate by theta - branch(len); // Ok, now call myself to draw two new branches!! - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - - // Repeat the same thing, only branch off to the "left" this time! - pushMatrix(); - rotate(-PI/5); - branch(len); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic/NOC_8_07_TreeStochastic.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic/NOC_8_07_TreeStochastic.pde deleted file mode 100644 index c0e22fb7b..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic/NOC_8_07_TreeStochastic.pde +++ /dev/null @@ -1,66 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stochastic Tree -// Renders a simple tree-like structure via recursion -// Angles and number of branches are random - -void setup() { - size(800, 200); - newTree(); -} - -void draw() { - noLoop(); -} - -void mousePressed() { - newTree(); - redraw(); -} - -void newTree() { - background(255); - fill(0); - text("Click mouse to generate a new tree", 10, height-10); - - stroke(0); - pushMatrix(); - // Start the tree from the bottom of the screen - translate(width/2, height); - // Start the recursive branching! - branch(80); - popMatrix(); -} - - - -void branch(float h) { - // thickness of the branch is mapped to its length - float sw = map(h, 2, 120, 1, 5); - strokeWeight(sw); - // Draw the actual branch - line(0, 0, 0, -h); - // Move along to end - translate(0, -h); - - // Each branch will be 2/3rds the size of the previous one - h *= 0.66f; - - // All recursive functions must have an exit condition!!!! - // Here, ours is when the length of the branch is 2 pixels or less - if (h > 2) { - // A random number of branches - int n = int(random(1, 4)); - for (int i = 0; i < n; i++) { - // Picking a random angle - float theta = random(-PI/2, PI/2); - pushMatrix(); // Save the current state of transformation (i.e. where are we now) - rotate(theta); // Rotate by theta - branch(h); // Ok, now call myself to branch again - popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic_angleonly/NOC_8_07_TreeStochastic_angleonly.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic_angleonly/NOC_8_07_TreeStochastic_angleonly.pde deleted file mode 100644 index 5c73557a5..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_07_TreeStochastic_angleonly/NOC_8_07_TreeStochastic_angleonly.pde +++ /dev/null @@ -1,59 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Stochastic Tree -// Renders a simple tree-like structure via recursion -// Angles and number of branches are random - -void setup() { - size(800, 200); - newTree(); -} - -void draw() { - noLoop(); -} - -void mousePressed() { - pushMatrix(); - newTree(); - popMatrix(); - redraw(); -} - -void newTree() { - background(255); - fill(0); - text("Click mouse to generate a new tree", 10, height-10); - - stroke(0); - // Start the tree from the bottom of the screen - translate(width/2, height); - // Start the recursive branching! - branch(60); -} - - - -void branch(float h) { - // thickness of the branch is mapped to its length - float sw = map(h, 2, 120, 1, 5); - strokeWeight(sw); - float theta = random(0,PI/3); - - line(0, 0, 0, -h); - translate(0, -h); - h *= 0.66; - if (h > 2) { - pushMatrix(); - rotate(theta); - branch(h); - popMatrix(); - pushMatrix(); - rotate(-theta); - branch(h); - popMatrix(); - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_08_SimpleLSystem/NOC_8_08_SimpleLSystem.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_08_SimpleLSystem/NOC_8_08_SimpleLSystem.pde deleted file mode 100644 index 9f1b0dac3..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_08_SimpleLSystem/NOC_8_08_SimpleLSystem.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// L-System -// Just demonstrating working with L-System strings -// No drawing - -// Start with "A" -String current = "A"; -// Number of generations -int count = 0; - -void setup() { - size(800, 200); - println("Generation " + count + ": " + current); -} - -void draw() { - background(255); - fill(0); - text("Click mouse to generate", 10, height-20); - noLoop(); -} - -void mousePressed() { - // A new StringBuffer for the next generation - StringBuffer next = new StringBuffer(); - - // Look through the current String to replace according to L-System rules - for (int i = 0; i < current.length(); i++) { - char c = current.charAt(i); - if (c == 'A') { - // If we find A replace with AB - next.append("AB"); - } else if (c == 'B') { - // If we find B replace with A - next.append("A"); - } - } - // The current String is now the next one - current = next.toString(); - count++; - // Print to message console - println("Generation " + count + ": " + current); - //println(count + " " + current.length()); -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/LSystem.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/LSystem.pde deleted file mode 100644 index a51c255ee..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/LSystem.pde +++ /dev/null @@ -1,63 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// An LSystem has a starting sentence -// An a ruleset -// Each generation recursively replaces characteres in the sentence -// Based on the rulset - -class LSystem { - - String sentence; // The sentence (a String) - Rule[] ruleset; // The ruleset (an array of Rule objects) - int generation; // Keeping track of the generation # - - // Construct an LSystem with a startin sentence and a ruleset - LSystem(String axiom, Rule[] r) { - sentence = axiom; - ruleset = r; - generation = 0; - } - - // Generate the next generation - void generate() { - // An empty StringBuffer that we will fill - StringBuffer nextgen = new StringBuffer(); - // For every character in the sentence - for (int i = 0; i < sentence.length(); i++) { - // What is the character - char curr = sentence.charAt(i); - // We will replace it with itself unless it matches one of our rules - String replace = "" + curr; - // Check every rule - for (int j = 0; j < ruleset.length; j++) { - char a = ruleset[j].getA(); - // if we match the Rule, get the replacement String out of the Rule - if (a == curr) { - replace = ruleset[j].getB(); - break; - } - } - // Append replacement String - nextgen.append(replace); - } - // Replace sentence - sentence = nextgen.toString(); - // Increment generation - generation++; - } - - String getSentence() { - return sentence; - } - - int getGeneration() { - return generation; - } - - -} - - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/NOC_8_09_LSystem.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/NOC_8_09_LSystem.pde deleted file mode 100644 index 94a960d42..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/NOC_8_09_LSystem.pde +++ /dev/null @@ -1,63 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -LSystem lsys; -Turtle turtle; - -void setup() { - size(600, 600); - /* - // Create an empty ruleset - Rule[] ruleset = new Rule[2]; - // Fill with two rules (These are rules for the Sierpinksi Gasket Triangle) - ruleset[0] = new Rule('F',"F--F--F--G"); - ruleset[1] = new Rule('G',"GG"); - // Create LSystem with axiom and ruleset - lsys = new LSystem("F--F--F",ruleset); - turtle = new Turtle(lsys.getSentence(),width*2,TWO_PI/3); - */ - - /*Rule[] ruleset = new Rule[1]; - //ruleset[0] = new Rule('F',"F[F]-F+F[--F]+F-F"); - ruleset[0] = new Rule['F',"FF+[+F-F-F]-[-F+F+F]"); - lsys = new LSystem("F-F-F-F",ruleset); - turtle = new Turtle(lsys.getSentence(),width-1,PI/2); - */ - - Rule[] ruleset = new Rule[1]; - ruleset[0] = new Rule('F', "FF+[+F-F-F]-[-F+F+F]"); - lsys = new LSystem("F", ruleset); - turtle = new Turtle(lsys.getSentence(), height/3, radians(25)); - - - - smooth(); -} - -void draw() { - background(255); - fill(0); - //text("Click mouse to generate", 10, height-10); - - translate(width/2, height); - rotate(-PI/2); - turtle.render(); - noLoop(); -} - -int counter = 0; - -void mousePressed() { - if (counter < 5) { - pushMatrix(); - lsys.generate(); - //println(lsys.getSentence()); - turtle.setToDo(lsys.getSentence()); - turtle.changeLen(0.5); - popMatrix(); - redraw(); - counter++; - } -} - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Rule.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Rule.pde deleted file mode 100644 index 49353e772..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Rule.pde +++ /dev/null @@ -1,26 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// LSystem Rule class - -class Rule { - char a; - String b; - - Rule(char a_, String b_) { - a = a_; - b = b_; - } - - char getA() { - return a; - } - - String getB() { - return b; - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Turtle.pde b/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Turtle.pde deleted file mode 100644 index cede7d5c7..000000000 --- a/java/examples/Books/Nature of Code/chp8_fractals/NOC_8_09_LSystem/Turtle.pde +++ /dev/null @@ -1,54 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -class Turtle { - - String todo; - float len; - float theta; - - Turtle(String s, float l, float t) { - todo = s; - len = l; - theta = t; - } - - void render() { - stroke(0,175); - for (int i = 0; i < todo.length(); i++) { - char c = todo.charAt(i); - if (c == 'F' || c == 'G') { - line(0,0,len,0); - translate(len,0); - } - else if (c == '+') { - rotate(theta); - } - else if (c == '-') { - rotate(-theta); - } - else if (c == '[') { - pushMatrix(); - } - else if (c == ']') { - popMatrix(); - } - } - } - - void setLen(float l) { - len = l; - } - - void changeLen(float percent) { - len *= percent; - } - - void setToDo(String s) { - todo = s; - } - -} - - diff --git a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/DNA.pde deleted file mode 100644 index 54d988426..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/DNA.pde +++ /dev/null @@ -1,82 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// DNA is an array of vectors - -class DNA { - - // The genetic sequence - PVector[] genes; - - // Constructor (makes a DNA of random PVectors) - DNA(int num) { - genes = new PVector[num]; - for (int i = 0; i < genes.length; i++) { - genes[i] = PVector.random2D(); - } - } - - // Constructor #2, creates the instance based on an existing array - DNA(PVector[] newgenes) { - // We could make a copy if necessary - // genes = (PVector []) newgenes.clone(); - genes = newgenes; - } - - // CROSSOVER - // Creates new DNA sequence from two (this & and a partner) - DNA crossover(DNA partner) { - PVector[] child = new PVector[genes.length]; - // Pick a midpoint - int crossover = int(random(genes.length)); - // Take "half" from one and "half" from the other - for (int i = 0; i < genes.length; i++) { - if (i > crossover) child[i] = genes[i]; - else child[i] = partner.genes[i]; - } - DNA newgenes = new DNA(child); - return newgenes; - } - - // Based on a mutation probability, picks a new random Vector - void mutate(float m) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < m) { - genes[i] = PVector.random2D(); - } - } - } - - void debugDraw() { - int cols = width / gridscale; - int rows = height / gridscale; - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows; j++) { - drawVector(genes[i+j*cols],i*gridscale,j*gridscale,gridscale-2); - } - } - } - - // Renders a vector object 'v' as an arrow and a location 'x,y' - void drawVector(PVector v, float x, float y, float scayl) { - pushMatrix(); - float arrowsize = 4; - // Translate to location to render vector - translate(x+gridscale/2,y); - stroke(0,100); - // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate - rotate(v.heading()); - // Calculate length of vector & scale it to be bigger or smaller if necessary - float len = v.mag()*scayl; - // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(-len/2,0,len/2,0); - //noFill(); - //ellipse(-len/2,0,2,2); - popMatrix(); - } - -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/EvolveFlowField.pde b/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/EvolveFlowField.pde deleted file mode 100644 index 433924997..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/EvolveFlowField.pde +++ /dev/null @@ -1,121 +0,0 @@ - // The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding Flowfield w/ Genetic Algorithms - -// This example produces an obstacle course with a start and finish -// Virtual "creatures" are rewarded for making it closer to the finish - -// Each creature's DNA is a "flowfield" of PVectors that -// determine steering vectors for each cell on the screen - -import java.awt.Rectangle; - -int gridscale = 10; // Scale of grid is 1/24 of screen size - -// DNA needs one vector for every spot on the grid -// (it's like a pixel array, but with vectors instead of colors) -int dnasize; - -int lifetime; // How long should each generation live - - -Population population; // Population -int lifecycle; // Timer for cycle of generation -int recordtime; // Fastest time to target -Obstacle target; // Target location -Obstacle start; // Start location -int diam = 24; // Size of target - -ArrayList obstacles; //an array list to keep track of all the obstacles! - -boolean debug = false; - -Rectangle newObstacle = null; - -void setup() { - size(640,360); - dnasize = (width / gridscale) * (height / gridscale); - lifetime = width/3; - - // Initialize variables - lifecycle = 0; - recordtime = lifetime; - target = new Obstacle(width-diam-diam/2,height/2-diam/2,diam,diam); - start = new Obstacle(diam/2,height/2-diam/2,diam,diam); - - // Create a population with a mutation rate, and population max - int popmax = 1000; - float mutationRate = 0.02; - population = new Population(mutationRate,popmax); - - // Create the obstacle course - obstacles = new ArrayList(); - - - /*obstacles.add(new Obstacle(width/4,80,10,height-160)); - obstacles.add(new Obstacle(width/2,0,10,height/2-20)); - obstacles.add(new Obstacle(width/2,height-height/2+20,10,height/2-20)); - obstacles.add(new Obstacle(2*width/3,height/2-height/8,10,height/4));*/ -} - -void draw() { - background(255); - - // Draw the target locations - target.display(); - - // Draw the obstacles - for (Obstacle obs : obstacles) { - obs.display(); - } - - - // If the generation hasn't ended yet - if (lifecycle < lifetime) { - population.live(obstacles); - if ((population.targetReached()) && (lifecycle < recordtime)) { - recordtime = lifecycle; - } - lifecycle++; - // Otherwise a new generation - } else { - lifecycle = 0; - population.calcFitness(); - population.naturalSelection(); - population.generate(); - } - - // Display some info - textAlign(RIGHT); - fill(0); - text("Generation #:" + population.getGenerations(),width-10,18); - text("Cycles left:" + ((lifetime-lifecycle)),width-10,36); - text("Record cycles: " + recordtime,width-10,54); - - if (newObstacle != null) { - rect(newObstacle.x,newObstacle.y,newObstacle.width,newObstacle.height); - } - -} - -void keyPressed() { - if (key == 'd') { - debug = !debug; - } -} - -void mousePressed() { - newObstacle = new Rectangle(mouseX,mouseY,0,0); -} - -void mouseDragged() { - newObstacle.width = mouseX-newObstacle.x; - newObstacle.height = mouseY-newObstacle.y; -} - -void mouseReleased() { - obstacles.add(new Obstacle(newObstacle)); - newObstacle = null; -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Obstacle.pde b/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Obstacle.pde deleted file mode 100644 index 2658d7bd5..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Obstacle.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// A class for an obstacle, just a simple rectangle that is drawn -// and can check if a creature touches it - -// Also using this class for starting point and target location - -class Obstacle { - - Rectangle r; - - Obstacle(int x, int y, int w, int h) { - r = new Rectangle(x,y,w,h); - } - - Obstacle(Rectangle r_) { - r = r_; - } - - void display() { - stroke(0); - fill(175); - rectMode(CORNER); - rect(r.x,r.y,r.width,r.height); - } - - boolean contains(PVector spot) { - if (r.contains((int)spot.x,(int)spot.y)) { - return true; - } else { - return false; - } - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Population.pde deleted file mode 100644 index baa32703a..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Population.pde +++ /dev/null @@ -1,142 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A class to describe a population of "creatures" - -class Population { - - float mutationRate; // Mutation rate - Rocket[] population; // Array to hold the current population - ArrayList darwin; // ArrayList which we will use for our "mating pool" - int generations; // Number of generations - - int order; // Keep track of the order of creature's finishing the maze - - - - // Initialize the population - Population(float m, int num) { - mutationRate = m; - population = new Rocket[num]; - darwin = new ArrayList(); - generations = 0; - //make a new set of creatures - for (int i = 0; i < population.length; i++) { - PVector location = new PVector(start.r.x+start.r.width/2, start.r.y+start.r.height/2); - population[i] = new Rocket(location, new DNA(dnasize)); - } - order = 1; // The first one to finish will be #1 - } - - void live (ArrayList o) { - // For every creature - - - - float record = 100000; - int closest = 0; - - for (int i = 0; i < population.length; i++) { - // If it finishes, mark it down as done! - if ((population[i].finished())) { - population[i].setFinish(order); - order++; - } - // Run it - population[i].run(o); - - if (population[i].recordDist < record) {// && !population[i].dead) { - record = population[i].recordDist; - closest = i; - } - } - - population[closest].highlight(); - // Drawing one example of the DNA - if (debug) { - population[closest].dna.debugDraw(); - } - } - - // Did anything finish? - boolean targetReached() { - for (int i = 0; i < population.length; i++) { - if (population[i].finished()) return true; - } - return false; - } - - // Calculate fitness for each creature - void calcFitness() { - for (int i = 0; i < population.length; i++) { - population[i].calcFitness(); - } - order = 1; // Hmmm, awkward place for this, we have to reset this for the next generation - } - - // Generate a mating pool - void naturalSelection() { - // Clear the ArrayList - darwin.clear(); - - // Calculate total fitness of whole population - float totalFitness = getTotalFitness(); - float avgFitness = totalFitness/population.length; - - // Calculate normalized fitness for each member of the population - // Based on normalized fitness, each member will get added to the mating pool a certain number of times a la roulette wheel - // A higher fitness = more entries to mating pool = more likely to be picked as a parent - // A lower fitness = fewer entries to mating pool = less likely to be picked as a parent - int count = 0; - for (int i = 0; i < population.length; i++) { - float fitness = population[i].getFitness(); - //if (fitness > avgFitness) { - count++; - float fitnessNormal = fitness / totalFitness; - int n = (int) (fitnessNormal * 50000); // Arbitrary multiplier, consider mapping fix - for (int j = 0; j < n; j++) { - darwin.add(population[i]); - } - //} - } - //println("Total: " + count + " " + population.length); - } - - // Making the next generation - void generate() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - int m = int(random(darwin.size())); - int d = int(random(darwin.size())); - // Pick two parents - Rocket mom = darwin.get(m); - Rocket dad = darwin.get(d); - // Get their genes - DNA momgenes = mom.getDNA(); - DNA dadgenes = dad.getDNA(); - // Mate their genes - DNA child = momgenes.crossover(dadgenes); - // Mutate their genes - child.mutate(mutationRate); - // Fill the new population with the new child - PVector location = new PVector(start.r.x+start.r.width/2, start.r.y+start.r.height/2); - population[i] = new Rocket(location, child); - } - generations++; - } - - int getGenerations() { - return generations; - } - - //compute total fitness for the population - float getTotalFitness() { - float total = 0; - for (int i = 0; i < population.length; i++) { - total += population[i].getFitness(); - } - return total; - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Rocket.pde b/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Rocket.pde deleted file mode 100644 index dab8d959c..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/EvolveFlowField/Rocket.pde +++ /dev/null @@ -1,171 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// Rocket class -- this is just like our Boid / Particle class -// the only difference is that it has DNA & fitness - -class Rocket { - - // All of our physics stuff - PVector location; - PVector velocity; - PVector acceleration; - float r; - float recordDist; - - float fitness; - DNA dna; - - // Could make this part of DNA??) - float maxspeed = 6.0; - float maxforce = 1.0; - - boolean stopped; // Am I stuck? - boolean dead; // Did I hit an obstacle? - - int finish; // What was my finish? (first, second, etc. . . ) - - //constructor - Rocket(PVector l, DNA dna_) { - acceleration = new PVector(); - velocity = new PVector(); - location = l.get(); - r = 2; - dna = dna_; - stopped = false; - finish = 100000; // Some high number to begin with - recordDist = width; - } - - // FITNESS FUNCTION - // distance = distance from target - // finish = what order did i finish (first, second, etc. . .) - // f(distance,finish) = (1.0f / finish^1.5) * (1.0f / distance^6); - // a lower finish is rewarded (exponentially) and/or shorter distance to target (exponetially) - void calcFitness() { - float d = recordDist; - if (d < diam/2) { - d = 1.0; - } - // Reward finishing faster and getting closer - fitness = (1.0f / pow(finish,1.5)) * (1 / (pow(d,6))); - - //if (dead) fitness = 0; - } - - void setFinish(int f) { - finish = f; - } - - // Run in relation to all the obstacles - // If I'm stuck, don't bother updating or checking for intersection - void run(ArrayList o) { - if (!stopped) { - update(); - // If I hit an edge or an obstacle - if ((borders()) || (obstacles(o))) { - stopped = true; - dead = true; - } - } - // Draw me! - display(); - } - - // Did I hit an edge? - boolean borders() { - if ((location.x < 0) || (location.y < 0) || (location.x > width) || (location.y > height)) { - return true; - } else { - return false; - } - } - - // Did I make it to the target? - boolean finished() { - float d = dist(location.x,location.y,target.r.x,target.r.y); - if (d < recordDist) { - recordDist = d; - } - if (target.contains(location)) { - stopped = true; - return true; - } - return false; - } - - // Did I hit an obstacle? - boolean obstacles(ArrayList o) { - for (Obstacle obs : o) { - if (obs.contains(location)) { - return true; - } - } - return false; - } - - void update() { - if (!finished()) { - // Where are we? Our location will tell us what steering vector to look up in our DNA; - int x = (int) location.x/gridscale; - int y = (int) location.y/gridscale; - x = constrain(x,0,width/gridscale-1); // Make sure we are not off the edge - y = constrain(y,0,height/gridscale-1); // Make sure we are not off the edge - - // Get the steering vector out of our genes in the right spot - // A little Reynolds steering here - PVector desired = dna.genes[x+y*(width/gridscale)].get(); - desired.mult(maxspeed); - PVector steer = PVector.sub(desired,velocity); - acceleration.add(steer); - acceleration.limit(maxforce); - - velocity.add(acceleration); - velocity.limit(maxspeed); - location.add(velocity); - acceleration.mult(0); - } - } - - void display() { - //fill(0,150); - //stroke(0); - //ellipse(location.x,location.y,r,r); - float theta = velocity.heading() + PI/2; - fill(200,100); - stroke(0); - pushMatrix(); - translate(location.x,location.y); - rotate(theta); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - popMatrix(); - } - - void highlight() { - stroke(0); - line(location.x,location.y,target.r.x,target.r.y); - fill(255,0,0,100); - ellipse(location.x,location.y,16,16); - - } - - float getFitness() { - return fitness; - } - - DNA getDNA() { - return dna; - } - - boolean stopped() { - return stopped; - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/DNA.pde deleted file mode 100644 index 8286ab0c0..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/DNA.pde +++ /dev/null @@ -1,70 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// A class to describe a psuedo-DNA, i.e. genotype -// Here, a virtual organism's DNA is an array of character. -// Functionality: -// -- convert DNA into a string -// -- calculate DNA's "fitness" -// -- mate DNA with another set of DNA -// -- mutate DNA - - -class DNA { - - // The genetic sequence - char[] genes; - - float fitness; - - // Constructor (makes a random DNA) - DNA(int num) { - genes = new char[num]; - for (int i = 0; i < genes.length; i++) { - genes[i] = (char) random(32,128); // Pick from range of chars - } - } - - // Converts character array to a String - String getPhrase() { - return new String(genes); - } - - // Fitness function (returns floating point % of "correct" characters) - void fitness (String target) { - int score = 0; - for (int i = 0; i < genes.length; i++) { - if (genes[i] == target.charAt(i)) { - score++; - } - } - fitness = pow(2,score); - } - - // Crossover - DNA crossover(DNA partner) { - // A new child - DNA child = new DNA(genes.length); - - int midpoint = int(random(genes.length)); // Pick a midpoint - - // Half from one, half from the other - for (int i = 0; i < genes.length; i++) { - if (i > midpoint) child.genes[i] = genes[i]; - else child.genes[i] = partner.genes[i]; - } - return child; - } - - // Based on a mutation probability, picks a new random character - void mutate(float mutationRate) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < mutationRate) { - genes[i] = (char) random(32,128); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/GA_Shakespeare_fancyfitness.pde b/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/GA_Shakespeare_fancyfitness.pde deleted file mode 100644 index a50ef3319..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/GA_Shakespeare_fancyfitness.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// Demonstration of using a genetic algorithm to perform a search - -// setup() -// # Step 1: The populationation -// # Create an empty populationation (an array or ArrayList) -// # Fill it with DNA encoded objects (pick random values to start) - -// draw() -// # Step 1: Selection -// # Create an empty mating pool (an empty ArrayList) -// # For every member of the populationation, evaluate its fitness based on some criteria / function, -// and add it to the mating pool in a manner consistant with its fitness, i.e. the more fit it -// is the more times it appears in the mating pool, in order to be more likely picked for reproduction. - -// # Step 2: Reproduction Create a new empty populationation -// # Fill the new populationation by executing the following steps: -// 1. Pick two "parent" objects from the mating pool. -// 2. Crossover -- create a "child" object by mating these two parents. -// 3. Mutation -- mutate the child's DNA based on a given probability. -// 4. Add the child object to the new populationation. -// # Replace the old populationation with the new populationation -// -// # Rinse and repeat - - -PFont f; -String target; -int popmax; -float mutationRate; -Population population; - -void setup() { - size(600, 200); - f = createFont("Courier", 32, true); - target = "To be or not to be."; - popmax = 150; - mutationRate = 0.01; - - // Create a populationation with a target phrase, mutation rate, and populationation max - population = new Population(target, mutationRate, popmax); -} - -void draw() { - // Generate mating pool - population.naturalSelection(); - //Create next generation - population.generate(); - // Calculate fitness - population.calcFitness(); - displayInfo(); - - // If we found the target phrase, stop - if (population.finished()) { - println(millis()/1000.0); - noLoop(); - } -} - -void displayInfo() { - background(255); - // Display current status of populationation - String answer = population.getBest(); - textFont(f); - textAlign(LEFT); - fill(0); - - - textSize(16); - text("Best phrase:",20,30); - textSize(32); - text(answer, 20, 75); - - textSize(12); - text("total generations: " + population.getGenerations(), 20, 140); - text("average fitness: " + nf(population.getAverageFitness(), 0, 2), 20, 155); - text("total populationation: " + popmax, 20, 170); - text("mutation rate: " + int(mutationRate * 100) + "%", 20, 185); - - textSize(10); - text("All phrases:\n" + population.allPhrases(), 450, 10); -} - - diff --git a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/Population.pde deleted file mode 100644 index 03630a706..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/GA_Shakespeare_fancyfitness/Population.pde +++ /dev/null @@ -1,127 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// A class to describe a population of virtual organisms -// In this case, each organism is just an instance of a DNA object - -class Population { - - float mutationRate; // Mutation rate - DNA[] population; // Array to hold the current population - ArrayList matingPool; // ArrayList which we will use for our "mating pool" - String target; // Target phrase - int generations; // Number of generations - boolean finished; // Are we finished evolving? - int perfectScore; - - Population(String p, float m, int num) { - target = p; - mutationRate = m; - population = new DNA[num]; - for (int i = 0; i < population.length; i++) { - population[i] = new DNA(target.length()); - } - calcFitness(); - matingPool = new ArrayList(); - finished = false; - generations = 0; - - perfectScore = int(pow(2,target.length())); - } - - // Fill our fitness array with a value for every member of the population - void calcFitness() { - for (int i = 0; i < population.length; i++) { - population[i].fitness(target); - } - } - - // Generate a mating pool - void naturalSelection() { - // Clear the ArrayList - matingPool.clear(); - - float maxFitness = 0; - for (int i = 0; i < population.length; i++) { - if (population[i].fitness > maxFitness) { - maxFitness = population[i].fitness; - } - } - - // Based on fitness, each member will get added to the mating pool a certain number of times - // a higher fitness = more entries to mating pool = more likely to be picked as a parent - // a lower fitness = fewer entries to mating pool = less likely to be picked as a parent - for (int i = 0; i < population.length; i++) { - - float fitness = map(population[i].fitness,0,maxFitness,0,1); - int n = int(fitness * 100); // Arbitrary multiplier, we can also use monte carlo method - for (int j = 0; j < n; j++) { // and pick two random numbers - matingPool.add(population[i]); - } - } - } - - // Create a new generation - void generate() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - int a = int(random(matingPool.size())); - int b = int(random(matingPool.size())); - DNA partnerA = matingPool.get(a); - DNA partnerB = matingPool.get(b); - DNA child = partnerA.crossover(partnerB); - child.mutate(mutationRate); - population[i] = child; - } - generations++; - } - - - // Compute the current "most fit" member of the population - String getBest() { - float worldrecord = 0.0f; - int index = 0; - for (int i = 0; i < population.length; i++) { - if (population[i].fitness > worldrecord) { - index = i; - worldrecord = population[i].fitness; - } - } - - if (worldrecord == perfectScore ) finished = true; - return population[index].getPhrase(); - } - - boolean finished() { - return finished; - } - - int getGenerations() { - return generations; - } - - // Compute average fitness for the population - float getAverageFitness() { - float total = 0; - for (int i = 0; i < population.length; i++) { - total += population[i].fitness; - } - return total / (population.length); - } - - String allPhrases() { - String everything = ""; - - int displayLimit = min(population.length,50); - - - for (int i = 0; i < displayLimit; i++) { - everything += population[i].getPhrase() + "\n"; - } - return everything; - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/DNA.pde deleted file mode 100644 index d3ceb1ce3..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/DNA.pde +++ /dev/null @@ -1,72 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// A class to describe a psuedo-DNA, i.e. genotype -// Here, a virtual organism's DNA is an array of character. -// Functionality: -// -- convert DNA into a string -// -- calculate DNA's "fitness" -// -- mate DNA with another set of DNA -// -- mutate DNA - - -class DNA { - - // The genetic sequence - char[] genes; - - float fitness; - - // Constructor (makes a random DNA) - DNA(int num) { - genes = new char[num]; - for (int i = 0; i < genes.length; i++) { - genes[i] = (char) random(32,128); // Pick from range of chars - } - } - - // Converts character array to a String - String getPhrase() { - return new String(genes); - } - - // Fitness function (returns floating point % of "correct" characters) - void fitness (String target) { - int score = 0; - for (int i = 0; i < genes.length; i++) { - if (genes[i] == target.charAt(i)) { - score++; - } - } - - - fitness = (float)score / (float)target.length(); - } - - // Crossover - DNA crossover(DNA partner) { - // A new child - DNA child = new DNA(genes.length); - - int midpoint = int(random(genes.length)); // Pick a midpoint - - // Half from one, half from the other - for (int i = 0; i < genes.length; i++) { - if (i > midpoint) child.genes[i] = genes[i]; - else child.genes[i] = partner.genes[i]; - } - return child; - } - - // Based on a mutation probability, picks a new random character - void mutate(float mutationRate) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < mutationRate) { - genes[i] = (char) random(32,128); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/NOC_9_01_GA_Shakespeare.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/NOC_9_01_GA_Shakespeare.pde deleted file mode 100644 index d4e72a1fc..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/NOC_9_01_GA_Shakespeare.pde +++ /dev/null @@ -1,90 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// Demonstration of using a genetic algorithm to perform a search - -// setup() -// # Step 1: The Population -// # Create an empty population (an array or ArrayList) -// # Fill it with DNA encoded objects (pick random values to start) - -// draw() -// # Step 1: Selection -// # Create an empty mating pool (an empty ArrayList) -// # For every member of the population, evaluate its fitness based on some criteria / function, -// and add it to the mating pool in a manner consistant with its fitness, i.e. the more fit it -// is the more times it appears in the mating pool, in order to be more likely picked for reproduction. - -// # Step 2: Reproduction Create a new empty population -// # Fill the new population by executing the following steps: -// 1. Pick two "parent" objects from the mating pool. -// 2. Crossover -- create a "child" object by mating these two parents. -// 3. Mutation -- mutate the child's DNA based on a given probability. -// 4. Add the child object to the new population. -// # Replace the old population with the new population -// -// # Rinse and repeat - - -PFont f; -String target; -int popmax; -float mutationRate; -Population population; - -void setup() { - size(640, 360); - f = createFont("Courier", 32, true); - target = "To be or not to be."; - popmax = 150; - mutationRate = 0.01; - - // Create a populationation with a target phrase, mutation rate, and populationation max - population = new Population(target, mutationRate, popmax); -} - -void draw() { - // Generate mating pool - population.naturalSelection(); - //Create next generation - population.generate(); - // Calculate fitness - population.calcFitness(); - displayInfo(); - - // If we found the target phrase, stop - if (population.finished()) { - println(millis()/1000.0); - noLoop(); - } -} - -void displayInfo() { - background(255); - // Display current status of populationation - String answer = population.getBest(); - textFont(f); - textAlign(LEFT); - fill(0); - - - textSize(24); - text("Best phrase:",20,30); - textSize(40); - text(answer, 20, 100); - - textSize(18); - text("total generations: " + population.getGenerations(), 20, 160); - text("average fitness: " + nf(population.getAverageFitness(), 0, 2), 20, 180); - text("total population: " + popmax, 20, 200); - text("mutation rate: " + int(mutationRate * 100) + "%", 20, 220); - - textSize(10); - text("All phrases:\n" + population.allPhrases(), 500, 10); -} - - - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/Population.pde deleted file mode 100644 index d48ac6c3f..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare/Population.pde +++ /dev/null @@ -1,127 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// A class to describe a population of virtual organisms -// In this case, each organism is just an instance of a DNA object - -class Population { - - float mutationRate; // Mutation rate - DNA[] population; // Array to hold the current population - ArrayList matingPool; // ArrayList which we will use for our "mating pool" - String target; // Target phrase - int generations; // Number of generations - boolean finished; // Are we finished evolving? - int perfectScore; - - Population(String p, float m, int num) { - target = p; - mutationRate = m; - population = new DNA[num]; - for (int i = 0; i < population.length; i++) { - population[i] = new DNA(target.length()); - } - calcFitness(); - matingPool = new ArrayList(); - finished = false; - generations = 0; - - perfectScore = 1; - } - - // Fill our fitness array with a value for every member of the population - void calcFitness() { - for (int i = 0; i < population.length; i++) { - population[i].fitness(target); - } - } - - // Generate a mating pool - void naturalSelection() { - // Clear the ArrayList - matingPool.clear(); - - float maxFitness = 0; - for (int i = 0; i < population.length; i++) { - if (population[i].fitness > maxFitness) { - maxFitness = population[i].fitness; - } - } - - // Based on fitness, each member will get added to the mating pool a certain number of times - // a higher fitness = more entries to mating pool = more likely to be picked as a parent - // a lower fitness = fewer entries to mating pool = less likely to be picked as a parent - for (int i = 0; i < population.length; i++) { - - float fitness = map(population[i].fitness,0,maxFitness,0,1); - int n = int(fitness * 100); // Arbitrary multiplier, we can also use monte carlo method - for (int j = 0; j < n; j++) { // and pick two random numbers - matingPool.add(population[i]); - } - } - } - - // Create a new generation - void generate() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - int a = int(random(matingPool.size())); - int b = int(random(matingPool.size())); - DNA partnerA = matingPool.get(a); - DNA partnerB = matingPool.get(b); - DNA child = partnerA.crossover(partnerB); - child.mutate(mutationRate); - population[i] = child; - } - generations++; - } - - - // Compute the current "most fit" member of the population - String getBest() { - float worldrecord = 0.0; - int index = 0; - for (int i = 0; i < population.length; i++) { - if (population[i].fitness > worldrecord) { - index = i; - worldrecord = population[i].fitness; - } - } - - if (worldrecord == perfectScore ) finished = true; - return population[index].getPhrase(); - } - - boolean finished() { - return finished; - } - - int getGenerations() { - return generations; - } - - // Compute average fitness for the population - float getAverageFitness() { - float total = 0; - for (int i = 0; i < population.length; i++) { - total += population[i].fitness; - } - return total / (population.length); - } - - String allPhrases() { - String everything = ""; - - int displayLimit = min(population.length,50); - - - for (int i = 0; i < displayLimit; i++) { - everything += population[i].getPhrase() + "\n"; - } - return everything; - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/DNA.pde deleted file mode 100644 index e4ce06c31..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/DNA.pde +++ /dev/null @@ -1,70 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// A class to describe a psuedo-DNA, i.e. genotype -// Here, a virtual organism's DNA is an array of character. -// Functionality: -// -- convert DNA into a string -// -- calculate DNA's "fitness" -// -- mate DNA with another set of DNA -// -- mutate DNA - - -class DNA { - - // The genetic sequence - char[] genes; - - float fitness; - - // Constructor (makes a random DNA) - DNA(int num) { - genes = new char[num]; - for (int i = 0; i < genes.length; i++) { - genes[i] = (char) random(32,128); // Pick from range of chars - } - } - - // Converts character array to a String - String getPhrase() { - return new String(genes); - } - - // Fitness function (returns floating point % of "correct" characters) - void calcFitness (String target) { - int score = 0; - for (int i = 0; i < genes.length; i++) { - if (genes[i] == target.charAt(i)) { - score++; - } - } - fitness = (float)score / (float)target.length(); - } - - // Crossover - DNA crossover(DNA partner) { - // A new child - DNA child = new DNA(genes.length); - - int midpoint = int(random(genes.length)); // Pick a midpoint - - // Half from one, half from the other - for (int i = 0; i < genes.length; i++) { - if (i > midpoint) child.genes[i] = genes[i]; - else child.genes[i] = partner.genes[i]; - } - return child; - } - - // Based on a mutation probability, picks a new random character - void mutate(float mutationRate) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < mutationRate) { - genes[i] = (char) random(32,128); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/NOC_9_01_GA_Shakespeare_simplified.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/NOC_9_01_GA_Shakespeare_simplified.pde deleted file mode 100644 index a46d90a23..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_01_GA_Shakespeare_simplified/NOC_9_01_GA_Shakespeare_simplified.pde +++ /dev/null @@ -1,89 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Genetic Algorithm, Evolving Shakespeare - -// Demonstration of using a genetic algorithm to perform a search - -// setup() -// # Step 1: The Population -// # Create an empty population (an array or ArrayList) -// # Fill it with DNA encoded objects (pick random values to start) - -// draw() -// # Step 1: Selection -// # Create an empty mating pool (an empty ArrayList) -// # For every member of the population, evaluate its fitness based on some criteria / function, -// and add it to the mating pool in a manner consistant with its fitness, i.e. the more fit it -// is the more times it appears in the mating pool, in order to be more likely picked for reproduction. - -// # Step 2: Reproduction Create a new empty population -// # Fill the new population by executing the following steps: -// 1. Pick two "parent" objects from the mating pool. -// 2. Crossover -- create a "child" object by mating these two parents. -// 3. Mutation -- mutate the child's DNA based on a given probability. -// 4. Add the child object to the new population. -// # Replace the old population with the new population -// -// # Rinse and repeat - - -float mutationRate = 0.01; // Mutation rate -int totalPopulation = 150; // Total Population - -DNA[] population; // Array to hold the current population -ArrayList matingPool; // ArrayList which we will use for our "mating pool" -String target; // Target phrase - -PFont f; - -void setup() { - size(800, 200); - target = "to be or not to be"; - - population = new DNA[totalPopulation]; - - for (int i = 0; i < population.length; i++) { - population[i] = new DNA(target.length()); - } - - f = createFont("Courier",12,true); -} - -void draw() { - for (int i = 0; i < population.length; i++) { - population[i].calcFitness(target); - } - - ArrayList matingPool = new ArrayList(); // ArrayList which we will use for our "mating pool" - - for (int i = 0; i < population.length; i++) { - int nnnn = int(population[i].fitness * 100); // Arbitrary multiplier, we can also use monte carlo method - for (int j = 0; j crossover) child[i] = genes[i]; - else child[i] = partner.genes[i]; - } - DNA newgenes = new DNA(child); - return newgenes; - } - - // Based on a mutation probability, picks a new random Vector - void mutate(float m) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < m) { - float angle = random(TWO_PI); - genes[i] = new PVector(cos(angle), sin(angle)); - genes[i].mult(random(0, maxforce)); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/NOC_9_02_SmartRockets_superbasic.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/NOC_9_02_SmartRockets_superbasic.pde deleted file mode 100644 index 3ae68e806..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/NOC_9_02_SmartRockets_superbasic.pde +++ /dev/null @@ -1,74 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Smart Rockets w/ Genetic Algorithms - -// Each Rocket's DNA is an array of PVectors -// Each PVector acts as a force for each frame of animation -// Imagine an booster on the end of the rocket that can point in any direction -// and fire at any strength every frame - -// The Rocket's fitness is a function of how close it gets to the target as well as how fast it gets there - -// This example is inspired by Jer Thorp's Smart Rockets -// http://www.blprnt.com/smartrockets/ - -int lifetime; // How long should each generation live - -Population population; // Population - -int lifeCounter; // Timer for cycle of generation - -PVector target; // Target location - -void setup() { - size(640, 360); - // The number of cycles we will allow a generation to live - lifetime = height; - - // Initialize variables - lifeCounter = 0; - - target = new PVector(width/2, 24); - - // Create a population with a mutation rate, and population max - float mutationRate = 0.01; - population = new Population(mutationRate, 50); - -} - -void draw() { - background(255); - - // Draw the start and target locations - fill(0); - ellipse(target.x,target.y,24,24); - - - // If the generation hasn't ended yet - if (lifeCounter < lifetime) { - population.live(); - lifeCounter++; - // Otherwise a new generation - } - else { - lifeCounter = 0; - population.fitness(); - population.selection(); - population.reproduction(); - } - - // Display some info - fill(0); - text("Generation #: " + population.getGenerations(), 10, 18); - text("Cycles left: " + (lifetime-lifeCounter), 10, 36); -} - -// Move the target if the mouse is pressed -// System will adapt to new target -void mousePressed() { - target.x = mouseX; - target.y = mouseY; -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Population.pde deleted file mode 100644 index 128d38636..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Population.pde +++ /dev/null @@ -1,103 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// A class to describe a population of "creatures" - -class Population { - - float mutationRate; // Mutation rate - Rocket[] population; // Array to hold the current population - ArrayList matingPool; // ArrayList which we will use for our "mating pool" - int generations; // Number of generations - - // Initialize the population - Population(float m, int num) { - mutationRate = m; - population = new Rocket[num]; - matingPool = new ArrayList(); - generations = 0; - //make a new set of creatures - for (int i = 0; i < population.length; i++) { - PVector location = new PVector(width/2,height+20); - population[i] = new Rocket(location, new DNA()); - } - } - - void live () { - // Run every rocket - for (int i = 0; i < population.length; i++) { - population[i].run(); - } - } - - // Calculate fitness for each creature - void fitness() { - for (int i = 0; i < population.length; i++) { - population[i].fitness(); - } - } - - // Generate a mating pool - void selection() { - // Clear the ArrayList - matingPool.clear(); - - // Calculate total fitness of whole population - float maxFitness = getMaxFitness(); - - // Calculate fitness for each member of the population (scaled to value between 0 and 1) - // Based on fitness, each member will get added to the mating pool a certain number of times - // A higher fitness = more entries to mating pool = more likely to be picked as a parent - // A lower fitness = fewer entries to mating pool = less likely to be picked as a parent - for (int i = 0; i < population.length; i++) { - float fitnessNormal = map(population[i].getFitness(),0,maxFitness,0,1); - int n = (int) (fitnessNormal * 100); // Arbitrary multiplier - for (int j = 0; j < n; j++) { - matingPool.add(population[i]); - } - } - } - - // Making the next generation - void reproduction() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - // Sping the wheel of fortune to pick two parents - int m = int(random(matingPool.size())); - int d = int(random(matingPool.size())); - // Pick two parents - Rocket mom = matingPool.get(m); - Rocket dad = matingPool.get(d); - // Get their genes - DNA momgenes = mom.getDNA(); - DNA dadgenes = dad.getDNA(); - // Mate their genes - DNA child = momgenes.crossover(dadgenes); - // Mutate their genes - child.mutate(mutationRate); - // Fill the new population with the new child - PVector location = new PVector(width/2,height+20); - population[i] = new Rocket(location, child); - } - generations++; - } - - int getGenerations() { - return generations; - } - - // Find highest fintess for the population - float getMaxFitness() { - float record = 0; - for (int i = 0; i < population.length; i++) { - if(population[i].getFitness() > record) { - record = population[i].getFitness(); - } - } - return record; - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Rocket.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Rocket.pde deleted file mode 100644 index 2456856e4..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_02_SmartRockets_superbasic/Rocket.pde +++ /dev/null @@ -1,108 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// Rocket class -- this is just like our Boid / Particle class -// the only difference is that it has DNA & fitness - -class Rocket { - - // All of our physics stuff - PVector location; - PVector velocity; - PVector acceleration; - - // Size - float r; - - // Fitness and DNA - float fitness; - DNA dna; - // To count which force we're on in the genes - int geneCounter = 0; - - boolean hitTarget = false; // Did I reach the target - - //constructor - Rocket(PVector l, DNA dna_) { - acceleration = new PVector(); - velocity = new PVector(); - location = l.get(); - r = 4; - dna = dna_; - } - - // Fitness function - // fitness = one divided by distance squared - void fitness() { - float d = dist(location.x, location.y, target.x, target.y); - fitness = pow(1/d, 2); - } - - // Run in relation to all the obstacles - // If I'm stuck, don't bother updating or checking for intersection - void run() { - checkTarget(); // Check to see if we've reached the target - if (!hitTarget) { - applyForce(dna.genes[geneCounter]); - geneCounter = (geneCounter + 1) % dna.genes.length; - update(); - } - display(); - } - - // Did I make it to the target? - void checkTarget() { - float d = dist(location.x, location.y, target.x, target.y); - if (d < 12) { - hitTarget = true; - } - } - - void applyForce(PVector f) { - acceleration.add(f); - } - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - float theta = velocity.heading2D() + PI/2; - fill(200, 100); - stroke(0); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - - // Thrusters - rectMode(CENTER); - fill(0); - rect(-r/2, r*2, r/2, r); - rect(r/2, r*2, r/2, r); - - // Rocket body - fill(175); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - - popMatrix(); - } - - float getFitness() { - return fitness; - } - - DNA getDNA() { - return dna; - } - -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/DNA.pde deleted file mode 100644 index b4eefe1cf..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/DNA.pde +++ /dev/null @@ -1,68 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// DNA is an array of vectors - -class DNA { - - // The genetic sequence - PVector[] genes; - - // The maximum strength of the forces - float maxforce = 0.1; - - // Constructor (makes a DNA of random PVectors) - DNA() { - genes = new PVector[lifetime]; - for (int i = 0; i < genes.length; i++) { - float angle = random(TWO_PI); - genes[i] = new PVector(cos(angle), sin(angle)); - genes[i].mult(random(0, maxforce)); - } - - // Let's give each Rocket an extra boost of strength for its first frame - genes[0].normalize(); - } - - // Constructor #2, creates the instance based on an existing array - DNA(PVector[] newgenes) { - // We could make a copy if necessary - // genes = (PVector []) newgenes.clone(); - genes = newgenes; - } - - // CROSSOVER - // Creates new DNA sequence from two (this & and a partner) - DNA crossover(DNA partner) { - PVector[] child = new PVector[genes.length]; - // Pick a midpoint - int crossover = int(random(genes.length)); - // Take "half" from one and "half" from the other - for (int i = 0; i < genes.length; i++) { - if (i > crossover) child[i] = genes[i]; - else child[i] = partner.genes[i]; - } - DNA newgenes = new DNA(child); - return newgenes; - } - - // Based on a mutation probability, picks a new random Vector - void mutate(float m) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < m) { - float angle = random(TWO_PI); - genes[i] = new PVector(cos(angle), sin(angle)); - genes[i].mult(random(0, maxforce)); - // float angle = random(-0.1,0.1); - // genes[i].rotate(angle); - // float factor = random(0.9,1.1); - // genes[i].mult(factor); - if (i ==0) genes[i].normalize(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/NOC_9_03_SmartRockets.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/NOC_9_03_SmartRockets.pde deleted file mode 100644 index 2ac224f66..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/NOC_9_03_SmartRockets.pde +++ /dev/null @@ -1,94 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Smart Rockets w/ Genetic Algorithms - -// Each Rocket's DNA is an array of PVectors -// Each PVector acts as a force for each frame of animation -// Imagine an booster on the end of the rocket that can point in any direction -// and fire at any strength every frame - -// The Rocket's fitness is a function of how close it gets to the target as well as how fast it gets there - -// This example is inspired by Jer Thorp's Smart Rockets -// http://www.blprnt.com/smartrockets/ - -int lifetime; // How long should each generation live - -Population population; // Population - -int lifecycle; // Timer for cycle of generation -int recordtime; // Fastest time to target - -Obstacle target; // Target location - -//int diam = 24; // Size of target - -ArrayList obstacles; //an array list to keep track of all the obstacles! - -void setup() { - size(640, 360); - // The number of cycles we will allow a generation to live - lifetime = 300; - - // Initialize variables - lifecycle = 0; - recordtime = lifetime; - - target = new Obstacle(width/2-12, 24, 24, 24); - - // Create a population with a mutation rate, and population max - float mutationRate = 0.01; - population = new Population(mutationRate, 50); - - // Create the obstacle course - obstacles = new ArrayList(); - obstacles.add(new Obstacle(width/2-100, height/2, 200, 10)); -} - -void draw() { - background(255); - - // Draw the start and target locations - target.display(); - - - // If the generation hasn't ended yet - if (lifecycle < lifetime) { - population.live(obstacles); - if ((population.targetReached()) && (lifecycle < recordtime)) { - recordtime = lifecycle; - } - lifecycle++; - // Otherwise a new generation - } - else { - lifecycle = 0; - population.fitness(); - population.selection(); - population.reproduction(); - } - - // Draw the obstacles - for (Obstacle obs : obstacles) { - obs.display(); - } - - // Display some info - fill(0); - text("Generation #: " + population.getGenerations(), 10, 18); - text("Cycles left: " + (lifetime-lifecycle), 10, 36); - text("Record cycles: " + recordtime, 10, 54); - - -} - -// Move the target if the mouse is pressed -// System will adapt to new target -void mousePressed() { - target.location.x = mouseX; - target.location.y = mouseY; - recordtime = lifetime; -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Obstacle.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Obstacle.pde deleted file mode 100644 index e7d3d249f..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Obstacle.pde +++ /dev/null @@ -1,40 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// A class for an obstacle, just a simple rectangle that is drawn -// and can check if a Rocket touches it - -// Also using this class for target location - - -class Obstacle { - - PVector location; - float w,h; - - Obstacle(float x, float y, float w_, float h_) { - location = new PVector(x,y); - w = w_; - h = h_; - } - - void display() { - stroke(0); - fill(175); - strokeWeight(2); - rectMode(CORNER); - rect(location.x,location.y,w,h); - } - - boolean contains(PVector spot) { - if (spot.x > location.x && spot.x < location.x + w && spot.y > location.y && spot.y < location.y + h) { - return true; - } else { - return false; - } - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Population.pde deleted file mode 100644 index 432bf3b14..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Population.pde +++ /dev/null @@ -1,113 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Pathfinding w/ Genetic Algorithms - -// A class to describe a population of "creatures" - -class Population { - - float mutationRate; // Mutation rate - Rocket[] population; // Array to hold the current population - ArrayList matingPool; // ArrayList which we will use for our "mating pool" - int generations; // Number of generations - - // Initialize the population - Population(float m, int num) { - mutationRate = m; - population = new Rocket[num]; - matingPool = new ArrayList(); - generations = 0; - //make a new set of creatures - for (int i = 0; i < population.length; i++) { - PVector location = new PVector(width/2,height+20); - population[i] = new Rocket(location, new DNA(),population.length); - } - } - - void live (ArrayList os) { - // For every creature - for (int i = 0; i < population.length; i++) { - // If it finishes, mark it down as done! - population[i].checkTarget(); - population[i].run(os); - } - } - - // Did anything finish? - boolean targetReached() { - for (int i = 0; i < population.length; i++) { - if (population[i].hitTarget) return true; - } - return false; - } - - // Calculate fitness for each creature - void fitness() { - for (int i = 0; i < population.length; i++) { - population[i].fitness(); - } - } - - // Generate a mating pool - void selection() { - // Clear the ArrayList - matingPool.clear(); - - // Calculate total fitness of whole population - float maxFitness = getMaxFitness(); - - // Calculate fitness for each member of the population (scaled to value between 0 and 1) - // Based on fitness, each member will get added to the mating pool a certain number of times - // A higher fitness = more entries to mating pool = more likely to be picked as a parent - // A lower fitness = fewer entries to mating pool = less likely to be picked as a parent - for (int i = 0; i < population.length; i++) { - float fitnessNormal = map(population[i].getFitness(),0,maxFitness,0,1); - int n = (int) (fitnessNormal * 100); // Arbitrary multiplier - for (int j = 0; j < n; j++) { - matingPool.add(population[i]); - } - } - } - - // Making the next generation - void reproduction() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - // Sping the wheel of fortune to pick two parents - int m = int(random(matingPool.size())); - int d = int(random(matingPool.size())); - // Pick two parents - Rocket mom = matingPool.get(m); - Rocket dad = matingPool.get(d); - // Get their genes - DNA momgenes = mom.getDNA(); - DNA dadgenes = dad.getDNA(); - // Mate their genes - DNA child = momgenes.crossover(dadgenes); - // Mutate their genes - child.mutate(mutationRate); - // Fill the new population with the new child - PVector location = new PVector(width/2,height+20); - population[i] = new Rocket(location, child,population.length); - } - generations++; - } - - int getGenerations() { - return generations; - } - - // Find highest fintess for the population - float getMaxFitness() { - float record = 0; - for (int i = 0; i < population.length; i++) { - if(population[i].getFitness() > record) { - record = population[i].getFitness(); - } - } - return record; - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Rocket.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Rocket.pde deleted file mode 100644 index 5ce1b313b..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_03_SmartRockets/Rocket.pde +++ /dev/null @@ -1,148 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Rocket class -- this is just like our Boid / Particle class -// the only difference is that it has DNA & fitness - -class Rocket { - - // All of our physics stuff - PVector location; - PVector velocity; - PVector acceleration; - - // Size - float r; - - // How close did it get to the target - float recordDist; - - // Fitness and DNA - float fitness; - DNA dna; - // To count which force we're on in the genes - int geneCounter = 0; - - boolean hitObstacle = false; // Am I stuck on an obstacle? - boolean hitTarget = false; // Did I reach the target - int finishTime; // What was my finish time? - - //constructor - Rocket(PVector l, DNA dna_, int totalRockets) { - acceleration = new PVector(); - velocity = new PVector(); - location = l.get(); - r = 4; - dna = dna_; - finishTime = 0; // We're going to count how long it takes to reach target - recordDist = 10000; // Some high number that will be beat instantly - } - - // FITNESS FUNCTION - // distance = distance from target - // finish = what order did i finish (first, second, etc. . .) - // f(distance,finish) = (1.0f / finish^1.5) * (1.0f / distance^6); - // a lower finish is rewarded (exponentially) and/or shorter distance to target (exponetially) - void fitness() { - if (recordDist < 1) recordDist = 1; - - // Reward finishing faster and getting close - fitness = (1/(finishTime*recordDist)); - - // Make the function exponential - fitness = pow(fitness, 4); - - if (hitObstacle) fitness *= 0.1; // lose 90% of fitness hitting an obstacle - if (hitTarget) fitness *= 2; // twice the fitness for finishing! - } - - // Run in relation to all the obstacles - // If I'm stuck, don't bother updating or checking for intersection - void run(ArrayList os) { - if (!hitObstacle && !hitTarget) { - applyForce(dna.genes[geneCounter]); - geneCounter = (geneCounter + 1) % dna.genes.length; - update(); - // If I hit an edge or an obstacle - obstacles(os); - } - // Draw me! - if (!hitObstacle) { - display(); - } - } - - // Did I make it to the target? - void checkTarget() { - float d = dist(location.x, location.y, target.location.x, target.location.y); - if (d < recordDist) recordDist = d; - - if (target.contains(location) && !hitTarget) { - hitTarget = true; - } - else if (!hitTarget) { - finishTime++; - } - } - - // Did I hit an obstacle? - void obstacles(ArrayList os) { - for (Obstacle obs : os) { - if (obs.contains(location)) { - hitObstacle = true; - } - } - } - - void applyForce(PVector f) { - acceleration.add(f); - } - - - void update() { - velocity.add(acceleration); - location.add(velocity); - acceleration.mult(0); - } - - void display() { - //background(255,0,0); - float theta = velocity.heading2D() + PI/2; - fill(200, 100); - stroke(0); - strokeWeight(1); - pushMatrix(); - translate(location.x, location.y); - rotate(theta); - - // Thrusters - rectMode(CENTER); - fill(0); - rect(-r/2, r*2, r/2, r); - rect(r/2, r*2, r/2, r); - - // Rocket body - fill(175); - beginShape(TRIANGLES); - vertex(0, -r*2); - vertex(-r, r*2); - vertex(r, r*2); - endShape(); - - popMatrix(); - } - - float getFitness() { - return fitness; - } - - DNA getDNA() { - return dna; - } - - boolean stopped() { - return hitObstacle; - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Button.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Button.pde deleted file mode 100644 index eb35675ce..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Button.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Interactive Selection -// http://www.genarts.com/karl/papers/siggraph91.html - -//import java.awt.Rectangle; - -class Button { - Rectangle r; // Button's rectangle - String txt; // Button's text - boolean clickedOn; // Did i click on it? - boolean rolloverOn; // Did i rollover it? - - Button(int x, int y, int w, int h, String s) { - r = new Rectangle(x,y,w,h); - txt = s; - } - - void display() { - // Draw rectangle and text based on whether rollover or clicked - rectMode(CORNER); - stroke(0); noFill(); - if (rolloverOn) fill(0.5); - if (clickedOn) fill(0); - rect(r.x,r.y,r.width,r.height); - float b = 0.0; - if (clickedOn) b = 1; - else if (rolloverOn) b = 0.2; - else b = 0; - fill(b); - textAlign(LEFT); - text(txt,r.x+10,r.y+14); - - } - - - // Methods to check rollover, clicked, or released (must be called from appropriate - // Places in draw, mousePressed, mouseReleased - boolean rollover(int mx, int my) { - if (r.contains(mx,my)) rolloverOn = true; - else rolloverOn = false; - return rolloverOn; - } - - boolean clicked(int mx, int my) { - if (r.contains(mx,my)) clickedOn = true; - return clickedOn; - } - - void released() { - clickedOn = false; - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/DNA.pde deleted file mode 100644 index 8825979b1..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/DNA.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Interactive Selection -// http://www.genarts.com/karl/papers/siggraph91.html - -class DNA { - - // The genetic sequence - float[] genes; - int len = 20; // Arbitrary length - - //Constructor (makes a random DNA) - DNA() { - // DNA is random floating point values between 0 and 1 (!!) - genes = new float[len]; - for (int i = 0; i < genes.length; i++) { - genes[i] = random(0,1); - } - } - - DNA(float[] newgenes) { - genes = newgenes; - } - - - // Crossover - // Creates new DNA sequence from two (this & - DNA crossover(DNA partner) { - float[] child = new float[genes.length]; - int crossover = int(random(genes.length)); - for (int i = 0; i < genes.length; i++) { - if (i > crossover) child[i] = genes[i]; - else child[i] = partner.genes[i]; - } - DNA newgenes = new DNA(child); - return newgenes; - } - - // Based on a mutation probability, picks a new random character in array spots - void mutate(float m) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < m) { - genes[i] = random(0,1); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Face.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Face.pde deleted file mode 100644 index 4a2992b6f..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Face.pde +++ /dev/null @@ -1,103 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Interactive Selection -// http://www.genarts.com/karl/papers/siggraph91.html - -// The class for our "face", contains DNA sequence, fitness value, position on screen - -// Fitness Function f(t) = t (where t is "time" mouse rolls over face) - -class Face { - - DNA dna; // Face's DNA - float fitness; // How good is this face? - float x, y; // Position on screen - int wh = 70; // Size of square enclosing face - boolean rolloverOn; // Are we rolling over this face? - - Rectangle r; - - // Create a new face - Face(DNA dna_, float x_, float y_) { - dna = dna_; - x = x_; - y = y_; - fitness = 1; - // Using java.awt.Rectangle (see: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Rectangle.html) - r = new Rectangle(int(x-wh/2), int(y-wh/2), int(wh), int(wh)); - } - - // Display the face - void display() { - // We are using the face's DNA to pick properties for this face - // such as: head size, color, eye position, etc. - // Now, since every gene is a floating point between 0 and 1, we map the values - float r = map(dna.genes[0],0,1,0,70); - color c = color(dna.genes[1],dna.genes[2],dna.genes[3]); - float eye_y = map(dna.genes[4],0,1,0,5); - float eye_x = map(dna.genes[5],0,1,0,10); - float eye_size = map(dna.genes[5],0,1,0,10); - color eyecolor = color(dna.genes[4],dna.genes[5],dna.genes[6]); - color mouthColor = color(dna.genes[7],dna.genes[8],dna.genes[9]); - float mouth_y = map(dna.genes[5],0,1,0,25); - float mouth_x = map(dna.genes[5],0,1,-25,25); - float mouthw = map(dna.genes[5],0,1,0,50); - float mouthh = map(dna.genes[5],0,1,0,10); - - // Once we calculate all the above properties, we use those variables to draw rects, ellipses, etc. - pushMatrix(); - translate(x, y); - noStroke(); - - // Draw the head - fill(c); - ellipseMode(CENTER); - ellipse(0, 0, r, r); - - // Draw the eyes - fill(eyecolor); - rectMode(CENTER); - rect(-eye_x, -eye_y, eye_size, eye_size); - rect( eye_x, -eye_y, eye_size, eye_size); - - // Draw the mouth - fill(mouthColor); - rectMode(CENTER); - rect(mouth_x, mouth_y, mouthw, mouthh); - - // Draw the bounding box - stroke(0.25); - if (rolloverOn) fill(0, 0.25); - else noFill(); - rectMode(CENTER); - rect(0, 0, wh, wh); - popMatrix(); - - // Display fitness value - textAlign(CENTER); - if (rolloverOn) fill(0); - else fill(0.25); - text(int(fitness), x, y+55); - } - - float getFitness() { - return fitness; - } - - DNA getDNA() { - return dna; - } - - // Increment fitness if mouse is rolling over face - void rollover(int mx, int my) { - if (r.contains(mx, my)) { - rolloverOn = true; - fitness += 0.25; - } else { - rolloverOn = false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/NOC_9_04_Faces_interactiveselection.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/NOC_9_04_Faces_interactiveselection.pde deleted file mode 100644 index e85545805..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/NOC_9_04_Faces_interactiveselection.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Interactive Selection -// http://www.genarts.com/karl/papers/siggraph91.html - -Population population; -Button button; - -void setup() { - size(800,200); - colorMode(RGB,1.0); - int popmax = 10; - float mutationRate = 0.05; // A pretty high mutation rate here, our population is rather small we need to enforce variety - // Create a population with a target phrase, mutation rate, and population max - population = new Population(mutationRate,popmax); - // A simple button class - button = new Button(15,150,160,20, "evolve new generation"); -} - -void draw() { - background(1.0); - // Display the faces - population.display(); - population.rollover(mouseX,mouseY); - // Display some text - textAlign(LEFT); - fill(0); - text("Generation #:" + population.getGenerations(),15,190); - - // Display the button - button.display(); - button.rollover(mouseX,mouseY); - -} - -// If the button is clicked, evolve next generation -void mousePressed() { - if (button.clicked(mouseX,mouseY)) { - population.selection(); - population.reproduction(); - } -} - -void mouseReleased() { - button.released(); -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Population.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Population.pde deleted file mode 100644 index 625c6f9d1..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Population.pde +++ /dev/null @@ -1,102 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Interactive Selection -// http://www.genarts.com/karl/papers/siggraph91.html - -// A class to describe a population of faces -// this hasn't changed very much from example to example - -class Population { - - float mutationRate; // Mutation rate - Face[] population; // array to hold the current population - ArrayList matingPool; // ArrayList which we will use for our "mating pool" - int generations; // Number of generations - - // Create the population - Population(float m, int num) { - mutationRate = m; - population = new Face[num]; - matingPool = new ArrayList(); - generations = 0; - for (int i = 0; i < population.length; i++) { - population[i] = new Face(new DNA(), 50+i*75, 60); - } - } - - // Display all faces - void display() { - for (int i = 0; i < population.length; i++) { - population[i].display(); - } - } - - // Are we rolling over any of the faces? - void rollover(int mx, int my) { - for (int i = 0; i < population.length; i++) { - population[i].rollover(mx, my); - } - } - - // Generate a mating pool - void selection() { - // Clear the ArrayList - matingPool.clear(); - - // Calculate total fitness of whole population - float maxFitness = getMaxFitness(); - - // Calculate fitness for each member of the population (scaled to value between 0 and 1) - // Based on fitness, each member will get added to the mating pool a certain number of times - // A higher fitness = more entries to mating pool = more likely to be picked as a parent - // A lower fitness = fewer entries to mating pool = less likely to be picked as a parent - for (int i = 0; i < population.length; i++) { - float fitnessNormal = map(population[i].getFitness(), 0, maxFitness, 0, 1); - int n = (int) (fitnessNormal * 100); // Arbitrary multiplier - for (int j = 0; j < n; j++) { - matingPool.add(population[i]); - } - } - } - - // Making the next generation - void reproduction() { - // Refill the population with children from the mating pool - for (int i = 0; i < population.length; i++) { - // Sping the wheel of fortune to pick two parents - int m = int(random(matingPool.size())); - int d = int(random(matingPool.size())); - // Pick two parents - Face mom = matingPool.get(m); - Face dad = matingPool.get(d); - // Get their genes - DNA momgenes = mom.getDNA(); - DNA dadgenes = dad.getDNA(); - // Mate their genes - DNA child = momgenes.crossover(dadgenes); - // Mutate their genes - child.mutate(mutationRate); - // Fill the new population with the new child - population[i] = new Face(child, 50+i*75, 60); - } - generations++; - } - - int getGenerations() { - return generations; - } - - // Find highest fintess for the population - float getMaxFitness() { - float record = 0; - for (int i = 0; i < population.length; i++) { - if (population[i].getFitness() > record) { - record = population[i].getFitness(); - } - } - return record; - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Rectangle.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Rectangle.pde deleted file mode 100644 index ed6d6d70c..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_04_Faces_interactiveselection/Rectangle.pde +++ /dev/null @@ -1,25 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Re-implementing java.awt.Rectangle -// so JS mode works - -class Rectangle { - int x; - int y; - int width; - int height; - - Rectangle(int x_, int y_, int w, int h) { - x = x_; - y = y_; - width = w; - height = h; - } - - boolean contains(int px, int py) { - return (px > x && px < x + width && py > y && py < y + height); - } - -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Bloop.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Bloop.pde deleted file mode 100644 index 7859b6630..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Bloop.pde +++ /dev/null @@ -1,108 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Evolution EcoSystem - -// Creature class - -class Bloop { - PVector location; // Location - DNA dna; // DNA - float health; // Life timer - float xoff; // For perlin noise - float yoff; - // DNA will determine size and maxspeed - float r; - float maxspeed; - - // Create a "bloop" creature - Bloop(PVector l, DNA dna_) { - location = l.get(); - health = 200; - xoff = random(1000); - yoff = random(1000); - dna = dna_; - // Gene 0 determines maxspeed and r - // The bigger the bloop, the slower it is - maxspeed = map(dna.genes[0], 0, 1, 15, 0); - r = map(dna.genes[0], 0, 1, 0, 50); - } - - void run() { - update(); - borders(); - display(); - } - - // A bloop can find food and eat it - void eat(Food f) { - ArrayList food = f.getFood(); - // Are we touching any food objects? - for (int i = food.size()-1; i >= 0; i--) { - PVector foodLocation = food.get(i); - float d = PVector.dist(location, foodLocation); - // If we are, juice up our strength! - if (d < r/2) { - health += 100; - food.remove(i); - } - } - } - - // At any moment there is a teeny, tiny chance a bloop will reproduce - Bloop reproduce() { - // asexual reproduction - if (random(1) < 0.0005) { - // Child is exact copy of single parent - DNA childDNA = dna.copy(); - // Child DNA can mutate - childDNA.mutate(0.01); - return new Bloop(location, childDNA); - } - else { - return null; - } - } - - // Method to update location - void update() { - // Simple movement based on perlin noise - float vx = map(noise(xoff),0,1,-maxspeed,maxspeed); - float vy = map(noise(yoff),0,1,-maxspeed,maxspeed); - PVector velocity = new PVector(vx,vy); - xoff += 0.01; - yoff += 0.01; - - location.add(velocity); - // Death always looming - health -= 0.2; - } - - // Wraparound - void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; - } - - // Method to display - void display() { - ellipseMode(CENTER); - stroke(0,health); - fill(0, health); - ellipse(location.x, location.y, r, r); - } - - // Death - boolean dead() { - if (health < 0.0) { - return true; - } - else { - return false; - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/DNA.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/DNA.pde deleted file mode 100644 index 807e776a7..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/DNA.pde +++ /dev/null @@ -1,44 +0,0 @@ -// Evolution EcoSystem -// Daniel Shiffman - -// Class to describe DNA -// Has more features for two parent mating (not used in this example) - -class DNA { - - // The genetic sequence - float[] genes; - - // Constructor (makes a random DNA) - DNA() { - // DNA is random floating point values between 0 and 1 (!!) - genes = new float[1]; - for (int i = 0; i < genes.length; i++) { - genes[i] = random(0,1); - } - } - - DNA(float[] newgenes) { - genes = newgenes; - } - - DNA copy() { - float[] newgenes = new float[genes.length]; - //arraycopy(genes,newgenes); - // JS mode not supporting arraycopy - for (int i = 0; i < newgenes.length; i++) { - newgenes[i] = genes[i]; - } - - return new DNA(newgenes); - } - - // Based on a mutation probability, picks a new random character in array spots - void mutate(float m) { - for (int i = 0; i < genes.length; i++) { - if (random(1) < m) { - genes[i] = random(0,1); - } - } - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Food.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Food.pde deleted file mode 100644 index ea0cb59b1..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/Food.pde +++ /dev/null @@ -1,44 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Evolution EcoSystem - -// A collection of food in the world - -class Food { - ArrayList food; - - Food(int num) { - // Start with some food - food = new ArrayList(); - for (int i = 0; i < num; i++) { - food.add(new PVector(random(width),random(height))); - } - } - - // Add some food at a location - void add(PVector l) { - food.add(l.get()); - } - - // Display the food - void run() { - for (PVector f : food) { - rectMode(CENTER); - stroke(0); - fill(175); - rect(f.x,f.y,8,8); - } - - // There's a small chance food will appear randomly - if (random(1) < 0.001) { - food.add(new PVector(random(width),random(height))); - } - } - - // Return the list of food - ArrayList getFood() { - return food; - } -} diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/NOC_9_05_EvolutionEcosystem.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/NOC_9_05_EvolutionEcosystem.pde deleted file mode 100644 index f273cfd68..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/NOC_9_05_EvolutionEcosystem.pde +++ /dev/null @@ -1,37 +0,0 @@ -// Evolution EcoSystem -// Daniel Shiffman -// The Nature of Code - -// A World of creatures that eat food -// The more they eat, the longer they survive -// The longer they survive, the more likely they are to reproduce -// The bigger they are, the easier it is to land on food -// The bigger they are, the slower they are to find food -// When the creatures die, food is left behind - - -World world; - -void setup() { - size(640, 360); - // World starts with 20 creatures - // and 20 pieces of food - world = new World(20); - smooth(); -} - -void draw() { - background(255); - world.run(); -} - -// We can add a creature manually if we so desire -void mousePressed() { - world.born(mouseX,mouseY); -} - -void mouseDragged() { - world.born(mouseX,mouseY); -} - - diff --git a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/World.pde b/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/World.pde deleted file mode 100644 index c0789604d..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/NOC_9_05_EvolutionEcosystem/World.pde +++ /dev/null @@ -1,56 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Evolution EcoSystem - -// The World we live in -// Has bloops and food - -class World { - - ArrayList bloops; // An arraylist for all the creatures - Food food; - - // Constructor - World(int num) { - // Start with initial food and creatures - food = new Food(num); - bloops = new ArrayList(); // Initialize the arraylist - for (int i = 0; i < num; i++) { - PVector l = new PVector(random(width),random(height)); - DNA dna = new DNA(); - bloops.add(new Bloop(l,dna)); - } - } - - // Make a new creature - void born(float x, float y) { - PVector l = new PVector(x,y); - DNA dna = new DNA(); - bloops.add(new Bloop(l,dna)); - } - - // Run the world - void run() { - // Deal with food - food.run(); - - // Cycle through the ArrayList backwards b/c we are deleting - for (int i = bloops.size()-1; i >= 0; i--) { - // All bloops run and eat - Bloop b = bloops.get(i); - b.run(); - b.eat(food); - // If it's dead, kill it and make food - if (b.dead()) { - bloops.remove(i); - food.add(b.location); - } - // Perhaps this bloop would like to make a baby? - Bloop child = b.reproduce(); - if (child != null) bloops.add(child); - } - } -} - diff --git a/java/examples/Books/Nature of Code/chp9_ga/bruteforce/bruteforce.pde b/java/examples/Books/Nature of Code/chp9_ga/bruteforce/bruteforce.pde deleted file mode 100644 index d502a7151..000000000 --- a/java/examples/Books/Nature of Code/chp9_ga/bruteforce/bruteforce.pde +++ /dev/null @@ -1,18 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -int now = millis(); - -int passedTime = millis() - now; -int count = 0; -while (passedTime < 1000) { - for (int i = 0; i < 33; i++) { - float r = random(27); - } - count++; - passedTime = millis() - now; -} -println(count); - - diff --git a/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Exercise_I_10_NoiseLandscape.pde b/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Exercise_I_10_NoiseLandscape.pde deleted file mode 100644 index aae2bf669..000000000 --- a/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Exercise_I_10_NoiseLandscape.pde +++ /dev/null @@ -1,32 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// Landscape with height values according to Perlin noise - -Landscape land; -float theta = 0.0; - -void setup() { - - size(800,200,P3D); - - // Create a landscape object - land = new Landscape(20,800,400); -} - -void draw() { - - // Ok, visualize the landscape space - background(255); - pushMatrix(); - translate(width/2,height/2+20,-160); - rotateX(PI/3); - rotateZ(theta); - land.render(); - popMatrix(); - - land.calculate(); - - theta += 0.0025; -} diff --git a/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Landscape.pde b/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Landscape.pde deleted file mode 100644 index 661e5502d..000000000 --- a/java/examples/Books/Nature of Code/introduction/Exercise_I_10_NoiseLandscape/Landscape.pde +++ /dev/null @@ -1,67 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// "Landscape" example - -class Landscape { - - int scl; // size of each cell - int w, h; // width and height of thingie - int rows, cols; // number of rows and columns - float zoff = 0.0; // perlin noise argument - float[][] z; // using an array to store all the height values - - Landscape(int scl_, int w_, int h_) { - scl = scl_; - w = w_; - h = h_; - cols = w/scl; - rows = h/scl; - z = new float[cols][rows]; - } - - - // Calculate height values (based off a neural netork) - void calculate() { - float xoff = 0; - for (int i = 0; i < cols; i++) - { - float yoff = 0; - for (int j = 0; j < rows; j++) - { - z[i][j] = map(noise(xoff, yoff,zoff), 0, 1, -120, 120); - yoff += 0.1; - } - xoff += 0.1; - } - zoff+=0.01; - } - - // Render landscape as grid of quads - void render() { - // Every cell is an individual quad - // (could use quad_strip here, but produces funny results, investigate this) - for (int x = 0; x < z.length-1; x++) - { - for (int y = 0; y < z[x].length-1; y++) - { - // one quad at a time - // each quad's color is determined by the height value at each vertex - // (clean this part up) - stroke(0); - fill(100, 100); - pushMatrix(); - beginShape(QUADS); - translate(x*scl-w/2, y*scl-h/2, 0); - vertex(0, 0, z[x][y]); - vertex(scl, 0, z[x+1][y]); - vertex(scl, scl, z[x+1][y+1]); - vertex(0, scl, z[x][y+1]); - endShape(); - popMatrix(); - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Exercise_I_1_WalkerTendsToDownRight.pde b/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Exercise_I_1_WalkerTendsToDownRight.pde deleted file mode 100644 index e1c34a553..000000000 --- a/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Exercise_I_1_WalkerTendsToDownRight.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(800,200); - // Create a walker object - w = new Walker(); - background(255); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Walker.pde b/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Walker.pde deleted file mode 100644 index 42a020bce..000000000 --- a/java/examples/Books/Nature of Code/introduction/Exercise_I_1_WalkerTendsToDownRight/Walker.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker object! - -class Walker { - int x,y; - - Walker() { - x = width/2; - y = height/2; - } - - void render() { - stroke(0); - strokeWeight(2); - point(x,y); - } - - // Randomly move up, down, left, right, or stay in one place - void step() { - - float r = random(1); - // A 40% of moving to the right! - if (r < 0.4) { - x++; - } else if (r < 0.5) { - x--; - } else if (r < 0.9) { - y++; - } else { - y--; - } - - x = constrain(x,0,width-1); - y = constrain(y,0,height-1); - } -} diff --git a/java/examples/Books/Nature of Code/introduction/Exercise_I_9_Noise3D/Exercise_I_9_Noise3D.pde b/java/examples/Books/Nature of Code/introduction/Exercise_I_9_Noise3D/Exercise_I_9_Noise3D.pde deleted file mode 100644 index 3b839de9c..000000000 --- a/java/examples/Books/Nature of Code/introduction/Exercise_I_9_Noise3D/Exercise_I_9_Noise3D.pde +++ /dev/null @@ -1,47 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float increment = 0.01; -// The noise function's 3rd argument, a global variable that increments once per cycle -float zoff = 0.0; -// We will increment zoff differently than xoff and yoff -float zincrement = 0.02; - -void setup() { - size(200,200); -} - -void draw() { - background(0); - - // Optional: adjust noise detail here - // noiseDetail(8,0.65f); - - loadPixels(); - - float xoff = 0.0; // Start xoff at 0 - - // For every x,y coordinate in a 2D space, calculate a noise value and produce a brightness value - for (int x = 0; x < width; x++) { - xoff += increment; // Increment xoff - float yoff = 0.0; // For every xoff, start yoff at 0 - for (int y = 0; y < height; y++) { - yoff += increment; // Increment yoff - - // Calculate noise and scale by 255 - float bright = noise(xoff,yoff,zoff)*255; - - // Try using this line instead - //float bright = random(0,255); - - // Set each pixel onscreen to a grayscale value - pixels[x+y*width] = color(bright,bright,bright); - } - } - updatePixels(); - - zoff += zincrement; // Increment zoff - - -} diff --git a/java/examples/Books/Nature of Code/introduction/Figure_I_2_BellCurve/Figure_I_2_BellCurve.pde b/java/examples/Books/Nature of Code/introduction/Figure_I_2_BellCurve/Figure_I_2_BellCurve.pde deleted file mode 100644 index af69b84fd..000000000 --- a/java/examples/Books/Nature of Code/introduction/Figure_I_2_BellCurve/Figure_I_2_BellCurve.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float[] heights; - -void setup() { - size(400, 200); - smooth(); -} - -void draw() { - background(255); - float e = 2.71828183; //"e", see http://mathforum.org/dr.math/faq/faq.e.html for more info - float[] heights = new float[width]; //use an array to store all the "y" values - float m = 0; //default mean of 0 - float sd = map(mouseX,0,width,0.4,2); //standard deviation based on mouseX - for (int i = 0; i < heights.length; i++) { - float xcoord = map(i,0,width,-3,3); - float sq2pi = sqrt(2*PI); //square root of 2 * PI - float xmsq = -1*(xcoord-m)*(xcoord-m); //-(x - mu)^2 - float sdsq = sd*sd; //variance (standard deviation squared) - heights[i] = (1 / (sd * sq2pi)) * (pow(e, (xmsq/sdsq))); //P(x) function - } - - // a little for loop that draws a line between each point on the graph - stroke(0); - strokeWeight(2); - noFill(); - beginShape(); - for (int i = 0; i < heights.length-1; i++) { - float x = i; - float y = map(heights[i], 0, 1, height-2, 2); - vertex(x, y); - } - endShape(); -} - diff --git a/java/examples/Books/Nature of Code/introduction/Figure_I_5_Noise1DGraph/Figure_I_5_Noise1DGraph.pde b/java/examples/Books/Nature of Code/introduction/Figure_I_5_Noise1DGraph/Figure_I_5_Noise1DGraph.pde deleted file mode 100644 index 1d3dc21d8..000000000 --- a/java/examples/Books/Nature of Code/introduction/Figure_I_5_Noise1DGraph/Figure_I_5_Noise1DGraph.pde +++ /dev/null @@ -1,28 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// TIME -float t = 0.0; - -void setup() { - size(400,200); - smooth(); -} - - -void draw() { - background(255); - float xoff = t; - noFill(); - stroke(0); - strokeWeight(2); - beginShape(); - for (int i = 0; i < width; i++) { - float y = noise(xoff)*height; - xoff += 0.01; - vertex(i,y); - } - endShape(); - t+= 0.01; -} diff --git a/java/examples/Books/Nature of Code/introduction/Figure_I_6_RandomGraph/Figure_I_6_RandomGraph.pde b/java/examples/Books/Nature of Code/introduction/Figure_I_6_RandomGraph/Figure_I_6_RandomGraph.pde deleted file mode 100644 index fad4fe2d7..000000000 --- a/java/examples/Books/Nature of Code/introduction/Figure_I_6_RandomGraph/Figure_I_6_RandomGraph.pde +++ /dev/null @@ -1,23 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -void setup() { - size(400,200); - smooth(); -} - - -void draw() { - background(255); - noFill(); - stroke(0); - strokeWeight(2); - beginShape(); - for (int i = 0; i < width; i++) { - float y = random(height); - vertex(i,y); - } - endShape(); - noLoop(); -} diff --git a/java/examples/Books/Nature of Code/introduction/Gaussian2/Gaussian2.pde b/java/examples/Books/Nature of Code/introduction/Gaussian2/Gaussian2.pde deleted file mode 100644 index 50eb81f69..000000000 --- a/java/examples/Books/Nature of Code/introduction/Gaussian2/Gaussian2.pde +++ /dev/null @@ -1,48 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Random generator; - -void setup() { - size(200,200); - background(0); - generator = new Random(); -} - -void draw() { - //create an alpha blended background - fill(0,1); - rect(0,0,width,height); - - //get 3 gaussian random numbers w/ mean of 0 and standard deviation of 1.0 - float r = (float) generator.nextGaussian(); - float g = (float) generator.nextGaussian(); - float b = (float) generator.nextGaussian(); - - //define standard deviation and mean - float sd = 100; float mean = 100; - //scale by standard deviation and mean - //also constrain to between (0,255) since we are dealing with color - r = constrain((r * sd) + mean,0,255); - - //repeat for g & b - sd = 20; mean = 200; - g = constrain((g * sd) + mean,0,255); - sd = 50; mean = 0; - b = constrain((b * sd) + mean,0,255); - - //get more gaussian numbers, this time for location - float xloc = (float) generator.nextGaussian(); - float yloc = (float) generator.nextGaussian(); - sd = width/10; - mean = width/2; - xloc = ( xloc * sd ) + mean; - yloc = ( yloc * sd ) + mean; - - //draw an ellipse with gaussian generated color and location - noStroke(); - fill(r,g,b); - ellipse(xloc,yloc,8,8); -} - diff --git a/java/examples/Books/Nature of Code/introduction/MonteCarloDistribution/MonteCarloDistribution.pde b/java/examples/Books/Nature of Code/introduction/MonteCarloDistribution/MonteCarloDistribution.pde deleted file mode 100644 index ea68bef4b..000000000 --- a/java/examples/Books/Nature of Code/introduction/MonteCarloDistribution/MonteCarloDistribution.pde +++ /dev/null @@ -1,65 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -float[] vals; // Array to count how often a random # is picked -float[] norms; // Normalized version of above - -void setup() { - size(200, 200); - vals = new float[width]; - norms = new float[width]; -} - -void draw() { - background(100); - - // Pick a random number between 0 and 1 based on custom probability function - float n = montecarlo(); - - // What spot in the array did we pick - int index = int(n*width); - vals[index]++; - stroke(255); - - boolean normalization = false; - float maxy = 0.0; - - // Draw graph based on values in norms array - // If a value is greater than the height, set normalization to true - for (int x = 0; x < vals.length; x++) { - line(x, height, x, height-norms[x]); - if (vals[x] > height) normalization = true; - if (vals[x] > maxy) maxy = vals[x]; - } - - // If normalization is true then normalize to height - // Otherwise, just copy the info - for (int x = 0; x < vals.length; x++) { - if (normalization) norms[x] = (vals[x] / maxy) * (height); - else norms[x] = vals[x]; - } -} - -// An algorithm for picking a random number based on monte carlo method -// Here probability is determined by formula y = x -float montecarlo() { - // Have we found one yet - boolean foundone = false; - int hack = 0; // let's count just so we don't get stuck in an infinite loop by accident - while (!foundone && hack < 10000) { - // Pick two random numbers - float r1 = (float) random(1); - float r2 = (float) random(1); - float y = r1*r1; // y = x*x (change for different results) - // If r2 is valid, we'll use this one - if (r2 < y) { - foundone = true; - return r1; - } - hack++; - } - // Hack in case we run into a problem (need to improve this) - return 0; -} - diff --git a/java/examples/Books/Nature of Code/introduction/MultipleProbability/MultipleProbability.pde b/java/examples/Books/Nature of Code/introduction/MultipleProbability/MultipleProbability.pde deleted file mode 100644 index 21ac11af4..000000000 --- a/java/examples/Books/Nature of Code/introduction/MultipleProbability/MultipleProbability.pde +++ /dev/null @@ -1,38 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -int x,y; - -void setup() { - size(200,200); - background(0); - smooth(); -} - -void draw() { - //create an alpha blended background - fill(0,1); - rect(0,0,width,height); - - //probabilities for 3 different cases (these need to add up to 100% since something always occurs here!) - float p1 = 0.05; // 5% chance of pure white occurring - float p2 = 0.80 + p1; // 80% chance of gray occuring - //float p3 = 1.0 - p2 ; // 15% chance of black (we don't actually need this line since it is - // by definit n, the "in all other cases" part of our else - float num = random(1); // pick a random number between 0 and 1 - if (num height) normalization = true; - if(vals[x] > maxy) maxy = vals[x]; - } - for (int x = 0; x < vals.length; x++) { - if (normalization) norms[x] = (vals[x] / maxy) * (height); - else norms[x] = vals[x]; - } -} diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/NoiseWalkAcceleration.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/NoiseWalkAcceleration.pde deleted file mode 100644 index 0f516cb1a..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/NoiseWalkAcceleration.pde +++ /dev/null @@ -1,22 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(640,360); - // Create a walker object - w = new Walker(); - -} - -void draw() { - background(255); - // Run the walker object - w.walk(); - w.display(); -} - - - diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/Walker.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/Walker.pde deleted file mode 100644 index ebedbbd66..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalkAcceleration/Walker.pde +++ /dev/null @@ -1,65 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker class! - -class Walker { - PVector location; - PVector velocity; - PVector acceleration; - - ArrayList history; - - PVector noff; - - - Walker() { - location = new PVector(width/2, height/2); - history = new ArrayList(); - noff = new PVector(random(1000), random(1000)); - velocity = new PVector(); - acceleration = new PVector(); - } - - void display() { - stroke(0); - fill(175); - rectMode(CENTER); - rect(location.x, location.y, 16, 16); - - beginShape(); - stroke(0); - noFill(); - for (PVector v: history) { - vertex(v.x, v.y); - } - endShape(); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - - - acceleration.x = map(noise(noff.x), 0, 1, -1, 1); - acceleration.y = map(noise(noff.y), 0, 1, -1, 1); - acceleration.mult(0.1); - - noff.add(0.01, 0.01, 0); - - velocity.add(acceleration); - velocity.limit(1); - location.add(velocity); - - - history.add(location.get()); - if (history.size() > 1000) { - history.remove(0); - } - - // Stay on the screen - location.x = constrain(location.x, 0, width-1); - location.y = constrain(location.y, 0, height-1); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/NoiseWalkVelocity.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/NoiseWalkVelocity.pde deleted file mode 100644 index aaca5448a..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/NoiseWalkVelocity.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(400,400); - frameRate(30); - - // Create a walker object - w = new Walker(); - -} - -void draw() { - background(255); - // Run the walker object - w.walk(); - w.display(); -} - - - diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/Walker.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/Walker.pde deleted file mode 100644 index 2749b5095..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalkVelocity/Walker.pde +++ /dev/null @@ -1,60 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker class! - -class Walker { - PVector location; - PVector velocity; - - ArrayList history; - - PVector noff; - - - Walker() { - location = new PVector(width/2, height/2); - history = new ArrayList(); - noff = new PVector(random(1000), random(1000)); - velocity = new PVector(); - } - - void display() { - stroke(0); - fill(175); - rectMode(CENTER); - rect(location.x, location.y, 16, 16); - - beginShape(); - stroke(0); - noFill(); - for (PVector v: history) { - vertex(v.x, v.y); - } - endShape(); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - - - velocity.x = map(noise(noff.x), 0, 1, -1, 1); - velocity.y = map(noise(noff.y), 0, 1, -1, 1); - velocity.mult(5); - - noff.add(0.01, 0.01, 0); - - location.add(velocity); - - history.add(location.get()); - if (history.size() > 1000) { - history.remove(0); - } - - // Stay on the screen - location.x = constrain(location.x, 0, width-1); - location.y = constrain(location.y, 0, height-1); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/NoiseWalk_Many.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/NoiseWalk_Many.pde deleted file mode 100644 index 9c37a168a..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/NoiseWalk_Many.pde +++ /dev/null @@ -1,35 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker[] w; - -int total = 0; - -void setup() { - size(600, 400); - - w = new Walker[10]; - for (int i = 0; i < w.length; i++) { - w[i] = new Walker(); - } -} - -void draw() { - background(255); - int o = int(map(mouseX,0,width,1,8)); - noiseDetail(o,0.3); - - if (frameCount % 30 == 0) { - total = total + 1; - if (total > w.length-1) { - total = w.length-1; - } - } - - for (int i = 0; i < total; i++) { - w[i].walk(); - w[i].display(); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/Walker.pde b/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/Walker.pde deleted file mode 100644 index 19a42fd4a..000000000 --- a/java/examples/Books/Nature of Code/introduction/NoiseWalk_Many/Walker.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker class! - -class Walker { - PVector location; - - PVector noff; - - Walker() { - location = new PVector(width/2, height/2); - noff = new PVector(random(1000),random(1000)); - } - - void display() { - strokeWeight(2); - fill(127); - stroke(0); - ellipse(location.x, location.y, 48, 48); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - - location.x = map(noise(noff.x),0,1,0,width); - location.y = map(noise(noff.y),0,1,0,height); - - noff.x += 0.01; - noff.y += 0.01; - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalk/RandomWalk.pde b/java/examples/Books/Nature of Code/introduction/RandomWalk/RandomWalk.pde deleted file mode 100644 index 7832e2b77..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalk/RandomWalk.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(400,400); - frameRate(30); - - // Create a walker object - w = new Walker(); - -} - -void draw() { - background(255); - // Run the walker object - w.walk(); - w.render(); -} - - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalk/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalk/Walker.pde deleted file mode 100644 index 55d0dc60a..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalk/Walker.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker class! - -class Walker { - float x, y; - - Walker() { - x = width/2; - y = height/2; - } - - void render() { - stroke(0); - fill(175); - rectMode(CENTER); - rect(x, y, 40, 40); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - float vx = random(-2, 2); - float vy = random(-2, 2); - x += vx; - y += vy; - - // Stay on the screen - x = constrain(x, 0, width-1); - y = constrain(y, 0, height-1); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/RandomWalkLevy.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/RandomWalkLevy.pde deleted file mode 100644 index 32a0d4a54..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/RandomWalkLevy.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://natureofcode.com - -Walker w; - -void setup() { - size(640,480); - // Create a walker object - w = new Walker(); - background(0); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/Walker.pde deleted file mode 100644 index fa48396e2..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkLevy/Walker.pde +++ /dev/null @@ -1,54 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://natureofcode.com - -// A random walker object! - -class Walker { - float x, y; - - float prevX, prevY; - - Walker() { - x = width/2; - y = height/2; - } - - void render() { - stroke(255); - line(prevX,prevY,x, y); - } - - // Randomly move according to floating point values - void step() { - prevX = x; - prevY = y; - - float stepx = random(-1, 1); - float stepy = random(-1, 1); - - float stepsize = montecarlo()*50; - stepx *= stepsize; - stepy *= stepsize; - - x += stepx; - y += stepy; - x = constrain(x, 0, width-1); - y = constrain(y, 0, height-1); - } -} - - -float montecarlo() { - while (true) { - - float r1 = random(1); - float probability = pow(1.0 - r1,8); - - float r2 = random(1); - if (r2 < probability) { - return r1; - } - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/RandomWalkNoise.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/RandomWalkNoise.pde deleted file mode 100644 index cb1143921..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/RandomWalkNoise.pde +++ /dev/null @@ -1,19 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(640,360); - w = new Walker(); - background(0); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/Walker.pde deleted file mode 100644 index be8f1b716..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkNoise/Walker.pde +++ /dev/null @@ -1,39 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker object! - -class Walker { - float x, y; - float tx, ty; - - float prevX, prevY; - - Walker() { - tx = 0; - ty = 10000; - x = map(noise(tx), 0, 1, 0, width); - y = map(noise(ty), 0, 1, 0, height); - } - - void render() { - stroke(255); - line(prevX, prevY, x, y); - } - - // Randomly move according to floating point values - void step() { - - prevX = x; - prevY = y; - - x = map(noise(tx), 0, 1, 0, width); - y = map(noise(ty), 0, 1, 0, height); - - tx += 0.01; - ty += 0.01; - - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/RandomWalkPVector.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/RandomWalkPVector.pde deleted file mode 100644 index 7832e2b77..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/RandomWalkPVector.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(400,400); - frameRate(30); - - // Create a walker object - w = new Walker(); - -} - -void draw() { - background(255); - // Run the walker object - w.walk(); - w.render(); -} - - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/Walker.pde deleted file mode 100644 index 27e4f6a22..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkPVector/Walker.pde +++ /dev/null @@ -1,31 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://natureofcode.com - -// A random walker class! - -class Walker { - PVector loc; - - Walker() { - loc = new PVector(width/2,height/2); - } - - void render() { - stroke(0); - fill(175); - rectMode(CENTER); - rect(loc.x,loc.y,40,40); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - PVector vel = new PVector(random(-2,2),random(-2,2)); - loc.add(vel); - - // Stay on the screen - loc.x = constrain(loc.x,0,width-1); - loc.y = constrain(loc.y,0,height-1); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/RandomWalkTraditional2.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/RandomWalkTraditional2.pde deleted file mode 100644 index 9cb6af8c6..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/RandomWalkTraditional2.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(200,200); - // Create a walker object - w = new Walker(); - background(0); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/Walker.pde deleted file mode 100644 index 856cf0bb5..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional2/Walker.pde +++ /dev/null @@ -1,29 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker object! - -class Walker { - int x,y; - - Walker() { - x = width/2; - y = height/2; - } - - void render() { - stroke(255); - point(x,y); - } - - // Randomly move to any neighboring pixel (or stay in the same spot) - void step() { - int stepx = int(random(3))-1; - int stepy = int(random(3))-1; - x += stepx; - y += stepy; - x = constrain(x,0,width-1); - y = constrain(y,0,height-1); - } -} diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/RandomWalkTraditional3.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/RandomWalkTraditional3.pde deleted file mode 100644 index 9cb6af8c6..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/RandomWalkTraditional3.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(200,200); - // Create a walker object - w = new Walker(); - background(0); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/Walker.pde deleted file mode 100644 index fdd0271d0..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTraditional3/Walker.pde +++ /dev/null @@ -1,30 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker object! - -class Walker { - float x, y; - - Walker() { - x = width/2; - y = height/2; - } - - void render() { - stroke(255); - point(x, y); - } - - // Randomly move according to floating point values - void step() { - float stepx = random(-1, 1); - float stepy = random(-1, 1); - x += stepx; - y += stepy; - x = constrain(x, 0, width-1); - y = constrain(y, 0, height-1); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/RandomWalkTrail.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/RandomWalkTrail.pde deleted file mode 100644 index aaca5448a..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/RandomWalkTrail.pde +++ /dev/null @@ -1,24 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(400,400); - frameRate(30); - - // Create a walker object - w = new Walker(); - -} - -void draw() { - background(255); - // Run the walker object - w.walk(); - w.display(); -} - - - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/Walker.pde deleted file mode 100644 index d0dddfa8b..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTrail/Walker.pde +++ /dev/null @@ -1,49 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker class! - -class Walker { - PVector location; - - ArrayList history; - - - Walker() { - location = new PVector(width/2, height/2); - history = new ArrayList(); - } - - void display() { - stroke(0); - fill(175); - rectMode(CENTER); - rect(location.x, location.y, 16, 16); - - beginShape(); - stroke(0); - noFill(); - for (PVector v: history) { - vertex(v.x, v.y); - } - endShape(); - } - - // Randomly move up, down, left, right, or stay in one place - void walk() { - PVector vel = new PVector(random(-2, 2), random(-2, 2)); - location.add(vel); - - // Stay on the screen - location.x = constrain(location.x, 0, width-1); - location.y = constrain(location.y, 0, height-1); - - - history.add(location.get()); - if (history.size() > 1000) { - history.remove(0); - } - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/RandomWalkTrailCurve.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/RandomWalkTrailCurve.pde deleted file mode 100644 index 763c3db0d..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/RandomWalkTrailCurve.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -Walker w; - -void setup() { - size(400, 300); - // Create a walker object - w = new Walker(); -} - -void draw() { - background(255); - - // Run the walker object - w.step(); - w.render(); -} - diff --git a/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/Walker.pde b/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/Walker.pde deleted file mode 100644 index fc5eba07d..000000000 --- a/java/examples/Books/Nature of Code/introduction/RandomWalkTrailCurve/Walker.pde +++ /dev/null @@ -1,42 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -// A random walker object! - -class Walker { - PVector position; - - ArrayList history = new ArrayList(); - - Walker() { - position = new PVector(width/2, height/2); - } - - void render() { - stroke(0); - beginShape(); - for (PVector v : history) { - curveVertex(v.x, v.y); - } - endShape(); - - noFill(); - stroke(0); - ellipse(position.x, position.y, 16, 16); - } - - // Randomly move up, down, left, right, or stay in one place - void step() { - - position.x += random(-10, 10); - position.y += random(-10, 10); - - - position.x = constrain(position.x, 0, width-1); - position.y = constrain(position.y, 0, height-1); - - history.add(position.get()); - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/SelfAvoidingWalk.pde b/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/SelfAvoidingWalk.pde deleted file mode 100644 index 6e7cbb253..000000000 --- a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/SelfAvoidingWalk.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://www.shiffman.net/ - -Walker w; - -void setup() { - size(600,400); - // Create a walker object - w = new Walker(); - background(255); -} - -void draw() { - // Run the walker object - w.step(); - w.render(); -} - - diff --git a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/Walker.pde b/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/Walker.pde deleted file mode 100644 index b36cdf45b..000000000 --- a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/Walker.pde +++ /dev/null @@ -1,73 +0,0 @@ -// Daniel Shiffman -// The Nature of Code -// http://www.shiffman.net/ - -// A random walker object! - -class Walker { - int x, y; - - boolean[][] grid; - - Walker() { - x = width/2; - y = height/2; - grid = new boolean[width][height]; - } - - void render() { - stroke(0); - line(x,y,x,y); - } - - // Randomly move up, down, left, right, or stay in one place - void step() { - - boolean ok = false; - - int helpme = 0; - - while (!ok) { - - int choice = int(random(4)); - - int saveX = x; - int saveY = y; - - if (choice == 0) { - x++; - } - else if (choice == 1) { - x--; - } - else if (choice == 2) { - y++; - } - else { - y--; - } - - x = constrain(x, 0, width-1); - y = constrain(y, 0, height-1); - - if (grid[x][y] == false) { - ok = true; - grid[x][y] = true; - } - else { - x = saveX; - y = saveY; - } - - - helpme++; - - if (helpme > 1000) { - println("STUCK"); - noLoop(); - ok = true; - } - } - } -} - diff --git a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/goal.svg b/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/goal.svg deleted file mode 100644 index 62563a04d..000000000 --- a/java/examples/Books/Nature of Code/introduction/SelfAvoidingWalk/goal.svg +++ /dev/null @@ -1,2353 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/examples/Books/Nature of Code/introduction/SimpleProbablility/SimpleProbablility.pde b/java/examples/Books/Nature of Code/introduction/SimpleProbablility/SimpleProbablility.pde deleted file mode 100644 index d3d5511be..000000000 --- a/java/examples/Books/Nature of Code/introduction/SimpleProbablility/SimpleProbablility.pde +++ /dev/null @@ -1,34 +0,0 @@ -// The Nature of Code -// Daniel Shiffman -// http://natureofcode.com - -int x,y; - -void setup() { - size(200,200); - background(0); - smooth(); -} - -void draw() { - //create an alpha blended background - fill(0,1); - rect(0,0,width,height); - - //calculate a probability between 0 and 100% based on mouseX location - float prob = (mouseX / (float) width); - - //get a random floating point value between 0 and 1 - float r = random(1); - - //test the random value against the probability and trigger an event - if (r < prob) { - noStroke(); - fill(255); - ellipse(x,y,10,10); - } - - // X and Y walk through a grid - x = (x + 10) % width; - if (x == 0) y = (y + 10) % width; -} diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_01/Ex_01.pde deleted file mode 100755 index 4b29336b7..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_01/Ex_01.pde +++ /dev/null @@ -1,3 +0,0 @@ -// The expression 4 + 5 evaluates to 9, then the -// value 9 is assigned to the variable x -int x = 4 + 5; \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_02/Ex_02.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_02/Ex_02.pde deleted file mode 100755 index 2d9c2fff9..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_02/Ex_02.pde +++ /dev/null @@ -1,4 +0,0 @@ -// The expression 5 * 10 evaluates to 50, then the -// expression 4 + 50 evaluates to 54, then the -// value 54 is then assigned to the variable x -int x = 4 + 5 * 10; \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_03/Ex_03.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_03/Ex_03.pde deleted file mode 100755 index 5adf4599e..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_03/Ex_03.pde +++ /dev/null @@ -1,4 +0,0 @@ -// The expression 4 + 5 evaluates to 9, then the -// expression 9 * 10 evaluates to 90, then the -// value 90 is assigned to the variable x -int x = (4 + 5) * 10; \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_04/Ex_04.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_04/Ex_04.pde deleted file mode 100755 index 8e91ed6a5..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix A/Ex_04/Ex_04.pde +++ /dev/null @@ -1,4 +0,0 @@ -float w = 12.0 - 6.0 + 3.0; // Assigns 9 to w -float x = 3.0 + 6.0 / 12.0; // Assigns 3.5 to x -float y = 12.0 / 6.0 * 3.0; // Assigns 6 to y -float z = 3.0 * 6.0 / 12.0; // Assigns 1.5 to z \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_01/Ex_01.pde deleted file mode 100644 index ca4ac5adb..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_01/Ex_01.pde +++ /dev/null @@ -1,2 +0,0 @@ -float int = 50; // ERROR! Unexpected token: float -line(int, 0, int, 100); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_02/Ex_02.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_02/Ex_02.pde deleted file mode 100644 index 943b6a544..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix B/Ex_02/Ex_02.pde +++ /dev/null @@ -1,2 +0,0 @@ -int line = 50; // This does not create a program error -line(line, 0, line, 100); // but it's very confusing \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix D/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix D/Ex_01/Ex_01.pde deleted file mode 100644 index d9dbe821d..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix D/Ex_01/Ex_01.pde +++ /dev/null @@ -1,4 +0,0 @@ -int a = 205; // In binary: 00000000000000000000000011001101 -int b = 45; // In binary: 00000000000000000000000000101101 -a = a << 24; // Converts to 11001101000000000000000000000000 -b = b << 8; // Converts to 00000000000000000010110100000000 \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_01/Ex_01.pde deleted file mode 100644 index 16482ecfd..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_01/Ex_01.pde +++ /dev/null @@ -1,6 +0,0 @@ -color c = color(204, 153, 102, 255); -float r = (c >> 16) & 0xFF; // Faster version of red(c) -float g = (c >> 8) & 0xFF; // Faster version of green(c) -float b = c & 0xFF; // Faster version of blue(c) -float a = (c >> 24) & 0xFF; // Faster version of alpha(c) -println(r + ", " + g + ", " + b + ", " + a); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_02/Ex_02.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_02/Ex_02.pde deleted file mode 100644 index b708d9097..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_02/Ex_02.pde +++ /dev/null @@ -1,5 +0,0 @@ -int a = 255; -int r = 102; -int g = 51; -int b = 255; -color c = (a << 24) | (r << 16) | (g << 8) | b; \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_03/Ex_03.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_03/Ex_03.pde deleted file mode 100644 index c4d3f97d3..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_03/Ex_03.pde +++ /dev/null @@ -1,5 +0,0 @@ -// AVOID loading an image within draw(), it is slow -void draw() { - PImage img = loadImage("tower.jpg"); - image(img, 0, 0); -} \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_04/Ex_04.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_04/Ex_04.pde deleted file mode 100644 index 14db1cb30..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_04/Ex_04.pde +++ /dev/null @@ -1,5 +0,0 @@ -// AVOID creating an array inside draw(), it is slow -void draw() { - int[] values = new int[200]; - // Do something with the array here -} \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_05/Ex_05.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_05/Ex_05.pde deleted file mode 100644 index 5525bdb18..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_05/Ex_05.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Converts (x,y) coordinates into a position in the pixels[] array -loadPixels(); -for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - pixels[y*height + x] = color(102); - } -} -updatePixels(); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_06/Ex_06.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_06/Ex_06.pde deleted file mode 100644 index a3d95a9de..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_06/Ex_06.pde +++ /dev/null @@ -1,10 +0,0 @@ -// Replaces the multiplication y*height with an addition -int offset = 0; -loadPixels(); -for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - pixels[offset + x] = color(102); - } - offset += width; // Avoids the multiply -} -updatePixels(); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_07/Ex_07.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_07/Ex_07.pde deleted file mode 100644 index bac1a3f05..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_07/Ex_07.pde +++ /dev/null @@ -1,9 +0,0 @@ -// Avoid the calculation y*height+width -int index = 0; -loadPixels(); -for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - pixels[index++] = color(102); - } -} -updatePixels(); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_08/Ex_08.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_08/Ex_08.pde deleted file mode 100644 index 2ef67c770..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_08/Ex_08.pde +++ /dev/null @@ -1,7 +0,0 @@ -// Avoids (x,y) coordinates -int wh = width*height; -loadPixels(); -for (int index = 0; index < wh; index++) { - pixels[index] = color(102); -} -updatePixels(); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_09/Ex_09.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_09/Ex_09.pde deleted file mode 100644 index cd0949c3e..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_09/Ex_09.pde +++ /dev/null @@ -1,8 +0,0 @@ -// Only calculate the color once -int wh = width*height; -color c = color(102); -loadPixels(); -for (int index = 0; index < wh; index++) { - pixels[index] = c; -} -updatePixels(); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_10/Ex_10.pde b/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_10/Ex_10.pde deleted file mode 100644 index 8e22c85cc..000000000 --- a/java/examples/Books/Processing Handbook/Appendices/Appendix E/Ex_10/Ex_10.pde +++ /dev/null @@ -1,17 +0,0 @@ -int res = 16; // Number of data elements -float[] x = new float[res]; // Create x-coordinate array -float[] y = new float[res]; // Create y-coordinate array - -void setup() { - size(100, 100); - for (int i = 0; i < res; i++) { - x[i] = cos(PI/res * i); // Sets x-coordinates - y[i] = sin(PI/res * i); // Sets y-coordinates - } -} - -void draw() { - for (int i = 0; i < res; i++) { // Access each point - point(50 + x[i]*40, 50 + y[i]*40); // Draws point on a curve - } -} \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_01/Ex_01.pde deleted file mode 100755 index 7ecd97454..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_01/Ex_01.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Rotate a rectangle around the y-axis and x-axis -void setup() { - size(400, 400, P3D); - fill(204); -} - -void draw() { - background(0); - translate(width / 2, height / 2, -width); - rotateY(map(mouseX, 0, width, -PI, PI)); - rotateX(map(mouseY, 0, height, -PI, PI)); - noStroke(); - rect(-200, -200, 400, 400); - stroke(255); - line(0, 0, -200, 0, 0, 200); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_02/Ex_02.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_02/Ex_02.pde deleted file mode 100755 index 290b6bc36..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_02/Ex_02.pde +++ /dev/null @@ -1,22 +0,0 @@ -// Draw a sphere on top of a box and moves the coordinates with the mouse -// Press a mouse button to turn on the lights -void setup() { - size(400, 400, P3D); -} - -void draw() { - background(0); - if (mousePressed == true) { // If the mouse is pressed, - lights(); // turn on lights - } - noStroke(); - pushMatrix(); - translate(mouseX, mouseY, -500); - rotateY(PI / 6); // Rotate around y-axis - box(400, 100, 400); // Draw box - pushMatrix(); - popMatrix(); - translate(0, -200, 0); // Position the sphere - sphere(150); // Draw sphere on top of box - popMatrix(); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_03/Ex_03.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_03/Ex_03.pde deleted file mode 100755 index f0b73f079..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_03/Ex_03.pde +++ /dev/null @@ -1,61 +0,0 @@ -// Draw a cylinder centered on the y-axis, going down from y=0 to y=height. -// The radius at the top can be different from the radius at the bottom, -// and the number of sides drawn is variable. - -void setup() { - size(400, 400, P3D); -} - -void draw() { - background(0); - lights(); - translate(width / 2, height / 2); - rotateY(map(mouseX, 0, width, 0, PI)); - rotateZ(map(mouseY, 0, height, 0, -PI)); - noStroke(); - fill(255, 255, 255); - translate(0, -40, 0); - drawCylinder(10, 180, 200, 16); // Draw a mix between a cylinder and a cone -//drawCylinder(70, 70, 120, 64); // Draw a cylinder -//drawCylinder(0, 180, 200, 4); // Draw a pyramid -} - -void drawCylinder(float topRadius, float bottomRadius, float tall, int sides) { - float angle = 0; - float angleIncrement = TWO_PI / sides; - beginShape(QUAD_STRIP); - for (int i = 0; i < sides + 1; ++i) { - vertex(topRadius*cos(angle), 0, topRadius*sin(angle)); - vertex(bottomRadius*cos(angle), tall, bottomRadius*sin(angle)); - angle += angleIncrement; - } - endShape(); - - // If it is not a cone, draw the circular top cap - if (topRadius != 0) { - angle = 0; - beginShape(TRIANGLE_FAN); - - // Center point - vertex(0, 0, 0); - for (int i = 0; i < sides + 1; i++) { - vertex(topRadius * cos(angle), 0, topRadius * sin(angle)); - angle += angleIncrement; - } - endShape(); - } - - // If it is not a cone, draw the circular bottom cap - if (bottomRadius != 0) { - angle = 0; - beginShape(TRIANGLE_FAN); - - // Center point - vertex(0, tall, 0); - for (int i = 0; i < sides + 1; i++) { - vertex(bottomRadius * cos(angle), tall, bottomRadius * sin(angle)); - angle += angleIncrement; - } - endShape(); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_04/Ex_04.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_04/Ex_04.pde deleted file mode 100755 index 870329256..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_04/Ex_04.pde +++ /dev/null @@ -1,41 +0,0 @@ -// Export a DXF file when the R key is pressed -import processing.dxf.*; -boolean record = false; - -void setup() { - size(400, 400, P3D); - noStroke(); - sphereDetail(12); -} - -void draw() { - if (record == true) { - beginRaw(DXF, "output.dxf"); // Start recording to the file - } - lights(); - background(0); - translate(width / 3, height / 3, -200); - rotateZ(map(mouseY, 0, height, 0, PI)); - rotateY(map(mouseX, 0, width, 0, HALF_PI)); - for (int y = -2; y < 2; y++) { - for (int x = -2; x < 2; x++) { - for (int z = -2; z < 2; z++) { - pushMatrix(); - translate(120*x, 120*y, -120*z); - sphere(30); - popMatrix(); - } - } - } - if (record == true) { - endRaw(); - record = false; // Stop recording to the file - } -} - -void keyPressed() { - if (key == 'R' || key == 'r') { // Press R to save the file - record = true; - } -} - diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/Ex_05.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/Ex_05.pde deleted file mode 100755 index 526632607..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/Ex_05.pde +++ /dev/null @@ -1,24 +0,0 @@ -// Import and display an OBJ model -// requires OBJ loader from: http://users.design.ucla.edu/%7Etatsuyas/tools/objloader/index.htm -import saito.objloader.*; -OBJModel model; - -void setup() { - size(400, 400, P3D); - model = new OBJModel(this); - model.load("chair.obj"); // Model must be in the data directory - model.drawMode(POLYGON); - noStroke(); -} - -void draw() { - background(0); - lights(); - pushMatrix(); - translate(width / 2, height, -width); - rotateY(map(mouseX, 0, width, -PI, PI)); - rotateX(PI / 4); - scale(6.0); - model.draw(); - popMatrix(); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/data/chair.obj b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/data/chair.obj deleted file mode 100755 index e5d68177d..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_05/data/chair.obj +++ /dev/null @@ -1,418 +0,0 @@ -# Max2Obj Version 6.0 Jul 29th, 2003 -# -# object Zidle_A_01 to come ... -# -v 25.899904251099 23.408611297607 -0.629936158657 -v 25.836200714111 25.364303588867 -0.263177931309 -v 27.800601959229 25.365760803223 0.069837525487 -v 27.862743377686 23.408617019653 -0.297489136457 -v 18.490375518799 14.684046745300 47.418430328369 -v 18.440059661865 16.955835342407 47.789150238037 -v 20.043802261353 16.503309249878 49.659057617188 -v 20.093072891235 14.531045913696 49.332595825195 -v -16.846343994141 14.688239097595 46.918945312500 -v -16.802133560181 16.952724456787 47.287803649902 -v -18.368827819824 16.504928588867 49.132251739502 -v -18.412220001221 14.528832435608 48.805358886719 -v -25.921289443970 23.417802810669 -0.664852082729 -v -25.860712051392 25.372976303101 -0.295692503452 -v -27.811634063721 25.357145309448 0.108631089330 -v -27.870645523071 23.400211334229 -0.261199921370 -v 25.899911880493 -23.408607482910 -0.629936039448 -v 18.490377426147 -14.684038162231 47.418426513672 -v 18.440063476563 -16.955827713013 47.789150238037 -v 25.836208343506 -25.364299774170 -0.263179510832 -v 20.043806076050 -16.503301620483 49.659053802490 -v 27.800609588623 -25.365755081177 0.069835931063 -v 20.093074798584 -14.531042098999 49.332595825195 -v 27.862751007080 -23.408609390259 -0.297488987446 -v -16.846340179443 -14.688243865967 46.918941497803 -v -16.802129745483 -16.952732086182 47.287799835205 -v -18.368824005127 -16.504932403564 49.132247924805 -v -18.412216186523 -14.528839111328 48.805355072021 -v -25.921281814575 -23.417812347412 -0.664851963520 -v -25.860704421997 -25.372985839844 -0.295694082975 -v -27.811626434326 -25.357158660889 0.108629494905 -v -27.870637893677 -23.400218963623 -0.261199772358 -v -18.623430252075 16.727024078369 47.560352325439 -v -16.677518844604 16.706054687500 47.985088348389 -v -16.678075790405 14.717395782471 47.891605377197 -v -18.623422622681 14.736910820007 47.466884613037 -v -27.272499084473 15.222574234009 84.866127014160 -v -25.269447326660 15.205821037292 85.282051086426 -v -24.996809005737 13.190135955811 84.316917419434 -v -27.163030624390 13.216644287109 83.865890502930 -v -28.435161590576 9.060468673706 90.615600585938 -v -26.399826049805 9.061535835266 91.022407531738 -v -25.888158798218 8.663914680481 88.721542358398 -v -28.023075103760 8.663537025452 88.295997619629 -v -27.277370452881 -14.577423095703 84.897369384766 -v -25.276775360107 -14.559969902039 85.312210083008 -v -24.988948822021 -12.567503929138 84.289779663086 -v -27.159948348999 -12.594882965088 83.838508605957 -v -18.626295089722 -16.608646392822 47.575656890869 -v -16.680219650269 -16.586662292480 48.000041961670 -v -16.675401687622 -14.599632263184 47.876705169678 -v -18.620721817017 -14.620159149170 47.452362060547 -v -28.497978210449 -7.499320507050 90.926193237305 -v -26.461677551270 -7.500489711761 91.333389282227 -v -25.948324203491 -7.194749355316 89.017547607422 -v -28.081348419189 -7.194259643555 88.592170715332 -v -28.929925918579 0.780594170094 93.339157104492 -v -26.910228729248 0.780539214611 93.742111206055 -v -26.363113403320 0.734772324562 91.350273132324 -v -28.515964508057 0.734819710255 90.918952941895 -v 19.686010360718 14.649426460266 47.787284851074 -v -17.228097915649 14.649420738220 47.787284851074 -v 19.686014175415 -14.441827774048 47.787284851074 -v -17.228094100952 -14.441833496094 47.787284851074 -v 19.686010360718 14.649426460266 48.887374877930 -v -17.228097915649 14.649420738220 48.887374877930 -v 19.686014175415 -14.441827774048 48.887374877930 -v -17.228094100952 -14.441833496094 48.887374877930 -v 19.105789184570 14.173642158508 49.527408599854 -v -16.647876739502 14.173636436462 49.527408599854 -v -16.647872924805 -13.966049194336 49.527408599854 -v 19.105792999268 -13.966043472290 49.527408599854 -v 12.830347061157 9.088206291199 49.338916778564 -v -10.372433662415 9.088202476501 49.338916778564 -v -10.372431755066 -8.880614280701 49.338916778564 -v 12.830348968506 -8.880610466003 49.338916778564 -v 22.474662780762 4.952341556549 44.959941864014 -v 22.474662780762 -4.744742870331 44.959941864014 -v 23.136726379395 -4.744740962982 45.838500976563 -v 23.136726379395 4.952343463898 45.838500976563 -v 23.058534622192 -4.586146831512 46.698844909668 -v 23.058536529541 4.793749332428 46.698841094971 -v 16.227718353271 -2.891003131866 49.338916778564 -v 16.227716445923 3.098601818085 49.338916778564 -v -26.214628219604 -13.175243377686 83.052528381348 -v -19.325101852417 -14.434352874756 53.286815643311 -v -26.214639663696 13.382827758789 83.052528381348 -v -19.325113296509 14.641944885254 53.286819458008 -v -25.143526077271 -13.175243377686 83.303398132324 -v -18.253999710083 -14.434352874756 53.537693023682 -v -25.143537521362 13.382827758789 83.303405761719 -v -18.254011154175 14.641945838928 53.537693023682 -v -24.388038635254 -12.740889549255 82.884429931641 -v -17.763151168823 -13.958812713623 54.248584747314 -v -17.763162612915 14.166405677795 54.248584747314 -v -24.388048171997 12.948475837708 82.884429931641 -v -22.705802917480 -8.098277091980 76.833168029785 -v -18.943153381348 -8.875991821289 60.417484283447 -v -18.943161010742 9.083584785461 60.417484283447 -v -22.705812454224 8.305867195129 76.833168029785 -v -26.989404678345 -4.322551250458 86.360374450684 -v -26.989406585693 4.530138492584 86.360374450684 -v -25.918304443359 4.530136585236 86.611251831055 -v -25.918302536011 -4.322553157806 86.611244201660 -v -25.162815093994 4.385353565216 86.192276000977 -v -25.162813186646 -4.177768230438 86.192276000977 -v -23.480581283569 2.837816715240 80.141014099121 -v -23.480579376221 -2.630231380463 80.141014099121 -v -19.325109481812 4.949844360352 53.286819458008 -v -19.325107574463 -4.742256164551 53.286819458008 -v -18.254005432129 -4.742254257202 53.537693023682 -v -18.254007339478 4.949846267700 53.537693023682 -v -17.763156890869 -4.583739757538 54.248584747314 -v -17.763158798218 4.791332721710 54.248584747314 -v -18.943157196045 -2.889466762543 60.417484283447 -v -18.943159103394 3.097059726715 60.417484283447 -# 116 vertices - -vt -24.983833312988 -26.063531875610 -0.694362461567 -vt -24.938697814941 -25.800083160400 0.694362521172 -vt -26.332603454590 -25.561277389526 0.694362461567 -vt -26.377738952637 -25.824726104736 -0.694362521172 -vt -17.487480163574 21.850849151611 -9.238789558411 -vt -17.448310852051 22.079463958740 -7.843263626099 -vt -18.641181945801 23.491695404053 -8.072401046753 -vt -18.680351257324 23.263076782227 -9.467928886414 -vt 18.140369415283 21.356575012207 -9.239566802979 -vt 18.105138778687 21.584888458252 -7.843820571899 -vt 19.258998870850 22.964744567871 -8.071624755859 -vt 19.294229507446 22.736431121826 -9.467370033264 -vt 27.285417556763 -26.089975357056 -0.687983930111 -vt 27.242393493652 -25.824773788452 0.700474679470 -vt 28.626508712769 -25.534833908081 0.687984049320 -vt 28.669532775879 -25.800035476685 -0.700474560261 -vt -24.983833312988 -26.063533782959 -47.974983215332 -vt -17.487480163574 21.850845336914 -39.430557250977 -vt -17.448310852051 22.079463958740 -40.826084136963 -vt -24.938697814941 -25.800086975098 -49.363708496094 -vt -18.641181945801 23.491691589355 -40.596946716309 -vt -26.332603454590 -25.561281204224 -49.363708496094 -vt -18.680351257324 23.263076782227 -39.201419830322 -vt -26.377738952637 -25.824728012085 -47.974983215332 -vt 18.140369415283 21.356571197510 -39.429779052734 -vt 18.105138778687 21.584884643555 -40.825527191162 -vt 19.258998870850 22.964740753174 -40.597721099854 -vt 19.294229507446 22.736427307129 -39.201976776123 -vt 27.285417556763 -26.089977264404 -47.981361389160 -vt 27.242393493652 -25.824777603149 -49.369819641113 -vt 28.626508712769 -25.534837722778 -49.357330322266 -vt 28.669532775879 -25.800037384033 -47.968868255615 -vt 19.550821304321 22.079088211060 -7.911951065063 -vt 18.168672561646 22.378185272217 -7.926216125488 -vt 18.168672561646 22.310815811157 -9.338824272156 -vt 19.550821304321 22.011718750000 -9.324559211731 -vt 28.077938079834 58.962402343750 -9.466709136963 -vt 26.692619323730 59.246894836426 -9.480277061462 -vt 26.553951263428 58.540180206299 -10.862394332886 -vt 27.939270019531 58.255687713623 -10.848826408386 -vt 29.193300247192 64.552856445313 -15.466491699219 -vt 27.806550979614 64.830207824707 -15.467369079590 -vt 27.461914062500 63.104469299316 -15.501105308533 -vt 28.848716735840 62.827384948730 -15.500129699707 -vt 28.081987380981 58.982704162598 -38.561283111572 -vt 26.696582794189 59.266757965088 -38.547275543213 -vt 26.549911499023 58.519870758057 -37.177703857422 -vt 27.935316085815 58.235816955566 -37.191711425781 -vt 19.552829742432 22.089979171753 -40.634887695313 -vt 18.170631408691 22.388816833496 -40.619941711426 -vt 18.166673660278 22.299924850464 -39.208530426025 -vt 19.548871994019 22.001087188721 -39.223476409912 -vt 29.254201889038 64.856658935547 -31.654993057251 -vt 27.867467880249 65.134078979492 -31.654163360596 -vt 27.522718429565 63.408370971680 -31.687810897827 -vt 28.909502029419 63.131198883057 -31.688722610474 -vt 29.685031890869 67.214920043945 -23.560743331909 -vt 28.298290252686 67.492309570313 -23.560766220093 -vt 27.953598022461 65.766586303711 -23.594459533691 -vt 29.340389251709 65.489463806152 -23.594427108765 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 0.333333343267 0.000000000000 -vt 1.000000000000 0.666666686535 0.000000000000 -vt 0.666666626930 0.000000000000 0.000000000000 -vt 0.333333313465 0.000000000000 0.000000000000 -vt 0.333333343267 1.000000000000 0.000000000000 -vt 0.666666686535 1.000000000000 0.000000000000 -vt 0.000000000000 0.666666626930 0.000000000000 -vt 0.000000000000 0.333333313465 0.000000000000 -vt 0.000000000000 0.666666626930 0.000000000000 -vt 0.000000000000 0.333333313465 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 0.000000000000 0.000000000000 -vt 1.000000000000 1.000000000000 0.000000000000 -vt 0.000000000000 1.000000000000 0.000000000000 -vt 1.000000000000 0.333333343267 0.000000000000 -vt 1.000000000000 0.666666686535 0.000000000000 -vt 0.666666626930 0.000000000000 0.000000000000 -vt 0.333333313465 0.000000000000 0.000000000000 -vt 0.333333343267 1.000000000000 0.000000000000 -vt 0.666666686535 1.000000000000 0.000000000000 -vt 0.000000000000 0.666666626930 0.000000000000 -vt 0.000000000000 0.333333313465 0.000000000000 -vt 0.000000000000 0.666666626930 0.000000000000 -vt 0.000000000000 0.333333313465 0.000000000000 -vt 0.000000000000 0.666666626930 0.000000000000 -vt 0.000000000000 0.333333313465 0.000000000000 -vt 0.666666626930 0.000000000000 0.000000000000 -vt 0.333333313465 0.000000000000 0.000000000000 -vt 0.333333343267 1.000000000000 0.000000000000 -vt 0.666666686535 1.000000000000 0.000000000000 -vt 1.000000000000 0.333333343267 0.000000000000 -vt 1.000000000000 0.666666686535 0.000000000000 -vt 1.000000000000 0.333333343267 0.000000000000 -vt 1.000000000000 0.666666686535 0.000000000000 -# 146 texture vertices - -g Zidle_A_01 -s 1 -f 1/1 5/5 6/6 2/2 -f 2/2 6/6 7/7 3/3 -f 3/3 7/7 8/8 4/4 -f 4/4 8/8 5/5 1/1 -f 5/5 9/9 10/10 6/6 -f 6/6 10/10 11/11 7/7 -f 7/7 11/11 12/12 8/8 -f 8/8 12/12 9/9 5/5 -f 9/9 13/13 14/14 10/10 -f 10/10 14/14 15/15 11/11 -f 11/11 15/15 16/16 12/12 -f 12/12 16/16 13/13 9/9 -f 1/1 2/2 3/3 4/4 -f 17/17 20/20 19/19 18/18 -f 20/20 22/22 21/21 19/19 -f 22/22 24/24 23/23 21/21 -f 24/24 17/17 18/18 23/23 -f 18/18 19/19 26/26 25/25 -f 19/19 21/21 27/27 26/26 -f 21/21 23/23 28/28 27/27 -f 23/23 18/18 25/25 28/28 -f 25/25 26/26 30/30 29/29 -f 26/26 27/27 31/31 30/30 -f 27/27 28/28 32/32 31/31 -f 28/28 25/25 29/29 32/32 -f 17/17 24/24 22/22 20/20 -f 33/33 37/37 38/38 34/34 -f 34/34 38/38 39/39 35/35 -f 35/35 39/39 40/40 36/36 -f 36/36 40/40 37/37 33/33 -f 37/37 41/41 42/42 38/38 -f 38/38 42/42 43/43 39/39 -f 39/39 43/43 44/44 40/40 -f 40/40 44/44 41/41 37/37 -f 53/53 45/45 46/46 54/54 -f 54/54 46/46 47/47 55/55 -f 55/55 47/47 48/48 56/56 -f 56/56 48/48 45/45 53/53 -f 45/45 49/49 50/50 46/46 -f 46/46 50/50 51/51 47/47 -f 47/47 51/51 52/52 48/48 -f 48/48 52/52 49/49 45/45 -f 33/33 34/34 35/35 36/36 -f 42/42 41/41 57/57 58/58 -f 43/43 42/42 58/58 59/59 -f 44/44 43/43 59/59 60/60 -f 41/41 44/44 60/60 57/57 -f 58/58 57/57 53/53 54/54 -f 59/59 58/58 54/54 55/55 -f 60/60 59/59 55/55 56/56 -f 57/57 60/60 56/56 53/53 -s 0 -f 64/64 77/89 78/90 63/63 -f 64/64 62/62 61/61 77/89 -s 1 -f 75/87 84/98 73/85 74/86 -f 83/97 84/98 75/87 76/88 -s 2 -f 66/68 65/67 61/65 62/66 -s 4 -f 68/72 66/71 62/69 64/70 -s 2 -f 67/76 68/75 64/73 63/74 -s 4 -f 79/93 78/92 77/91 80/94 -s 2 -f 70/82 69/81 65/67 66/68 -s 4 -f 71/83 70/82 66/71 68/72 -s 2 -f 72/84 71/83 68/75 67/76 -s 5 -f 81/95 79/93 80/94 82/96 -s 3 -f 74/86 73/85 69/81 70/82 -s 5 -f 75/87 74/86 70/82 71/83 -s 3 -f 76/88 75/87 71/83 72/84 -s 1 -f 83/97 81/95 82/96 84/98 -s 4 -f 80/94 77/91 61/78 65/80 -f 78/92 79/93 67/79 63/77 -f 69/81 82/96 80/94 65/80 -f 79/93 81/95 72/84 67/79 -s 5 -f 73/85 84/98 82/96 69/81 -f 81/95 83/97 76/88 72/84 -s 2 -f 110/138 86/100 85/99 101/127 -s 1 -f 115/145 116/146 97/123 98/124 -f 99/125 108/136 97/123 116/146 -f 107/135 108/136 99/125 100/126 -s 4 -f 90/106 89/105 85/103 86/104 -s 8 -f 111/141 110/140 109/139 112/142 -s 4 -f 91/114 92/113 88/111 87/112 -f 103/131 102/130 101/129 104/132 -f 94/120 93/119 89/105 90/106 -s 9 -f 113/143 111/141 112/142 114/144 -s 4 -f 96/122 95/121 92/113 91/114 -s 5 -f 105/133 103/131 104/132 106/134 -f 98/124 97/123 93/119 94/120 -s 1 -f 115/145 113/143 114/144 116/146 -s 5 -f 100/126 99/125 95/121 96/122 -s 1 -f 107/135 105/133 106/134 108/136 -s 4 -f 104/132 101/129 85/116 89/118 -f 102/130 103/131 91/117 87/115 -s 5 -f 93/119 106/134 104/132 89/118 -f 103/131 105/133 96/122 91/117 -s 1 -f 97/123 108/136 106/134 93/119 -f 105/133 107/135 100/126 96/122 -s 8 -f 112/142 109/139 88/108 92/110 -f 110/140 111/141 90/109 86/107 -f 95/121 114/144 112/142 92/110 -f 111/141 113/143 94/120 90/109 -s 9 -f 99/125 116/146 114/144 95/121 -f 113/143 115/145 98/124 94/120 -s 2 -f 109/137 102/128 87/101 88/102 -f 110/138 101/127 102/128 109/137 -s 1 -f 15/15 14/14 13/13 -f 16/16 15/15 13/13 -f 31/31 29/29 30/30 -f 32/32 29/29 31/31 -f 51/51 50/50 49/49 -f 52/52 51/51 49/49 -# 109 faces - -g diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_06/Ex_06.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_06/Ex_06.pde deleted file mode 100755 index 23ca4b7fa..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_06/Ex_06.pde +++ /dev/null @@ -1,20 +0,0 @@ -// The camera lifts up while looking at the same point -void setup() { - size(400, 400, P3D); - fill(204); -} - -void draw() { - lights(); - background(0); - // Change height of the camera with mouseY - camera(30.0, mouseY, 220.0, // eyeX, eyeY, eyeZ - 0.0, 0.0, 0.0, // centerX, centerY, centerZ - 0.0, 1.0, 0.0); // upX, upY, upZ - noStroke(); - box(90); - stroke(255); - line(-100, 0, 0, 100, 0, 0); - line(0, -100, 0, 0, 100, 0); - line(0, 0, -100, 0, 0, 100); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_07/Ex_07.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_07/Ex_07.pde deleted file mode 100755 index a0dc5c7ca..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_07/Ex_07.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Vary the specular reflection component of a material -// with vertical position of the mouse -void setup() { - size(400, 400, P3D); - noStroke(); - colorMode(RGB, 1); - fill(0.4); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - // Set the specular color of lights that follow - lightSpecular(1, 1, 1); - directionalLight(0.8, 0.8, 0.8, 0, 0, -1); - float s = mouseX / float(width); - specular(s, s, s); - sphere(100); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_08/Ex_08.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_08/Ex_08.pde deleted file mode 100755 index a9125aba5..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_08/Ex_08.pde +++ /dev/null @@ -1,27 +0,0 @@ -// Draw a box with three different kinds of lights -void setup() { - size(400, 400, P3D); - noStroke(); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - // Orange point light on the right - pointLight(150, 100, 0, // Color - 200, -150, 0); // Position - - // Blue directional light from the left - directionalLight(0, 102, 255, // Color - 1, 0, 0); // The x-, y-, z-axis direction - - // Yellow spotlight from the front - spotLight(255, 255, 109, // Color - 0, 40, 200, // Position - 0, -0.5, -0.5, // Direction - PI / 2, 2); // Angle, concentration - - rotateY(map(mouseX, 0, width, 0, PI)); - rotateX(map(mouseY, 0, height, 0, PI)); - box(200); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_09/Ex_09.pde b/java/examples/Books/Processing Handbook/Extensions/3D/Ex_09/Ex_09.pde deleted file mode 100755 index 49a3f3f5d..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/3D/Ex_09/Ex_09.pde +++ /dev/null @@ -1,40 +0,0 @@ -// Load an image and draw it onto a cylinder and a quad -int tubeRes = 32; -float[] tubeX = new float[tubeRes]; -float[] tubeY = new float[tubeRes]; -PImage img; - -void setup() { - size(400, 400, P3D); - img = loadImage("berlin-1.jpg"); - float angle = 270.0 / tubeRes; - for (int i = 0; i < tubeRes; i++) { - tubeX[i] = cos(radians(i * angle)); - tubeY[i] = sin(radians(i * angle)); - } - noStroke(); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - rotateX(map(mouseY, 0, height, -PI, PI)); - rotateY(map(mouseX, 0, width, -PI, PI)); - beginShape(QUAD_STRIP); - texture(img); - for (int i = 0; i < tubeRes; i++) { - float x = tubeX[i] * 100; - float z = tubeY[i] * 100; - float u = img.width / tubeRes * i; - vertex(x, -100, z, u, 0); - vertex(x, 100, z, u, img.height); - } - endShape(); - beginShape(QUADS); - texture(img); - vertex(0, -100, 0, 0, 0); - vertex(100, -100, 0, 100, 0); - vertex(100, 100, 0, 100, 100); - vertex(0, 100, 0, 0, 100); - endShape(); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01A/Ex_01A.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01A/Ex_01A.pde deleted file mode 100755 index d7a6b1af7..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01A/Ex_01A.pde +++ /dev/null @@ -1,16 +0,0 @@ -// Code for sensing a switch status and writing the value to the serial port -int switchPin = 0; // Switch connected to pin 0 - -void setup() { - pinMode(switchPin, INPUT); // Set pin 0 as an input - Serial.begin(9600); // Start serial communication at 9600 bps -} - -void loop() { - if (digitalRead(switchPin) == HIGH) { // If switch is ON, - Serial.print(1, BYTE); // send 1 to Processing - } else { // If the switch is not ON, - Serial.print(0, BYTE); // send 0 to Processing - } - delay(100); // Wait 100 milliseconds -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01B/Ex_01B.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01B/Ex_01B.pde deleted file mode 100755 index b6284fa05..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_01B/Ex_01B.pde +++ /dev/null @@ -1,25 +0,0 @@ -// Read data from the serial port and change the color of a rectangle -// when a switch connected to the board is pressed and released -import processing.serial.*; -Serial port; // Create object from Serial class -int val; // Data received from the serial port - -void setup() { - size(200, 200); - frameRate(10); -// Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); -} - -void draw() { - if (0 < port.available()) { // If data is available, - val = port.read(); // read it and store it in val - } - background(255); // Set background to white - if (val == 0) { // If the serial value is 0, - fill(0); // set fill to black - } else { // If the serial value is not 0, - fill(204); // set fill to light gray - } - rect(50, 50, 100, 100); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02A/Ex_02A.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02A/Ex_02A.pde deleted file mode 100755 index 586b5804d..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02A/Ex_02A.pde +++ /dev/null @@ -1,13 +0,0 @@ -// Code to read an analog value and write it to the serial port -int val; -int inputPin = 0; // Set the input to analog in pin 0 - -void setup() { - Serial.begin(9600); // Start serial communication at 9600 bps -} - -void loop() { - val = analogRead(inputPin) / 4; // Read analog input pin, put in range 0 to 255 - Serial.print(val, BYTE); // Send the value - delay(100); // Wait 100ms for next reading -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02B/Ex_02B.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02B/Ex_02B.pde deleted file mode 100755 index 463173016..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_02B/Ex_02B.pde +++ /dev/null @@ -1,23 +0,0 @@ -// Read data from the serial port and assign it to a variable. Set the fill a -// rectangle on the screen using the value read from a light sensor connected -// to the Wiring or Arduino board -import processing.serial.*; -Serial port; // Create object from Serial class -int val; // Data received from the serial port - -void setup() { - size(200, 200); - noStroke(); - frameRate(10); // Run 10 frames per second -// Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); -} - -void draw() { - if (0 < port.available()) { // If data is available to read, - val = port.read(); // read it and store it in val - } - background(204); // Clear background - fill(val); // Set fill color with the value read - rect(50, 50, 100, 100); // Draw square -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03A/Ex_03A.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03A/Ex_03A.pde deleted file mode 100755 index af0a68de7..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03A/Ex_03A.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Read data from the serial and turn ON or OFF a light depending on the value -char val; // Data received from the serial port -int ledPin = 0; // Set the pin to digital I/O 0 - -void setup() { - pinMode(ledPin, OUTPUT); // Set pin as OUTPUT - Serial.begin(9600); // Start serial communication at 9600 bps -} - -void loop() { - if (Serial.available()) { // If data is available to read, - val = Serial.read(); // read it and store it in val - } - if (val == 'H') { // If H was received - digitalWrite(ledPin, HIGH); // turn the LED on - } else { - digitalWrite(ledPin, LOW); // Otherwise turn it OFF - } - delay(100); // Wait 100 milliseconds for next reading -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03B/Ex_03B.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03B/Ex_03B.pde deleted file mode 100755 index 2241f664f..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_03B/Ex_03B.pde +++ /dev/null @@ -1,28 +0,0 @@ -// Check if the mouse is over a rectangle and writes the status to the serial port -import processing.serial.*; - -Serial port; // Create object from Serial class - -void setup() { - size(200, 200); - noStroke(); - frameRate(10); -// Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); -} - -void draw() { - background(255); - if (mouseOverRect() == true) { // If mouse is over square, - fill(204); // change color and - port.write('H'); // send an H to indicate mouse is over square - } else { // If mouse is not over square, - fill(0); // change color and - port.write('L'); // send an L otherwise - } - rect(50, 50, 100, 100); // Draw a square -} - -boolean mouseOverRect() { // Test if mouse is over square - return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150)); -} \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04A/Ex_04A.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04A/Ex_04A.pde deleted file mode 100755 index d5203ea31..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04A/Ex_04A.pde +++ /dev/null @@ -1,19 +0,0 @@ -// Read data from the serial port and set the position of a servomotor -// according to the value -Servo myservo; // Create servo object to control a servo - -int servoPin = 0; // Connect yellow servo wire to digital I/O pin 0 -int val = 0; // Data received from the serial port - -void setup() { - myservo.attach(servoPin); // Attach the servo to the PWM pin - Serial.begin(9600); // Start serial communication at 9600 bps -} - -void loop() { - if (Serial.available()) { // If data is available to read, - val = Serial.read(); // read it and store it in val - } - myservo.write(val); // Set the servo position - delay(15); // Wait for the servo to get there -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04B/Ex_04B.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04B/Ex_04B.pde deleted file mode 100755 index 3382f1fa2..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_04B/Ex_04B.pde +++ /dev/null @@ -1,32 +0,0 @@ -// Write data to the serial port according to the mouseX value -import processing.serial.*; - -Serial port; // Create object from Serial class -float mx = 0.0; - -void setup() { - size(200, 200); - noStroke(); - frameRate(10); -// Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); -} - -void draw() { - background(0); // Clear background - fill(204); // Set fill color - rect(40, height / 2 - 15, 120, 25); // Draw square - float dif = mouseX - mx; - if (abs(dif) > 1.0) { - mx += dif / 4.0; - } - mx = constrain(mx, 50, 149); // Keeps marker on the screen - noStroke(); - fill(255); - rect(50, (height / 2) - 5, 100, 5); - fill(204, 102, 0); - rect(mx - 2, height / 2 - 5, 4, 5); // Draw the position marker - int angle = int(map(mx, 50, 149, 0, 180)); // Scale the value the range 0-180 -//print(angle + " "); // Print the current angle (debug) - port.write(angle); // Write the angle to the serial port -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05A/Ex_05A.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05A/Ex_05A.pde deleted file mode 100755 index 85fe0be50..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05A/Ex_05A.pde +++ /dev/null @@ -1,20 +0,0 @@ -// Read data from the serial and turns a DC motor on or off according to the value -char val; // Data received from the serial port -int motorpin = 0; // Wiring: Connect L293D Pin En1 connected to Pin PWM 0 -// int motorpin = 9; // Arduino: Connect L293D Pin En1 to Pin PWM 9 - -void setup() { - Serial.begin(9600); // Start serial communication at 9600 bps -} - -void loop() { - if (Serial.available()) { // If data is available, - val = Serial.read(); // read it and store it in val - } - if (val == 'H') { // If 'H' was received, - analogWrite(motorpin, 125); // turn the motor on at medium speed - } else { // If 'H' was not received - analogWrite(motorpin, 0); // turn the motor off - } - delay(100); // Wait 100 milliseconds for next reading -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05B/Ex_05B.pde b/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05B/Ex_05B.pde deleted file mode 100755 index dae509627..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Electronics/Ex_05B/Ex_05B.pde +++ /dev/null @@ -1,56 +0,0 @@ -// Write data to the serial port according to the status of a button controlled -// by the mouse -import processing.serial.*; -Serial port; // Create serial port object -boolean rectOver = false; -int rectX, rectY; // Position of square button -int rectSize = 100; // Diameter of rect -color rectColor; -boolean buttonOn = false; // Status of the button - -void setup() { - size(200, 200); - noStroke(); - frameRate(10); - rectColor = color(100); - rectX = width / 2 - rectSize / 2; - rectY = height / 2 - rectSize / 2; -// Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); -} - -void draw() { - update(mouseX, mouseY); - background(0); // Clear background to black - fill(rectColor); - rect(rectX, rectY, rectSize, rectSize); -} -void update(int x, int y) { - if (overRect(rectX, rectY, rectSize, rectSize) == true) { - rectOver = true; - } else { - rectOver = false; - } -} - -void mouseReleased() { - if (rectOver == true) { - if (buttonOn == true) { - rectColor = color(100); - buttonOn = false; - port.write('L'); // Send an L to indicate button is OFF - } else { - rectColor = color(180); - buttonOn = true; - port.write('H'); // Send an H to indicate button is ON - } - } -} -boolean overRect(int x, int y, int width, int height) { - if ((mouseX >= x) && (mouseX <= x + width) && - (mouseY >= y) && (mouseY <= y + height)) { - return true; - } else { - return false; - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_01/Ex_01.pde deleted file mode 100755 index 160fa2647..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_01/Ex_01.pde +++ /dev/null @@ -1,10 +0,0 @@ -// The image file, named sprite.png in this example, must be located in the -// sketch data folder. From the Sketch menu, choose "Add File" to copy files into -// the sketch data folder. -PImage img = loadImage("sprite.png"); -// The coordinates (0, 0) refer to the top-left corder of the screen -image(img, 0, 0); -// The following coordinate calculations will center the image in the screen -image(img, (width - img.width) / 2, (height - img.height) / 2); -// Finally, the next line will position the image in the bottom-right corner -image(img, width - img.width, height - img.height); \ No newline at end of file diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_02/Ex_02.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_02/Ex_02.pde deleted file mode 100755 index c54213f18..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_02/Ex_02.pde +++ /dev/null @@ -1,21 +0,0 @@ -String s; -PFont font; -void setup() { - font = loadFont(); // Load and set the default font for drawing text - textFont(font); - softkey("Input"); // Create a softkey called Input - s = "No input"; // Initialize s with an initial message -} -void draw() { - background(200); - text(s, 0, height / 2); // Draw the String s in the middle of the screen -} - -void softkeyPressed(String label) { -// Check the value of the softkey label to determine the action to take - if (label.equals("Input")) { -// If the Input softkey is pressed, open a textInput window for the user -// to type text. It will be drawn on the screen by the draw() method - s = textInput(); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_03/Ex_03.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_03/Ex_03.pde deleted file mode 100755 index 3753a6162..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_03/Ex_03.pde +++ /dev/null @@ -1,18 +0,0 @@ -PFont font; - -void setup() { - font = loadFont(); - textFont(font); - softkey("Delete"); // Use softkey to to delete characters from the multitap buffer - multitap(); // Turn on multitap key input -} - -void draw() { - background(200); - text(multitapText, 0, height / 2); // Draw the text captured with multitap -} -void softkeyPressed(String label) { - if (label.equals("Delete")) { - multitapDeleteChar(); // Delete a character - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_04/Ex_04.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_04/Ex_04.pde deleted file mode 100755 index aef2e609e..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_04/Ex_04.pde +++ /dev/null @@ -1,80 +0,0 @@ -// The PClient object is used to initiate requests to the server -PClient c; -// The PRequest object represents an active request from which we receive -// status information and data from the server -PRequest request; -int counter; -PFont font; -PImage img; -String version; -String error; - -void setup() { - font = loadFont(); // Load and set the default font for drawing text - textFont(font); - fill(0); -// Create a new network connection to connect to the Mobile Processing website - c = new PClient(this, "mobile.processing.org"); -// Start by fetching the logo for Mobile Processing the filename is a relative path -// specified in the same way as a URL in a webpage - request = c.GET("/images/mobile.png"); -// Use the counter to keep track of what we're fetching - counter = 0; -} - -void draw() { - background(255); - int y = 0; - if (error != null) { -// A network error has occured, so display the message - y += font.baseline; - text(error, 0, y); - } else if (img == null) { -// The img is not yet fetched, so draw a status message - y += font.baseline; - text("Fetching image...", 0, y); - } else { -// Draw the image - image(img, (width - img.width) / 2, y); - y += img.height + font.baseline; - if (version == null) { -// The version text is not yet fetched, so draw a status message - text("Checking version...", 0, y); - } else { -// Draw the version as reported by the website - text("Latest version: " + version, 0, y); - } - } -} -// The libraryEvent() will be called when a library, in this case the Net -// library, has an event to report back to the program -void libraryEvent(Object library, int event, Object data) { -// Make sure we handle the event from the right library - if (library == request) { - if (event == PRequest.EVENT_CONNECTED) { -// This event occurs when the connection is complete, so we can start -// reading the data. The readBytes() method will read all the data returned -// by the server and send another event when completed. - request.readBytes(); - } else if (event == PRequest.EVENT_DONE) { -// Reading is complete! Check the counter to see what we're transferring, -// then process the data. The data object in this case is an array of bytes. - byte[] bytes = (byte[]) data; - if (counter == 0) { -// This is the logo, so create an image from the bytes - img = new PImage(bytes); -// Now that we have the logo image, fetch the latest version text for -// Mobile Processing. We use the client object to initiate a new request - request = c.GET("/download/latest.txt"); -// Set the counter to 1 to represent the tex - counter = 1; - } else if (counter == 1) { -// This is the version text, so create a string from the bytes - version = new String(bytes); - } - } else if (event == PRequest.EVENT_ERROR) { -// The data object in this case is an error message - error = (String) data; - } - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_05/Ex_05.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_05/Ex_05.pde deleted file mode 100755 index a0c20636c..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_05/Ex_05.pde +++ /dev/null @@ -1,14 +0,0 @@ -import processing.sound.*; -// Notes range from 0 to 127 as in the MIDI specification -int[] notes = { 60, 62, 64, 65, 67, 69, 71, 72, 74 }; - -void setup() { - noLoop(); // No drawing in this sketch, so we don't need to run the draw() loop -} - -void keyPressed() { - if ((key >= '1') && (key <= '9')) { -// Use the key as an index into the array of notes - Sound.playTone(notes[key - '1'], 500, 80); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_06/Ex_06.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_06/Ex_06.pde deleted file mode 100755 index 6054f8b1c..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_06/Ex_06.pde +++ /dev/null @@ -1,18 +0,0 @@ -import processing.sound.*; -Sound s; - -void setup() { -// The file, soundtrack.mid, must be copied into the data folder of this sketch - s = new Sound("soundtrack.mid"); - softkey("Play"); - noLoop(); -} -void softkeyPressed(String label) { - if (label.equals("Play")) { - s.play(); - softkey("Pause"); // Change the label of the softkey to Pause - } else if (label.equals("Pause")) { - s.pause(); - softkey("Play"); // Change the label of the softkey back to Play - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_07/Ex_07.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_07/Ex_07.pde deleted file mode 100755 index 43dcc79eb..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_07/Ex_07.pde +++ /dev/null @@ -1,18 +0,0 @@ -import processing.sound.*; -PFont font = loadFont(); -textFont(font); -background(255); -fill(0); - -// Get a list of the supported types of media on the phone -String[] types = Sound.supportedTypes(); -// Start at the top of the screen -int y = font.baseline; -// Draw each of the supported types on the screen -for (int i = 0, length = types.length; i < length; i++) { -// Draw the supported type (represented as an -// Internet MIME type string, such as audio/x-wav) - text(types[i], 0, y); -// Go to the next line - y += font.height; -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_08/Ex_08.pde b/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_08/Ex_08.pde deleted file mode 100755 index 71a8cb2a3..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Mobile/Ex_08/Ex_08.pde +++ /dev/null @@ -1,30 +0,0 @@ -import processing.phone.*; -Phone p; - -void setup() { - p = new Phone(this); - noLoop(); // No drawing in this sketch, so we don't need to run the draw() loop -} - -void keyPressed() { - switch (key) { - case '1': - // Vibrate the phone for 200 milliseconds - p.vibrate(200); - break; - - case '2': - // Flash the backlight for 200 milliseconds - p.flash(200); - break; - - case '3': - // Dial 411 on the phone - p.call("411"); - break; - case '4': - // Launch the Web browser - p.launch("http://mobile.processing.org/"); - break; - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_01/Ex_01.pde b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_01/Ex_01.pde deleted file mode 100755 index b95744578..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_01/Ex_01.pde +++ /dev/null @@ -1,21 +0,0 @@ -// A simple Web client using HTTP -import processing.net.*; - -Client c; -String data; - -void setup() { - size(200, 200); - background(50); - fill(200); - c = new Client(this, "www.processing.org", 80); // Connect to server on port 80 - c.write("GET / HTTP/1.0\n"); // Use the HTTP "GET" command to ask for a Web page - c.write("Host: my_domain_name.com\n\n"); // Be polite and say who we are -} - -void draw() { - if (c.available() > 0) { // If there's incoming data from the client... - data += c.readString(); // ...then grab it and print it - println(data); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02A/Ex_02A.pde b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02A/Ex_02A.pde deleted file mode 100755 index 688f76f34..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02A/Ex_02A.pde +++ /dev/null @@ -1,34 +0,0 @@ -import processing.net.*; - -Server s; -Client c; -String input; -int data[]; - -void setup() { - size(450, 255); - background(204); - stroke(0); - frameRate(5); // Slow it down a little - s = new Server(this, 12345); // Start a simple server on a port -} - -void draw() { - if (mousePressed == true) { -// Draw our line - stroke(255); - line(pmouseX, pmouseY, mouseX, mouseY); -// Send mouse coords to other person - s.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n"); - } -// Receive data from client - c = s.available(); - if (c != null) { - input = c.readString(); - input = input.substring(0, input.indexOf("\n")); // Only up to the newline - data = int(split(input, ' ')); // Split values into an array -// Draw line using received coords - stroke(0); - line(data[0], data[1], data[2], data[3]); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02B/Ex_02B.pde b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02B/Ex_02B.pde deleted file mode 100755 index e15c2ed5c..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_02B/Ex_02B.pde +++ /dev/null @@ -1,33 +0,0 @@ -import processing.net.*; - -Client c; -String input; -int data[]; - -void setup() { - size(450, 255); - background(204); - stroke(0); - frameRate(5); // Slow it down a little -// Connect to the server’s IP address and port - c = new Client(this, "127.0.0.1", 12345); // Replace with your server’s IP and port -} - -void draw() { - if (mousePressed == true) { -// Draw our line - stroke(255); - line(pmouseX, pmouseY, mouseX, mouseY); -// Send mouse coords to other person - c.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n"); - } -// Receive data from server - if (c.available() > 0) { - input = c.readString(); - input = input.substring(0, input.indexOf("\n")); // Only up to the newline - data = int(split(input, ' ')); // Split values into an array -// Draw line using received coords - stroke(0); - line(data[0], data[1], data[2], data[3]); - } -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_03/Ex_03.pde b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_03/Ex_03.pde deleted file mode 100755 index caedf07ae..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_03/Ex_03.pde +++ /dev/null @@ -1,40 +0,0 @@ -// Download the Yahoo! Search SDK from http://developer.yahoo.com/download -// Inside the download, find the yahoo_search-2.X.X.jar file somewhere inside -// the "Java" subdirectory. Drag the jar file to your sketch and it will be -// added to your 'code' folder for use. -// This example is based on the based on yahoo api example -// Replace this with a developer key from http://developer.yahoo.com -String appid = "YOUR_DEVELOPER_KEY_HERE"; -SearchClient client = new SearchClient(appid); -String query = "processing.org"; -WebSearchRequest request = new WebSearchRequest(query); - -// (Optional) Set the maximum number of results to download -//request.setResults(30); - -try { - WebSearchResults results = client.webSearch(request); - // Print out how many hits were found - println("Displaying " + results.getTotalResultsReturned() + - " out of " + results.getTotalResultsAvailable() + " hits."); - println(); - // Get a list of the search results - WebSearchResult[] resultList = results.listResults(); - // Loop through the results and print them to the console - - for (int i = 0; i < resultList.length; i++) { - // Print out the document title and URL. - println((i + 1) + "."); - println(resultList[i].getTitle()); - println(resultList[i].getUrl()); - println(); - } - -// Error handling below, see the documentation of the Yahoo! API for details -} catch (IOException e) { - println("Error calling Yahoo! Search Service: " + e.toString()); - e.printStackTrace(); -} catch (SearchException e) { - println("Error calling Yahoo! Search Service: " + e.toString()); - e.printStackTrace(); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/Ex_04.pde b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/Ex_04.pde deleted file mode 100755 index 0931acf86..000000000 --- a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/Ex_04.pde +++ /dev/null @@ -1,68 +0,0 @@ -// Note: requires Carnivore Library for Processing v2.2 (http://r-s-g.org/carnivore) -// Windows, first install winpcap (http://winpcap.org) -// Mac, first open a Terminal and execute this commmand: sudo chmod 777 /dev/bpf* -// (must be done each time you reboot your mac) -import java.util.Iterator; -import org.rsg.carnivore.*; -import org.rsg.carnivore.net.*; -HashMap nodes = new HashMap(); -float startDiameter = 100.0; -float shrinkSpeed = 0.97; -int splitter, x, y; -PFont font; -void setup() { - size(800, 600); - background(255); - frameRate(10); - Log.setDebug(true); // Uncomment this for verbose mode - CarnivoreP5 c = new CarnivoreP5(this); -//c.setVolumeLimit(4); -// Use the "Create Font" tool to add a 12 point font to your sketch, -// then use its name as the parameter to loadFont(). - font = loadFont("CourierNew-12.vlw"); - textFont(font); -} - -void draw() { - background(255); - drawNodes(); -} - -// Iterate through each node -synchronized void drawNodes() { - Iterator it = nodes.keySet().iterator(); - while (it.hasNext()) { - String ip = (String)it.next(); - float d = float(nodes.get(ip).toString()); - - // Use last two IP address bytes for x/y coords - splitter = ip.lastIndexOf("."); - y = int(ip.substring(splitter + 1)) * height / 255; // Scale to applet size - String tmp = ip.substring(0, splitter); - splitter = tmp.lastIndexOf("."); - x = int(tmp.substring(splitter + 1)) * width / 255; // Scale to applet size - - // Draw the node - stroke(0); - fill(color(100, 200)); // Rim - ellipse(x, y, d, d); // Node circle - noStroke(); - fill(color(100, 50)); // Halo - ellipse(x, y, d + 20, d + 20); - - // Draw the text - fill(0); - text(ip, x, y); - - // Shrink the nodes a little - nodes.put(ip, str(d * shrinkSpeed)); - } -} - -// Called each time a new packet arrives -synchronized void packetEvent(CarnivorePacket packet) { - println("[PDE] packetEvent: " + packet); -// Remember these nodes in our hash map - nodes.put(packet.receiverAddress.toString(), str(startDiameter)); - nodes.put(packet.senderAddress.toString(), str(startDiameter)); -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/data/CourierNew-12.vlw b/java/examples/Books/Processing Handbook/Extensions/Network/Ex_04/data/CourierNew-12.vlw deleted file mode 100755 index a4e5d97370740592cf075a25d40354cbf97a5c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20170 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 -*/ -import krister.Ess.*; - -AudioChannel[] mySound = new AudioChannel[6]; // Six channels of audio playback -Envelope myEnvelope; // Create Envelope -boolean left = true; -boolean middle = false; -boolean right = false; -// Sampling rates to choose from -int[] rates = { 44100, 22050, 2943, 49500, 11025, 37083 }; - -void setup() { - size(256, 200); - stroke(255); - Ess.start(this); // Start Ess -// Load sounds and set initial panning -// Sounds must be located in the sketch's "data" folder - for (int i = 0; i < 6; i++) { - mySound[i] = new AudioChannel("cela3.aif"); - mySound[i].smoothPan = true; - mySound[i].pan(Ess.LEFT); - mySound[i].panTo(1, 4000); - } - EPoint[] myEnv = new EPoint[3]; // Three-step breakpoint function - myEnv[0] = new EPoint(0, 0); // Start at 0 - myEnv[1] = new EPoint(0.25, 1); // Attack - myEnv[2] = new EPoint(2, 0); // Release - myEnvelope = new Envelope(myEnv); // Bind an Envelope to the breakpoint function -} - -void draw() { - int playSound = 0; // How many sounds do we play on this frame? - int which = -1; // If so, on which voice? - noStroke(); - fill(0, 15); - rect(0, 0, width, height); // Fade background - stroke(102); - line(width / 2, 0, width / 2, height); // Center line - float interp = lerp(0, width, (mySound[0].pan + 1) / 2.0); - stroke(255); - line(interp, 0, interp, height); // Moving line -// Trigger 1-3 samples when the line passes the center line or hits an edge - if ((mySound[0].pan < 0) && (middle == true)) { - playSound = int(random(1, 3)); - middle = false; - } else if ((mySound[0].pan > 0) && (middle == false)) { - playSound = int(random(1, 3)); - middle = true; - } else if ((mySound[0].pan < -0.9) && (left == true)) { - playSound = int(random(1, 3)); - left = false; - } else if ((mySound[0].pan > -0.9) && (left == false)) { - left = true; - } else if ((mySound[0].pan > 0.9) && (right == true)) { - playSound = int(random(1, 3)); - right = false; - } else if ((mySound[0].pan < 0.9) && (right == false)) { - right = true; - } -// Voice allocation block, figure out which AudioChannels are free - while (playSound > 0) { - for (int i = 0; i < mySound.length; i++) { - if (mySound[i].state == Ess.STOPPED) { - which = i; // Find a free voice - } - } -// If a voice is available and selected, play it - if (which != -1) { - mySound[which].sampleRate(rates[int(random(0,6))], false); - mySound[which].play(); - myEnvelope.filter(mySound[which]); // Apply envelope - } - playSound--; - } -} - -public void stop() { - Ess.stop(); // When program stops, stop Ess too - super.stop(); -} - -void audioOutputPan(AudioOutput c) { - c.panTo(-c.pan, 4000); // Reverse pan direction -} diff --git a/java/examples/Books/Processing Handbook/Extensions/Sound/Ex_03/data/cela3.aif b/java/examples/Books/Processing Handbook/Extensions/Sound/Ex_03/data/cela3.aif deleted file mode 100755 index bf569358636e68fc2f506d8b8b0843adcd18931f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176652 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