# razaron

Member

5

101 Neutral

• Rank
Newbie
1. ## Separating axis theorem

You Sir, are a gentleman and a scholar.
2. ## Separating axis theorem

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, 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; } } Collision Detection part of the polygon (convex) class, 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.v2.pos.x - edge.v1.pos.x; double dy=edge.v2.pos.y - edge.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; } The implementation in the main class (done every frame), 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; } } } }
3. ## Verlet particle sytem not working

Thank you. I wasn't initializing temp and acceleration. I assumed that they had already initialized as (0,0).
4. ## Verlet particle sytem not working

Everything* in the updateVerlet() function except for the first line (the delta one) returns a nullpointer exception. *I checked line by line.
5. ## Verlet particle sytem not working

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, 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.updateVerlet(delta); } } public void renderer(){ for(int i=0;i<100;i++){ if(vertex!=null) vertex.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(); } } Vertex class, 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(); } } Thanks in advance.