Bonjour,
J'aimerai simuler une situation où des boules se déplaceraient à vitesse constante et où elles se cogneraient pour rebondir les unes sur les autres sur le plan (O,X,Y).
De ce fait, j'ai pu modéliser avec une arborescence de classes JAVA dont voici les codes:
PACKAGE collisions
Code:package collisions; public class Point { public final static Point O=new Point(0, 0); final double x; final double y; public Point(double x, double y) { this.x=x; this.y=y; } public final double x() { return x; } public final double y() { return y; } }Code:package collisions; public interface ObjetCollision { }Code:package collisions; public class Droite { final Point a; final Point b; final double p; final double o; public Droite(Point a, Point b) { this.a=a; this.b=b; p=(a.y-b.y)/(a.x-b.x); o=(a.y+b.y)/2-p*(a.x+b.x)/2; } public Droite(double p, double o) { this.a=new Point(0, o); this.b=new Point(1, p+o); this.p=p; this.o=o; } @Override public /*final*/ String toString() { return "Droite passant par les deux points suivants: "+a+" et "+b+"."; } public final Point a() { return a; } public final Point b() { return b; } public final double p() { return p; } public final double o() { return o; } public boolean isHorizontal() { return a.y==b.y; } public boolean isVertical() { return a.x==b.x; } public final Point projection(Point p) //vérifié { //point allant en perpendiculaire sur la droite en partant du point Point A=a; Point B=b; Point C=p; Vecteur u=new Vecteur(B.x-A.x, B.y-A.y); Vecteur AC=new Vecteur(C.x-A.x, C.y-A.y); double ti=(u.x*AC.x+u.y*AC.y)/(u.x*u.x+u.y*u.y); return new Point(A.x+ti*u.x, A.y+ti*u.y); } public final Vecteur normale(Point p) //vérifié { Point A=a; Point B=b; Point C=p; Vecteur u=new Vecteur(B.x-A.x, B.y-A.y); Vecteur AC=new Vecteur(C.x-A.x, C.y-A.y); double parenthesis=u.x*AC.y-u.y*AC.x; Vecteur N=new Vecteur(-u.y*parenthesis, u.x*parenthesis); double norme=Math.sqrt(N.x*N.x+N.y*N.y); Vecteur NN=new Vecteur(N.x/norme, N.y/norme); return NN; } public final Point perpendiculaire(Point p, double x) { double pp=-1/this.p; double oo=p.y+p.x/this.p; double y=x*pp+oo; return new Point(x, y); } }Code:package collisions; public class Segment extends Droite implements ObjetCollision { public Segment(Point a, Point b) { super(a, b); } //nous sommes un point O, nous voulons avancer vers P, Touchons-nous le segment[AB]? //this=[OP] //d=(AB) //s=[AB] public final boolean collision(Droite d) //verifié { Point A=d.a; Point B=d.b; Point O=this.a; Point P=this.b; Vecteur AB=new Vecteur(B.x-A.x, B.y-A.y); Vecteur AP=new Vecteur(P.x-A.x, P.y-A.y); Vecteur AO=new Vecteur(O.x-A.x, O.y-A.y); return (AB.x*AP.y-AB.y*AP.x)*(AB.x*AO.y-AB.y*AO.x)<0; } public final boolean collision(Segment s) //vérifié { if (!collision((Droite)s)) { return false; } /*if (!s.collision((Droite)this)) { return false; } //return true;*/ Point A=s.a; Point B=s.b; Point O=this.a; Point P=this.b; Vecteur AB=new Vecteur(B.x-A.x, B.y-A.y); Vecteur OP=new Vecteur(P.x-O.x, P.y-O.y); double k=-(A.x*OP.y-O.x*OP.y-OP.x*A.y+OP.x*O.y)/(AB.x*OP.y-AB.y*OP.x); return !(k<0||k>1); } }Code:package collisions; public class Vecteur { final double x; final double y; final Point p; public Vecteur(double x, double y) { this.x=x; this.y=y; p=new Point(x, y); } public Vecteur(Point p) { this.p=p; x=p.x; y=p.y; } public final double x() { return x; } public final double y() { return y; } public final Point p() { return p; } public final Vecteur rebond(Vecteur n) //vérifié { Vecteur N=n; Vecteur v=this; double pscal=(v.x*N.x+v.y*N.y); return new Vecteur(v.x-2*pscal*N.x, v.y-2*pscal*N.y); } public final double getAngle() { return getAngle(true); } public final double getAngle(boolean degre) { double module=Math.sqrt(x*x+y*y); double cosinus=x/module; double sinus=y/module; double argument=0; if (module!=0) { switch (quadrant(cosinus, sinus)) { case 1: case 2: argument=Math.acos(cosinus); break; case 3: case 4: argument=2*Math.PI-Math.acos(cosinus); break; } } if (degre) { argument=(argument*180)/Math.PI; } return argument; } private static int quadrant(double cosinus, double sinus) { int quadrant=0; if (cosinus>=0&&sinus>=0) { quadrant=1; } else if (cosinus<0&&sinus>=0) { quadrant=2; } else if (cosinus<0&&sinus<0) { quadrant=3; } else if (cosinus>=0&&sinus<0) { quadrant=4; } return quadrant; } public static Vecteur getAngle(double angle) { return getAngle(angle, 1, true); } public static Vecteur getAngle(double angle, double etendue) { return getAngle(angle, etendue, true); } public static Vecteur getAngle(double angle, boolean degre) { return getAngle(angle, 1, degre); } public static Vecteur getAngle(double angle, double etendue, boolean degre) { if (degre) { angle=(angle*Math.PI)/180; } return new Vecteur(etendue*Math.cos(angle), etendue*Math.sin(angle)); } }Code:package collisions; public class Rectangle implements ObjetCollision { final Point p; final double w; final double h; final double x; final double y; public Rectangle(Point p, double w, double h) { this.p=p; this.w=w; this.h=h; this.x=p.x; this.y=p.y; } public Rectangle(double x, double y, double w, double h) { this.p=new Point(x, y); this.w=w; this.h=h; this.x=x; this.y=y; } public final Point p() { return p; } public final double w() { return w; } public final double h() { return h; } public final double x() { return x; } public final double y() { return y; } public final boolean collision(Point p) //vérifié { double curseur_x=p.x; double curseur_y=p.y; Rectangle box=this; return curseur_x>=box.x &&curseur_x<box.x+box.w &&curseur_y>=box.y &&curseur_y<box.y+box.h; } public final boolean collision(Rectangle r) //verifié { Rectangle box1=this; Rectangle box2=r; return !(box2.x>=box1.x+box1.w ||box2.x+box2.w<=box1.x ||box2.y>=box1.y+box1.h ||box2.y+box2.h<=box1.y); } public final boolean collision(Cercle c) { return c.collision(this); } public final boolean collision(Segment s) { return getNord().collision(s)||getSud().collision(s)||getOuest().collision(s)||getEst().collision(s); } public final Segment getNord() { return new Segment(new Point(p.x, p.y), new Point(p.x+w, p.y)); } public final Segment getSud() { return new Segment(new Point(p.x, p.y+h), new Point(p.x+w, p.y+h)); } public final Segment getOuest() { return new Segment(new Point(p.x, p.y), new Point(p.x, p.y+h)); } public final Segment getEst() { return new Segment(new Point(p.x+w, p.y), new Point(p.x+w, p.y+h)); } public final Vecteur rebondir(Segment segment, Vecteur direction) { if (collision(segment)) { Vecteur normale=segment.normale(new Point(x+w/2, y+h/2)); direction=direction.rebond(normale); } return direction; } public final Vecteur rebondir(Rectangle rectangle, Vecteur direction) { Vecteur dir; dir=rebondir(rectangle.getNord(), direction); if (dir!=direction) { return dir; } dir=rebondir(rectangle.getSud(), direction); if (dir!=direction) { return dir; } dir=rebondir(rectangle.getOuest(), direction); if (dir!=direction) { return dir; } dir=rebondir(rectangle.getEst(), direction); if (dir!=direction) { return dir; } return direction; } }
-----