package linea; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; public class Ligne extends ObjetGraphique{ private int nbSegments = 400; private double xCercle = 400; private Segment SegCourant; // liste des segments private ArrayList segments = new ArrayList(); public Ligne(){ double x = 800; double y = 300; double dx,dy; Segment s; for (int i=0; i le cercle est "sur la ligne" public boolean estSurLaLigne(double cx) { for (Segment seg : segments) { double x1 = seg.x; double x2 = seg.x + seg.xLong; if ((cx >= Math.min(x1, x2)) && (cx <= Math.max(x1, x2))) { return true; } } return false; } // Vérifie la collision entre la ligne (segments) et un cercle public boolean collisionAvec(Cercle c) { double cx = c.getX(); double cy = c.getY(); double rayon = c.getRayon(); for (Segment seg : segments) { double x1 = seg.x; double y1 = seg.y; double x2 = seg.x + seg.xLong; double y2 = seg.y + seg.yLong; double dist = pointSegmentDistance(cx, cy, x1, y1, x2, y2); if (dist <= rayon) { return true; } } return false; } // distance minimale entre un point (px,py) et un segment (x1,y1)-(x2,y2) private double pointSegmentDistance(double px, double py, double x1, double y1, double x2, double y2) { double vx = x2 - x1; double vy = y2 - y1; double wx = px - x1; double wy = py - y1; double c = vx*vx + vy*vy; if (c == 0) { return Math.hypot(px - x1, py - y1); } double t = (vx*wx + vy*wy) / c; if (t < 0) t = 0; else if (t > 1) t = 1; double projx = x1 + t * vx; double projy = y1 + t * vy; return Math.hypot(px - projx, py - projy); } }