#include <iostream> class Boid { // main fields PVector pos; PVector move; float shade; ArrayList<Boid> friends; // timers int thinkTimer = 0; Boid (float xx, float yy) { move = new PVector(0, 0); pos = new PVector(0, 0); pos.x = xx; pos.y = yy; thinkTimer = int(random(10)); shade = random(255); friends = new ArrayList<Boid>(); } void go () { increment(); wrap(); if (thinkTimer ==0 ) { // update our friend array (lots of square roots) getFriends(); } flock(); pos.add(move); } void flock () { PVector allign = getAverageDir(); PVector avoidDir = getAvoidDir(); PVector avoidObjects = getAvoidAvoids(); PVector noise = new PVector(random(2) - 1, random(2) -1); PVector cohese = getCohesion(); allign.mult(1); if (!option_friend) allign.mult(0); avoidDir.mult(1); if (!option_crowd) avoidDir.mult(0); avoidObjects.mult(3); if (!option_avoid) avoidObjects.mult(0); noise.mult(0.1); if (!option_noise) noise.mult(0); cohese.mult(1); if (!option_cohese) cohese.mult(0); stroke(0, 255, 160); move.add(allign); move.add(avoidDir); move.add(avoidObjects); move.add(noise); move.add(cohese); move.limit(maxSpeed); shade += getAverageColor() * 0.03; shade += (random(2) - 1) ; shade = (shade + 255) % 255; //max(0, min(255, shade)); } void getFriends () { ArrayList<Boid> nearby = new ArrayList<Boid>(); for (int i =0; i < boids.size(); i++) { Boid test = boids.get(i); if (test == this) continue; if (abs(test.pos.x - this.pos.x) < friendRadius && abs(test.pos.y - this.pos.y) < friendRadius) { nearby.add(test); } } friends = nearby; } float getAverageColor () { float total = 0; float count = 0; for (Boid other : friends) { if (other.shade - shade < -128) { total += other.shade + 255 - shade; } else if (other.shade - shade > 128) { total += other.shade - 255 - shade; } else { total += other.shade - shade; } count++; } if (count == 0) return 0; return total / (float) count; } PVector getAverageDir () { PVector sum = new PVector(0, 0); int count = 0; for (Boid other : friends) { float d = PVector.dist(pos, other.pos); // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) if ((d > 0) && (d < friendRadius)) { PVector copy = other.move.copy(); copy.normalize(); copy.div(d); sum.add(copy); count++; } if (count > 0) { //sum.div((float)count); } } return sum; } PVector getAvoidDir() { PVector steer = new PVector(0, 0); int count = 0; for (Boid other : friends) { float d = PVector.dist(pos, other.pos); // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) if ((d > 0) && (d < crowdRadius)) { // Calculate vector pointing away from neighbor PVector diff = PVector.sub(pos, other.pos); diff.normalize(); diff.div(d); // Weight by distance steer.add(diff); count++; // Keep track of how many } } if (count > 0) { //steer.div((float) count); } return steer; } PVector getAvoidAvoids() { PVector steer = new PVector(0, 0); int count = 0; for (Avoid other : avoids) { float d = PVector.dist(pos, other.pos); // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) if ((d > 0) && (d < avoidRadius)) { // Calculate vector pointing away from neighbor PVector diff = PVector.sub(pos, other.pos); diff.normalize(); diff.div(d); // Weight by distance steer.add(diff); count++; // Keep track of how many } } return steer; } PVector getCohesion () { float neighbordist = 50; PVector sum = new PVector(0, 0); // Start with empty vector to accumulate all locations int count = 0; for (Boid other : friends) { float d = PVector.dist(pos, other.pos); if ((d > 0) && (d < coheseRadius)) { sum.add(other.pos); // Add location count++; } } if (count > 0) { sum.div(count); PVector desired = PVector.sub(sum, pos); return desired.setMag(0.05); } else { return new PVector(0, 0); } } void draw () { for ( int i = 0; i < friends.size(); i++) { Boid f = friends.get(i); stroke(90); //line(this.pos.x, this.pos.y, f.pos.x, f.pos.y); } noStroke(); fill(shade, 90, 200); pushMatrix(); translate(pos.x, pos.y); rotate(move.heading()); beginShape(); vertex(15 * globalScale, 0); vertex(-7* globalScale, 7* globalScale); vertex(-7* globalScale, -7* globalScale); endShape(CLOSE); popMatrix(); } // update all those timers! void increment () { thinkTimer = (thinkTimer + 1) % 5; } void wrap () { pos.x = (pos.x + width) % width; pos.y = (pos.y + height) % height; } }
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++
and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}