public class Chord extends LineElement {

  PointElement D,E;	// find chord where line DE intersects circle C
  CircleElement C;

  Chord (PointElement Dval, PointElement Eval, CircleElement Cval) {
    dimension = 1;
    A = new PointElement();  B = new PointElement();
    C = Cval;  D = Dval;  E = Eval;
  }

  Chord (LineElement DE, CircleElement Cval) {
    dimension = 1;
    A = new PointElement();  B = new PointElement();
    C = Cval;  D = DE.A;  E = DE.B;
  }

  protected void translate (double dx, double dy) {
    A.translate(dx,dy);
    B.translate(dx,dy);
  }

  protected void rotate (PointElement pivot, double ac, double as) {
    A.rotate(pivot,ac,as);
    B.rotate(pivot,ac,as);
  }

  protected void update() {
    B.toFoot(C.Center,D,E);
    double d2 = C.Center.distance2(B);
    double r2 = C.radius2();
    if (d2 > r2) {
      A.x = A.y = B.x = B.y = 0.0/0.0;
      return;
    }
    double s = Math.sqrt(r2 - d2);
    double factor = s/D.distance(B);
    if (factor < 1e10) {
      A.x = B.x + factor*(D.x-B.x);
      A.y = B.y + factor*(D.y-B.y);
      B.x = 2.0*B.x - A.x;
      B.y = 2.0*B.y - A.y;
    } else {
      factor = s/E.distance(B);
      A.x = B.x - factor*(E.x-B.x);
      A.y = B.y - factor*(E.y-B.y);
      B.x = 2.0*B.x - A.x;
      B.y = 2.0*B.y - A.y;
} } }

