private boolean collision(GravityObject GO) { for (int i = 0; i < gravityObjectArray.length; i++) { if (gravityObjectArray[i] != null) { if (GO != gravityObjectArray[i]) { double centerDistance = Math.sqrt( (Math.pow((GO.xP - gravityObjectArray[i].xP), 2)) + (Math.pow((GO.yP - gravityObjectArray[i].yP), 2))); // <3 Pytagoras if (centerDistance < GO.size + gravityObjectArray[i].size) { if (GO.size > gravityObjectArray[i].size) { GO.eat(gravityObjectArray[i]); } else { gravityObjectArray[i].eat(GO); } if (GO.size < gravityObjectArray[i].size) { GO.remove(); } else { gravityObjectArray[i].remove(); } return true; } } } else { break; } } return false; }
static void drawTorus(float r, float R, int nsides, int rings) { float ringDelta = 2.0f * (float) Math.PI / rings; float sideDelta = 2.0f * (float) Math.PI / nsides; float theta = 0.0f, cosTheta = 1.0f, sinTheta = 0.0f; for (int i = rings - 1; i >= 0; i--) { float theta1 = theta + ringDelta; float cosTheta1 = (float) Math.cos(theta1); float sinTheta1 = (float) Math.sin(theta1); GL11.glBegin(GL11.GL_QUAD_STRIP); float phi = 0.0f; for (int j = nsides; j >= 0; j--) { phi += sideDelta; float cosPhi = (float) Math.cos(phi); float sinPhi = (float) Math.sin(phi); float dist = R + r * cosPhi; GL11.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); GL11.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi); GL11.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); GL11.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); } GL11.glEnd(); theta = theta1; cosTheta = cosTheta1; sinTheta = sinTheta1; } }
private float[] randomColorArray() { float[] array = new float[3]; array[0] = (float) Math.random(); array[1] = (float) Math.random(); array[2] = (float) Math.random(); return array; }
private void drawVector() { if (drawVector) { for (int i = 0; i < gravityObjectArray.length; i++) { if (gravityObjectArray[i] != null) { GravityObject[] GOA = gravityObjectArray; GravityObject GO = gravityObjectArray[i]; for (int j = 0; j < GOA.length; j++) { if (GOA[j] != null && GOA[j].xP > 0 && GOA[j].yP > 0 && GOA[i].xP > 0 && GOA[i].yP > 0) { double distance = Math.sqrt( (Math.pow((GOA[j].xP - GOA[i].xP), 2)) + (Math.pow((GOA[j].yP - GOA[i].yP), 2))); double gravityForce = gravConstant * (GOA[i].getMass() * GOA[j].getMass()) / Math.pow(distance, 2); float[] gColAr = new float[3]; gColAr[0] = (float) (gravityForce * 1.3); gColAr[1] = (float) (gravityForce * 1); gColAr[2] = (float) (gravityForce * 1); drawLine( (int) (GOA[i].xP), (int) (GOA[i].yP), (int) (GOA[j].xP), (int) (GOA[j].yP), gColAr); } } float[] sColAr = new float[3]; sColAr[0] = (float) (0.2); sColAr[1] = (float) (0.2); sColAr[2] = (float) (0); drawLine( ((int) GO.xP), ((int) GO.yP), ((int) (GO.xP + GO.xV * (25))), ((int) (GO.yP + GO.yV * (25))), sColAr); } } } }
private void drawCircle(double x, double y, int radius, float color[], float alpha) { GL11.glColor4f(color[0], color[1], color[2], alpha); float incr = (float) (2 * Math.PI / slices); /*xCoord = xCoord + radius; yCoord = yCoord + radius;*/ GL11.glBegin(GL11.GL_TRIANGLE_FAN); for (int i = 0; i < slices; i++) { float angle = incr * i; float Xc = (float) (x + Math.cos(angle) * radius); float Yc = (float) (y + Math.sin(angle) * radius); GL11.glVertex2f(Xc, Yc); } GL11.glEnd(); }
private boolean gravityObjectCollision(int x, int y, int size) { for (int i = 0; i < gravityObjectArray.length; i++) { if (gravityObjectArray[i] != null) { double centerDistance = Math.sqrt( (Math.pow((x - gravityObjectArray[i].xP), 2)) + (Math.pow((y - gravityObjectArray[i].yP), 2))); // <3 Pytagoras if (centerDistance <= size + gravityObjectArray[i].size) { return true; } } else { break; } } return false; }
public RenderEngine() { glEnable(GL_DEPTH_TEST); projection = new Matrix4().initPerspective((float) Math.toRadians(90), 16f / 9f, 0.001f, 1000); }
private void applyPhysics() { GravityObject[] GOA = gravityObjectArray; for (int i = 0; i < GOA.length; i++) { int c = 0; if (GOA[i] != null) { double[] xVelAr = new double[128]; double[] yVelAr = new double[128]; for (int j = 0; j < GOA.length; j++) { if (GOA[j] != null) { if (GOA[j].size != 0 && GOA[i].size != 0) { if (i != j) { double distance = Math.sqrt( (Math.pow((GOA[j].xP - GOA[i].xP), 2)) + (Math.pow((GOA[j].yP - GOA[i].yP), 2))); double gravityForce = gravConstant * (GOA[i].getMass() * GOA[j].getMass()) / Math.pow(distance, 2); // System.out.println("Gravitational force between "+i+" and "+ j+" is "+ // gravityForce); double xDistance = GOA[j].xP - GOA[i].xP; if (xDistance < 0) { xDistance = GOA[i].xP - GOA[j].xP; } double yDistance = GOA[j].yP - GOA[i].yP; if (yDistance < 0) { yDistance = GOA[i].yP - GOA[j].yP; } // System.out.println("X, Y Distance: "+xDistance+" & "+yDistance); double acceleration = gravityForce / GOA[i].getMass(); // System.out.println("Acceleration of object "+i+" is equal to "+acceleration); // System.out.println("Object "+i+" moved towards "+j+" with a speed of: // "+acceleration); xVelAr[c] = (acceleration / (xDistance + yDistance)) * (GOA[j].xP - GOA[i].xP); // System.out.println("xVelAr["+j+"] = ("+acceleration+" / ("+xDistance+" + // "+yDistance+")) * ("+GOA[j].xP+" - "+GOA[i].xP+") En dat is: "+ xVelAr[j]); yVelAr[c] = (acceleration / (xDistance + yDistance)) * (GOA[j].yP - GOA[i].yP); c++; // C, C# etc... } } } else { break; } } for (int k = 0; k < xVelAr.length; k++) { double xTotalVel = 0; if (xVelAr[k] != 0) { xTotalVel += xVelAr[k]; } else { break; } GOA[i].xV += xTotalVel; } for (int l = 0; l < xVelAr.length; l++) { double yTotalVel = 0; if (yVelAr[l] != 0) { yTotalVel += yVelAr[l]; } else { break; } GOA[i].yV += yTotalVel; } if (!collision(GOA[i])) { GOA[i].move(); } else { GOA[i].move(); // colliding is handled in collision() } } else { break; } } // Delete out of bounds spheres for (int i = 0; i < gravityObjectArray.length; i++) { if (gravityObjectArray[i] != null) { if (gravityObjectArray[i].xP > screenWidth || gravityObjectArray[i].xP < 0 || gravityObjectArray[i].yP > screenHeight || gravityObjectArray[i].yP < 0) { gravityObjectArray[i].remove(); } } } }