WallSeg.java
import java.awt.*; import java.awt.geom.*; public class WallSeg { Ball pt0, pt1; Color color; String str; double kx, ky, scl; double q; WallSeg() { pt0 = new Ball(250, 200); pt1 = new Ball(150, 50); color = Color.black; setup(); } WallSeg(Ball pt1, Ball pt2) { this.pt0 = pt1; this.pt1 = pt2; color = Color.BLACK; setup(); } public void setup() { kx = pt1.px-pt0.px; ky = pt1.py-pt0.py; scl = Math.hypot(kx,ky); kx = kx/scl; ky = ky/scl; } public void draw(Graphics g) { Graphics2D g2 = (Graphics2D) g; BasicStroke s = new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); Stroke old_stroke = g2.getStroke(); g2.setStroke(s); g2.setColor(color); g2.draw(new Line2D.Double(pt0.px, pt0.py, pt1.px, pt1.py)); g2.setStroke(old_stroke); g2.setColor(Color.BLACK); } public double dist(Ball ball) { double px = ball.px - pt0.px; double py = ball.py - pt0.py; double dist, radius; radius = ball.radius; // distance to line dist = (kx*py - ky*px); // distance along line q = (px*kx+py*ky); if (q>0 && q<scl) { return Math.abs(dist)-radius; } else if (q<=0) return pt0.dist(ball); else return pt1.dist(ball); } public double intersect(Ball ball) { double px = ball.px - pt0.px; double py = ball.py - pt0.py; double dist, radius, q; radius = ball.radius; double tx = 1000.0; // distance to line dist = (kx*py - ky*px); q = (px*kx+py*ky)/scl; str = String.format("dist %6.2f q %4.2f",dist,q); if (q>0 && q<1) { if (Math.abs(dist)<radius) { System.out.format("seg violation, dist = %.2f%n",dist); System.out.println(ball); System.exit(-1); } } // calculate time to intersection double t; double vperp = kx*ball.vy - ky*ball.vx; if (dist<0) { if (vperp<=0) t=-1.0; else t = -(radius+dist)/vperp; } else { if (vperp>=0) t=-1.0; else t = (radius-dist)/vperp; } str += String.format(" t %6.2f",t); // calculate q at intersection double qx, qy; qx = px + ball.vx*t; qy = py + ball.vy*t; q = (qx*kx+qy*ky)/scl; if (q<0 || q>1) return -1.0; else return t; } }
Maintained by John Loomis, updated Sun Jul 13 19:27:06 2014