{Software} Structures




main.cpp

#include "ofMain.h"
#include "ofApp.h"

int main( ){
    ofSetupOpenGL(1920, 1080, OF_FULLSCREEN);
    //ofSetupOpenGL(1920, 1080, OF_WINDOW);
    ofRunApp(new ofApp());
}


ofApp.cpp

#include "ofApp.h"
#include "circle.h"

Circle *circles[numCircle];

void ofApp::setup() {
    ofBackground(255);
    ofHideCursor();
    for (int i = 0; i < numCircle; i++) {
        circles[i] = new Circle(ofRandom(0, ofGetWidth()), ofRandom(0, ofGetHeight()),
                                ofRandom(20, 126),
                                ofRandom(-0.5, 0.5), ofRandom(-0.5, 0.5), i, circles,
                                ofGetWidth(), ofGetHeight());
    }
}

void ofApp::update() {

}

void ofApp::draw() {
    for (int i = 0; i < numCircle; i++) {
        circles[i]->update();
        circles[i]->move();
        circles[i]->makePoint();
    }
}


ofApp.h

#pragma once

#include "ofMain.h"

static int width;
static int height;

class ofApp : public ofBaseApp{
	public:
		void setup();
		void update();
        void draw();	
};


Circle.cpp

#include "Circle.h"

Circle::Circle(float px, float py, float pr, float psp, float pysp, int pid, Circle *circles[numCircle], int pw, int ph) {
    x = px;
    y = py;
    r = pr;
    r2 = r * r;
    xSpeed = psp;
    ySpeed = pysp;
    id = pid;
    others = circles;
    width = pw;
    height = ph;
}

void Circle::update() {
    for (int i = id+1; i < numCircle; i++) {
        intersect( others[id], others[i] );
    }
}

void Circle::makePoint() {
    ofSetColor(0);
    ofDrawRectangle(x, y, 1, 1);
}

void Circle::move() {
    x += xSpeed;
    y += ySpeed;

    if(xSpeed > 0) {
        if (x > width+r) {
            x = -r;
        }
    } else {
        if (x < -r) {
            x = width+r;
        }
    }
    
    if(ySpeed < 0) {
        if (y < -r) {
            y = height+r;
        }
    } else {
        if (y > height+r) {
            y = -r;
        }
    }
}

void Circle::intersect(Circle *cA, Circle *cB) {
    float dx = cA->x - cB->x;
    float dy = cA->y - cB->y;
    float d2 = dx*dx + dy*dy;
    float d = sqrt( d2 );
    
    if ( d > (cA->r + cB->r) || d < (fabs(cA->r - cB->r)) ) {
        return;  // No solution
    }

    float a = (cA->r2 - cB->r2 + d2) / (2*d);
    float h = sqrt( cA->r2 - a*a );
    float x2 = cA->x + a*(cB->x - cA->x)/d;
    float y2 = cA->y + a*(cB->y - cA->y)/d;
    
    float paX = x2 + h*(cB->y - cA->y)/d;
    float paY = y2 - h*(cB->x - cA->x)/d;
    float pbX = x2 - h*(cB->y - cA->y)/d;
    float pbY = y2 + h*(cB->x - cA->x)/d;
    
    float dist = distance(paX, paY, pbX, pbY);
    float gray = 255-dist;
    ofSetColor(gray, gray, gray);
    ofDrawLine(paX, paY, pbX, pbY);
} 

float Circle::distance(float x1, float y1, float x2, float y2) { 
	return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); 
}
 

Circle.h

#include "ofApp.h"

#ifndef _Circle_H_
#define _Circle_H_

#define numCircle 200

class Circle
{
public:
    
    float x, y, r, r2, xSpeed, ySpeed;
    int id;
    
    Circle **others;
    
    Circle();
    Circle(float, float, float, float, float, int, Circle *[numCircle], int, int);
    void update();
    void move();
    void makePoint();
    void intersect(Circle *, Circle *);
    float distance(float, float, float, float);
    
}; 

#endif