WallSeg.java


WallSeg.java


public class WallSeg
{
   static int count = 0;
   Ball pt0, pt1;
   String name, str;
   double kx, ky, scl;
   double q;
   WallSeg() {
      pt0 = new Ball(250, 200);
      pt1 = new Ball(150, 50);
      setup();
   }
   WallSeg(Ball pt1, Ball pt2) {
     this.pt0 = pt1;
     this.pt1 = pt2;
     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;
      count++;
      name = "wall "+count;
   }

   public String toString() {
	return name;
   }

   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;
	if (q>0 && q<1) {
 	   if (Math.abs(dist)<radius) {
		str = String.format("seg violation, dist = %.2f ",dist) + this + "  " + ball;
		return -2.0;
           }
        }
	// 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;
	}
	if (t<0.0) return -1.0;
	// 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 Sat Mar 03 12:46:22 2018