#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
}