public class InvertCircle extends CircleElement {

  CircleElement C, D;		// Invert C in D to get this

  InvertCircle (CircleElement Cval, CircleElement Dval) {
    dimension = 2;
    Center = new PointElement();
    A = Center;  B = new PointElement();
    C = Cval;    D = Dval;
  }

  protected void update() {
    double d2 = C.Center.distance2(D.Center);
    double r2 = C.radius2();
    double e = D.radius2()/(d2-r2);
    Center.x = D.Center.x + e*(C.Center.x-D.Center.x);
    Center.y = D.Center.y + e*(C.Center.y-D.Center.y);
    B.x = Center.x + e*Math.sqrt(r2);
    B.y = Center.y;
  }

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

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