mirror of
https://github.com/opus-tango/GravityDev3.git
synced 2026-03-19 19:52:51 +00:00
Initial commit
This commit is contained in:
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
72
GravityDev3.pde
Normal file
72
GravityDev3.pde
Normal file
@@ -0,0 +1,72 @@
|
||||
|
||||
PlanetManager pm; // Manages Planets
|
||||
Gui gui; // Contains and manages gui
|
||||
ActionFlags flags = new ActionFlags(); // Public global actions flags
|
||||
Vector offset;
|
||||
|
||||
float g = 0.05; // Gravity constant
|
||||
float scrollDirection = 1; // Multiply by -1 to change scroll direction
|
||||
float scaleMul = 1.0; // Scale multiplier
|
||||
float guiScale = 1.0; // Seperate gui scale multiplier
|
||||
|
||||
int focus = 1; // Planet in focus (-1 for no focus)
|
||||
float focusTolerance = 10; // How much error can there be when clicking a planet
|
||||
|
||||
void setup(){
|
||||
size(1000,800);
|
||||
frameRate(60);
|
||||
noStroke();
|
||||
offset = new Vector(width/2, height/2);
|
||||
pm = new PlanetManager();
|
||||
gui = new Gui();
|
||||
|
||||
|
||||
pm.createPlanet(500.0, 400.0, 0.0, 0.0, 200.0);
|
||||
pm.createPlanet(850.0, 400.0, 0.0, 3.2, 25.0);
|
||||
pm.createPlanet(880.0, 400.0, 0.0, 4.3, 1.0);
|
||||
pm.createPlanet(700.0, 400.0, 0.0, 6.0, 2.0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void draw(){
|
||||
background(205);
|
||||
|
||||
pm.updateGravity();
|
||||
|
||||
// Subtract from offset the difference between current offset and the planet in focus
|
||||
if(focus >= 0){
|
||||
if(flags.centerOnFocus){
|
||||
offset.sub(offset.x - pm.getPos(focus).x,offset.y - pm.getPos(focus).y); // Moves focused planet in center of screen
|
||||
flags.centerOnFocus = false;
|
||||
}else{
|
||||
offset.add(pm.getVel(focus).x,pm.getVel(focus).y); // Makes focused planet stationary
|
||||
}
|
||||
}
|
||||
|
||||
/* PLANET MATRIX */
|
||||
pushMatrix();
|
||||
translate(width/2,height/2);
|
||||
scale(scaleMul);
|
||||
pm.drawPlanets();
|
||||
popMatrix();
|
||||
|
||||
/* DEFAULT MATRIX */
|
||||
|
||||
gui.display();
|
||||
|
||||
/* DEBUG PRINTS
|
||||
println();
|
||||
//println(offset.x + " " + offset.y);
|
||||
Vector mouse = mouseS();
|
||||
println(mouse.x + " " + mouse.y);
|
||||
println(pm.getRenPos(0).x + " " + pm.getRenPos(0).y + " " + dist(pm.getRenPos(1).x,pm.getRenPos(1).y,mouse.x,mouse.y));
|
||||
/*
|
||||
if (focus >=0){
|
||||
println(pm.getPos(focus).x + " " + pm.getPos(focus).y);
|
||||
println((pm.getPos(focus).x - offset.x) + " " + (pm.getPos(focus).y - offset.y));}*/
|
||||
}
|
||||
31
eMouse.pde
Normal file
31
eMouse.pde
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
Mouse overrides and functions
|
||||
|
||||
*/
|
||||
|
||||
void mouseDragged() {
|
||||
float mx = pmouseX - mouseX;
|
||||
float my = pmouseY - mouseY;
|
||||
offset.add(mx / scaleMul, my / scaleMul);
|
||||
}
|
||||
|
||||
void mouseWheel(MouseEvent event){
|
||||
float e = event.getCount() * scrollDirection;
|
||||
//offset.sub(mouseX,mouseY);
|
||||
float delta = e < 0 ? 1.05 : e > 0 ? 1.0/1.05 : 1.0;
|
||||
scaleMul *= delta;
|
||||
//offset.add(mouseX,mouseY);
|
||||
}
|
||||
|
||||
void mouseClicked() {
|
||||
boolean guiInteract = gui.clickManager(new Vector(mouseX,mouseY));
|
||||
if(!guiInteract){
|
||||
Vector mouse = mouseS();
|
||||
focus = pm.getCPlanet(mouse.x,mouse.y);
|
||||
}
|
||||
}
|
||||
|
||||
Vector mouseS(){
|
||||
return new Vector((mouseX - width/2) * 1/scaleMul, (mouseY - height/2) * 1/scaleMul);
|
||||
}
|
||||
10
fActionFlags.pde
Normal file
10
fActionFlags.pde
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
|
||||
Public flags to control certain actions, mostly for gui interaction with the simulation
|
||||
|
||||
*/
|
||||
|
||||
class ActionFlags {
|
||||
boolean centerOnFocus = false;
|
||||
boolean nameTags = true;
|
||||
}
|
||||
49
mGui.pde
Normal file
49
mGui.pde
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
|
||||
Actual GUI file that defines all gui elements
|
||||
|
||||
*/
|
||||
|
||||
class Gui {
|
||||
CButton cb;
|
||||
|
||||
Gui(){
|
||||
cb = new CButton();
|
||||
}
|
||||
|
||||
void display(){
|
||||
cb.display();
|
||||
}
|
||||
|
||||
boolean clickManager(Vector mouse){
|
||||
return cb.clicked(mouse.x,mouse.y);
|
||||
}
|
||||
}
|
||||
|
||||
class CButton extends Button{
|
||||
|
||||
CButton(){
|
||||
pos = new Vector(width/2,15);
|
||||
dim = new Vector(70,24);
|
||||
t = "center";
|
||||
tSize = 20;
|
||||
}
|
||||
|
||||
void display(){
|
||||
fill(col);
|
||||
rectMode(CENTER);
|
||||
rect(pos.x,pos.y,dim.x,dim.y,rad);
|
||||
|
||||
fill(tCol);
|
||||
textAlign(CENTER,CENTER);
|
||||
textSize(tSize);
|
||||
text(t,pos.x,pos.y - tSize/4);
|
||||
}
|
||||
|
||||
boolean clicked(float mx, float my){
|
||||
if(mouseOver(mx,my)){
|
||||
flags.centerOnFocus = true;
|
||||
return true;
|
||||
}else{return false;}
|
||||
}
|
||||
}
|
||||
93
wButton.pde
Normal file
93
wButton.pde
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
|
||||
Button class
|
||||
|
||||
*/
|
||||
|
||||
class Button {
|
||||
Vector pos;
|
||||
Vector dim;
|
||||
float rad = 3;
|
||||
color col = #413f54;
|
||||
String t = "";
|
||||
color tCol = 0;
|
||||
int tSize = 20;
|
||||
|
||||
boolean mouseOver(float mx, float my){
|
||||
if (mx >= pos.x - dim.x/2 && mx <= pos.x + dim.x/2 &&
|
||||
my >= pos.y - dim.x/2 && my <= pos.y + dim.y/2) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* DEPRECATED
|
||||
class Button {
|
||||
Vector pos;
|
||||
Vector dim;
|
||||
float r = .5;
|
||||
String t = "";
|
||||
color col = (#413f54);
|
||||
color tCol = 0;
|
||||
|
||||
boolean mouseOver = false;
|
||||
|
||||
// INITIALIZERS
|
||||
|
||||
Button(float _x, float _y, float _w, float _h){
|
||||
this.pos = new Vector(_x,_y);
|
||||
this.dim = new Vector(_w,_h);
|
||||
}
|
||||
Button(float _x, float _y, float _w, float _h, float _r){
|
||||
this.pos = new Vector(_x,_y);
|
||||
this.dim = new Vector(_w,_h);
|
||||
this.r = _r;
|
||||
}
|
||||
Button(float _x, float _y, float _w, float _h, color _col){
|
||||
this.pos = new Vector(_x,_y);
|
||||
this.dim = new Vector(_w,_h);
|
||||
this.col = _col;
|
||||
}
|
||||
Button(float _x, float _y, float _w, float _h, float _r, color _col){
|
||||
this.pos = new Vector(_x,_y);
|
||||
this.dim = new Vector(_w,_h);
|
||||
this.r = _r;
|
||||
this.col = _col;
|
||||
}
|
||||
|
||||
|
||||
// SETTERS
|
||||
void setText(String _t){this.t = _t;}
|
||||
void setRad(float _r){this.r = _r;}
|
||||
void setColor(color _col){this.col = _col;}
|
||||
|
||||
// Set Position
|
||||
void setPos(Vector _pos){this.pos = _pos;}
|
||||
void setPos(float _x, float _y){this.pos = new Vector(_x,_y);}
|
||||
|
||||
// Set Dimensions
|
||||
void setDim(Vector _dim){this.dim = _dim;}
|
||||
void setDim(float _w, float _h){this.dim = new Vector(_w,_h);}
|
||||
|
||||
// OTHER FUNCTIONS
|
||||
void drawB(){
|
||||
fill(col);
|
||||
rectMode(CORNER);
|
||||
rect(pos.x,pos.y,dim.x,dim.y,r);
|
||||
fill(tCol);
|
||||
text(t,pos.x,pos.y);
|
||||
}
|
||||
|
||||
boolean mouseOver(float mx, float my){
|
||||
if (mx >= pos.x && mx <= pos.x + dim.x &&
|
||||
my >= pos.y && my <= pos.y + dim.y) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}\
|
||||
|
||||
*/
|
||||
59
xPlanet.pde
Normal file
59
xPlanet.pde
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
|
||||
Planet class
|
||||
|
||||
*/
|
||||
|
||||
class Planet {
|
||||
Vector pos;
|
||||
Vector vel;
|
||||
Vector ren = new Vector(0,0);
|
||||
float mass;
|
||||
color col = 100;
|
||||
float dia;
|
||||
String name;
|
||||
|
||||
Planet(float x, float y, float mass){
|
||||
pos = new Vector(x,y);
|
||||
vel = new Vector(0,0);
|
||||
this.mass = mass;
|
||||
this.dia = constrain( sqrt(mass) * 5 ,1,100);
|
||||
}
|
||||
|
||||
/* SETTERS */
|
||||
void setPos(Vector _pos) {this.pos = _pos;}
|
||||
void setPos(float x, float y) {this.pos = new Vector(x,y);}
|
||||
|
||||
void setVel(Vector _vel) {this.pos = _vel;}
|
||||
void setVel(float x, float y) {this.vel = new Vector(x,y);}
|
||||
|
||||
void setname(String _name){this.name = _name;}
|
||||
|
||||
/* FUNCTIONS */
|
||||
void gravity(Planet p){
|
||||
float xDist = (p.pos.x - this.pos.x);
|
||||
float yDist = (p.pos.y - this.pos.y);
|
||||
float magsq = sq(xDist) + sq(yDist);
|
||||
|
||||
float pMass = (this.mass * p.mass);
|
||||
|
||||
float xGrav = xDist * g * (pMass/magsq);
|
||||
float yGrav = yDist * g * (pMass/magsq);
|
||||
|
||||
this.vel.add(xGrav/this.mass,yGrav/this.mass);
|
||||
}
|
||||
void updatePos(){
|
||||
this.pos.add(this.vel);
|
||||
}
|
||||
void display(){
|
||||
fill(this.col);
|
||||
ren.set(pos.x - offset.x,pos.y - offset.y);
|
||||
circle(ren.x,ren.y,dia);
|
||||
if(flags.nameTags){
|
||||
fill(0);
|
||||
textAlign(CENTER,BOTTOM);
|
||||
textSize(20 * 1/scaleMul);
|
||||
text(name,ren.x,ren.y - dia/2);
|
||||
}
|
||||
}
|
||||
}
|
||||
64
yPlanetManager.pde
Normal file
64
yPlanetManager.pde
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
|
||||
Planet manager is a container class for all planets and planet io
|
||||
|
||||
*/
|
||||
|
||||
class PlanetManager {
|
||||
ArrayList<Planet> planets = new ArrayList<Planet>();
|
||||
|
||||
/* FACTORIES */
|
||||
void createPlanet(float x, float y, float mass){
|
||||
planets.add(new Planet(x,y,mass));
|
||||
}
|
||||
void createPlanet(float x, float y, float xSpeed, float ySpeed, float mass){
|
||||
planets.add(new Planet(x,y,mass));
|
||||
planets.get(planets.size() - 1).setVel(xSpeed, ySpeed);
|
||||
planets.get(planets.size() - 1).setname(str(planets.size() - 1));
|
||||
}
|
||||
|
||||
/* GETTERS */
|
||||
Vector getPos(int f){return planets.get(f).pos;}
|
||||
Vector getRenPos(int f){return planets.get(f).ren;}
|
||||
Vector getVel(int f){return planets.get(f).vel;}
|
||||
|
||||
/* FUNCTIONS */
|
||||
void updateGravity(){
|
||||
for(int i = 0; i < planets.size(); i++){
|
||||
for(int j = 0; j < planets.size(); j++){
|
||||
if(i != j){
|
||||
planets.get(i).gravity(planets.get(j));
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i = 0; i < planets.size(); i++){
|
||||
planets.get(i).updatePos();
|
||||
}
|
||||
}
|
||||
|
||||
void drawPlanets(){
|
||||
for(int i = 0; i < planets.size(); i++){
|
||||
planets.get(i).display();
|
||||
}
|
||||
}
|
||||
|
||||
int getCPlanet(float mx, float my){
|
||||
int out = -1;//new Vector(mx,my);
|
||||
float smallestDist = focusTolerance * 10;
|
||||
|
||||
for(int i = 0; i < pm.planets.size(); i++){
|
||||
float dist = dist(pm.getRenPos(i).x,pm.getRenPos(i).y,mx,my);
|
||||
|
||||
// If no planets are within tolerance the focus will be set to -1, ie: no planet in focus
|
||||
if(dist < (focusTolerance * 1/scaleMul) + (pm.planets.get(i).dia / 2)){//(focusTolerance * 1/scaleMul)){
|
||||
println(dist + " " + (focusTolerance * 1/scaleMul) + " " + (pm.planets.get(i).dia / 2));
|
||||
//println(pm.planets.get(i).dia);
|
||||
if(smallestDist > dist){
|
||||
smallestDist = dist;
|
||||
out = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
}
|
||||
84
zVector.pde
Normal file
84
zVector.pde
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
|
||||
My own vector class so that I can see and control what is going on inside
|
||||
|
||||
*/
|
||||
|
||||
class Vector {
|
||||
float x;
|
||||
float y;
|
||||
|
||||
Vector(float _x, float _y){
|
||||
this.x = _x;
|
||||
this.y = _y;
|
||||
}
|
||||
Vector(Vector v){
|
||||
this.x = v.x;
|
||||
this.y = v.y;
|
||||
}
|
||||
void set(float _x, float _y){
|
||||
this.x = _x;
|
||||
this.y = _y;
|
||||
}
|
||||
|
||||
// Add a float or vector
|
||||
void add(Vector o){x += o.x; y += o.y;}
|
||||
void add(float _c){x += _c; y += _c;}
|
||||
void add(float _x, float _y){x += _x; y += _y;}
|
||||
|
||||
// Subtract a float or vector
|
||||
void sub(Vector o){x -= o.x; y -= o.y;}
|
||||
void sub(float _c){x -= _c; y -= _c;}
|
||||
void sub(float _x, float _y){x -= _x; y -= _y;}
|
||||
|
||||
// multiply by a float or vector
|
||||
void mul(Vector o){x *= o.x; y *= o.y;}
|
||||
void mul(float _c){x *= _c; y *= _c;}
|
||||
void mul(float _x, float _y){x *= _x; y *= _y;}
|
||||
|
||||
// Divide by a float or vector
|
||||
void div(Vector o){x /= o.x; y /= o.y;}
|
||||
void div(float _c){x /= _c; y /= _c;}
|
||||
void div(float _x, float _y){x /= _x; y /= _y;}
|
||||
|
||||
// Return absolute distance to any point
|
||||
float mag(Vector o){
|
||||
return sqrt(sq(o.x - this.x) + sq(o.y - this.y));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
class Vector3D extends Vector {
|
||||
float z;
|
||||
|
||||
Vector3D(float _x, float _y, float _z){
|
||||
super(_x,_y);
|
||||
z = _z;
|
||||
}
|
||||
void set(float _x, float _y, float _z){
|
||||
x = _x;
|
||||
y = _y;
|
||||
z = _z;
|
||||
}
|
||||
|
||||
// Add a float or vector
|
||||
void add(Vector3D o){x += o.x; y += o.y; z += o.z;}
|
||||
void add(float _c){x += _c; y += _c; z += _c;}
|
||||
void add(float _x, float _y, float _z){x += _x; y += _y; z += _z;}
|
||||
|
||||
// Subtract a float or vector
|
||||
void sub(Vector3D o){x -= o.x; y -= o.y; z -= o.z;}
|
||||
void sub(float _c){x -= _c; y -= _c; z -= _c;}
|
||||
void sub(float _x, float _y, float _z){x -= _x; y -= _y; z -= _z;}
|
||||
|
||||
// multiply by a float or vector
|
||||
void mul(Vector3D o){x *= o.x; y *= o.y; z *= o.z;}
|
||||
void mul(float _c){x *= _c; y *= _c; z *= _c;}
|
||||
void mul(float _x, float _y, float _z){x *= _x; y *= _y; z *= _z;}
|
||||
|
||||
// Divide by a float or vector
|
||||
void div(Vector3D o){x /= o.x; y /= o.y; z /= o.z;}
|
||||
void div(float _c){x /= _c; y /= _c; z /= _c;}
|
||||
void div(float _x, float _y, float _z){x /= _x; y /= _y; z /= _z;}
|
||||
}
|
||||
*/
|
||||
Reference in New Issue
Block a user