package elastiques; /** * * Modélisation du comportement physique * * @author csuros */ import java.awt.Dimension; import java.util.ArrayList; import java.awt.geom.Point2D; public class Board { /** * Instanciation d'un bord avec taille donnée * * @param width largeur * @param height hauteur */ public Board(int width, int height) { this.width = width; this.height = height; objects = new ArrayList(); connections = new ArrayList>(); } /** * Instanciation avec dimensions par défaut */ public Board(){this(600,600);} /** * Taille de ce bord * * @return taille du bord */ public Dimension getSize(){return new Dimension(width,height);} /** * largeur */ private int width; /** * hauteur */ private int height; /** * Objets sur le bord */ private ArrayList objects; /** * Élastiques: pour chaque objet, on a une liste d'élastiques * y liés. Attention: un élastique est présent sur * toutes les deux listes des objets attachés */ private ArrayList> connections; /** * Ajoute un objet * * @param b objet à placer sur le bord */ public void add(MovingObject b) { objects.add(b); connections.add(new ArrayList()); } /** * Ajoute un élastique * * @param band élastique à placer */ public void add(RubberBand band) { MovingObject lo = band.getLeft(); MovingObject ro = band.getRight(); int lidx = objects.indexOf(lo); int ridx = objects.indexOf(ro); if (lidx == -1 || ridx == -1) throw new IllegalArgumentException("The objects on the rubber band must be already added to the board."); connections.get(lidx).add(band); connections.get(ridx).add(band); } /** * Calcule les nouvelles positions des objets * * @param delta intervalle de temps */ public void computeNewPositions(double delta) { // calculer les accelerations Point2D[] A = new Point2D[objects.size()]; for (int idx=0; idx conx = connections.get(object_idx); for (int cidx=0;cidx=width-dw) { px = width-dw; vx = -Math.abs(vx); } double dh = mo.getHeight(); if (py=height-dh) { py = height-dh; vy = -Math.abs(vy); } Point2D newpos = new Point2D.Double(px,py); //System.out.println("#*B.cNP "+mo+" "+position+"\t->"+newpos); mo.setPosition(newpos ); mo.setVelocity(new Point2D.Double(vx,vy)); } /** * Trouve l'objet la plus proche à une position donnée. * * @param x coordonné x * @param y coordonné y * @return null, si aucun objet, sinon l'objet ;le plus proche à x,y */ public MovingObject closestObject(double x, double y) { MovingObject closest = null; double closest_dist = Double.POSITIVE_INFINITY; for (MovingObject o: objects) { double d = o.getPosition().distance(x,y); if (closest == null || closest_dist>d) { closest = o; closest_dist = d; } } return closest; } }