WallSeg.java
import java.awt.*; public class WallSeg { Ball pt0, pt1; Color color; String str; double kx, ky, scl; 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) { g.setColor(color); g.drawLine((int)pt0.px,(int)pt0.py,(int)pt1.px,(int)pt1.py); } public double intersect(Ball ball, double tstep) { // distance to pt0 double px = ball.px - pt0.px; double py = ball.py - pt0.py; double dist, radius, q; double d[] = new double[3]; radius = ball.radius; d[0] = Math.hypot(px,py); // distance to pt1 double qx = ball.px - pt1.px; double qy = ball.py - pt1.py; d[1] = Math.hypot(qx,qy); // distance to line d[2] = (kx*py - ky*px); q = (px*kx+py*ky)/scl; if (d[2]<0) { d[0] = -d[0]; d[1] = -d[1]; } if (q>1) dist = d[1]; else if (q<0) dist = d[0]; else dist = d[2]; str = String.format("dist %6.1f q %6.1f",dist/radius,q); // calculate time to intersection double t; if (q>0 && q<1) { double vperp = kx*ball.vy - ky*ball.vx; t = (radius-dist)/vperp; if (dist<0) t = -(radius+dist)/vperp; str = str + String.format(" t %6.2f",t); } else t = -1; if (Math.abs(dist)<=radius) ball.color = Color.RED; else ball.color = Color.YELLOW; ball.t = t-1; return t; } }
Maintained by John Loomis, updated Wed Nov 13 22:43:10 2013