Hive Plots

Experiments in Data Visualization

void ofApp::calculatePositions(){

//Note: Using Flocking Algorithm

//PART 1 - Calculate Center of Mass
string location = result[thingIGrabbed]["location"].asString();
ofPoint center;
int numberOfPoints = 0;
for (int i : nodeMap[location]) {
    center += pos[i];
    numberOfPoints++;
}
center = center / numberOfPoints;
ofPoint cohesion_velocity = (center - pos[thingIGrabbed])/1.0f;


//Part 2 - Calculate Distance between each node and itself
ofPoint displacement;
for (int i : nodeMap[location]) {
    if (i != thingIGrabbed) {
        float dist = ofDist(pos[i].x, pos[i].y, mouseX, mouseY);

        if(dist < 10.0){
            displacement = displacement - (pos[i] - ofPoint(mouseX, mouseY));
        }
    }
}

ofPoint separation_velocity;
separation_velocity = displacement;


//Part 3 - Add Velocity
ofPoint alignment_velocity;
if (previousGrabbedPosition.x != 0 || previousGrabbedPosition.y != 0) {
    // v = (x2 - x1)/t ==> but we assign time = 1
    vel[thingIGrabbed] = ofPoint(mouseX, mouseY) - previousGrabbedPosition;

    ofPoint avgVel;
    for (int i : nodeMap[location]) {
        avgVel += vel[i];
    }
    alignment_velocity = avgVel / (numberOfPoints + 1) / 1.0f;
}
previousGrabbedPosition = ofPoint(mouseX, mouseY);

ofPoint swarmV = -cohesion_velocity + separation_velocity + alignment_velocity;


for (int i : nodeMap[location]) {
    pos[i] += swarmV;
}

}