• Content count

  • Joined

  • Last visited

Community Reputation

101 Neutral

About razaron

  • Rank
  1. Separating axis theorem

    [quote name='Infernal-rk' timestamp='1327620185' post='4906578'] [sup][color=#000088]public[/color] [color=#660066]Projection[/color][color=#666600]([/color][color=#000088]double[/color][color=#000000] min[/color][color=#666600],[/color] [color=#000088]double[/color][color=#000000] max[/color][color=#666600]){[/color] [color=#000000] min[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]min[/color][color=#666600];[/color] [color=#000000] max[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]max[/color][color=#666600];[/color] [color=#666600]}[/color] [/sup] [sup]seems backwards. shouldn't it be: this.min = min; no?[/sup] [/quote] You Sir, are a gentleman and a scholar.
  2. I'm having trouble implementing the separating axis theorem. If I do the calculation in the code on paper it works, however if I run the code it doesn't. The aabb part is for (later) optimization. Here are the relevant bits of code: Projection Class, [CODE] public class Projection { protected double min; protected double max; public Projection(double min, double max){ min=this.min; max=this.max; } public boolean overlap(Projection p2){ boolean temp=true; if(min>p2.max || max<p2.min) temp=false; return temp; } } [/CODE] Collision Detection part of the polygon (convex) class, [code] public boolean collides(Polygon poly){ boolean check = true; double temp=0; Projection p1; Projection p2; Point2D.Double axis; for(int i=0;i<edges;i++){ if(check){ double min=0,max=0; double dx=edge[i].v2.pos.x - edge[i].v1.pos.x; double dy=edge[i].v2.pos.y - edge[i].v1.pos.y; double x=(dx)/Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); double y=(dy)/Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); axis = new Point2D.Double(-x, y); min = max = (axis.x*vertex[0].pos.x)+(axis.y*vertex[0].pos.y); //project this shape for(int j=0;j<vertices;j++){ temp= (axis.x*vertex[j].pos.x)+(axis.y*vertex[j].pos.y); if(temp<min) min=temp; if(temp>max) max=temp; } p1 = new Projection(min,max); min = max = (axis.x*poly.vertex[0].pos.x)+(axis.y*poly.vertex[0].pos.y); //project other shape for(int j=0;j<poly.vertices;j++){ temp= (axis.x*poly.vertex[j].pos.x)+(axis.y*poly.vertex[j].pos.y); if(temp<min) min=temp; if(temp>max) max=temp; } p2 = new Projection(min,max); if(!p1.overlap(p2)) check=false; } } return check; } [/code] The implementation in the main class (done every frame), [code] polygon.elementAt(j).aabbCollision=false; polygon.elementAt(j).polyCollision=false; for(int l=0;l<polygon.capacity();l++){ if(l!=j){ if(polygon.elementAt(j).box.compareAABB(polygon.elementAt(l).box)){ polygon.elementAt(j).aabbCollision=true; } if(polygon.elementAt(j).collides(polygon.elementAt(l))){ if(polygon.elementAt(l).collides(polygon.elementAt(j))){ polygon.elementAt(j).polyCollision=true; } } } } [/code]
  3. Thank you. I wasn't initializing [i]temp[/i] and [i]acceleration[/i]. I assumed that they had already initialized as (0,0).
  4. Everything* in the [i]updateVerlet()[/i] function except for the first line (the [i]delta[/i] one) returns a nullpointer exception. *I checked line by line.
  5. I've a very basic particle system based on verlet intergration. It seems fine but the updateVerlet() function returns a nullpointer exception. I just can't find the problem. Here's the source (exluding imports): Main class, [CODE] public class ParticleSystem { int lastFrame, width=800, height=600; boolean simulating; int ticker; Vertex[] vertex = new Vertex[100]; int temp; public void Start(){ try { Display.setDisplayMode(new DisplayMode(width,height)); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } initGL(); getDelta(); boolean Close = Display.isCloseRequested(); while(!Close){ GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); int delta=getDelta(); ticker+=delta; if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) || Display.isCloseRequested()) Close = true; if(Keyboard.isKeyDown(Keyboard.KEY_RETURN)) simulating = true; if(temp <100 && Mouse.isButtonDown(0) && ticker>=100){ vertex[temp]= new Vertex(Mouse.getX(), height-Mouse.getY()); temp++; ticker=0; } if(simulating) logic(delta); renderer(); Display.update(); } } public void logic(int delta){ for(int i=0;i<temp;i++){ vertex[i].updateVerlet(delta); } } public void renderer(){ for(int i=0;i<100;i++){ if(vertex[i]!=null) vertex[i].draw(); } } public int getDelta(){ long time = getTime(); int delta = (int) (time - lastFrame); lastFrame = (int) time; return delta; } public long getTime(){ return (Sys.getTime()*1000)/Sys.getTimerResolution(); } public void initGL(){ GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0, width, height, 0, 1, -1); GL11.glMatrixMode(GL11.GL_MODELVIEW); } public static void main(String args[]){ ParticleSystem ps = new ParticleSystem(); ps.Start(); } } [/CODE] Vertex class, [CODE] public class Vertex { protected Point2D.Double pos; protected Point2D.Double oldpos; protected Point2D.Double acceleration; protected Point2D.Double temp; public Vertex(double x, double y){ pos = new Point2D.Double(x,y); oldpos = new Point2D.Double(x,y); } public void updateVerlet(int delta){ double t=((double)delta)/1000; temp.x=pos.x; temp.y=pos.y; pos.x += (pos.x - oldpos.x) + (acceleration.x*t*t); pos.y += (pos.y - oldpos.y) + (acceleration.y*t*t); oldpos.x=temp.x; oldpos.y=temp.y; } public void draw(){ GL11.glColor3f(1f, 0f, 0f); GL11.glBegin(GL11.GL_QUADS); GL11.glVertex2d(pos.x-1, pos.y-1); GL11.glVertex2d(pos.x-1, pos.y+1); GL11.glVertex2d(pos.x+1, pos.y+1); GL11.glVertex2d(pos.x+1, pos.y-1); GL11.glEnd(); } } [/CODE] Thanks in advance.