public AlgoQuadricLimitedPointPointRadius(
      Construction c,
      String[] labels,
      GeoPointND origin,
      GeoPointND secondPoint,
      NumberValue r,
      int type) {
    super(c);

    this.origin = origin;
    this.secondPoint = secondPoint;
    this.radius = r;

    quadric = new GeoQuadric3DLimited(c); // ,origin,secondPoint);
    quadric.setType(type);

    input = new GeoElement[] {(GeoElement) origin, (GeoElement) secondPoint, (GeoElement) r};

    ((GeoElement) origin).addAlgorithm(this);
    ((GeoElement) secondPoint).addAlgorithm(this);
    ((GeoElement) r).addAlgorithm(this);

    // parent of output
    quadric.setParentAlgorithm(this);
    cons.addToAlgorithmList(this);

    setQuadric();

    algoSide = new AlgoQuadricSide(cons, quadric, true, null);
    cons.removeFromConstructionList(algoSide);
    side = (GeoQuadric3DPart) algoSide.getQuadric();
    side.setParentAlgorithm(this);
    quadric.setSide(side);

    algoEnds = createEnds();
    bottom.setParentAlgorithm(this);
    top.setParentAlgorithm(this);
    quadric.setBottomTop(bottom, top);

    // output = new GeoElement[] {quadric,bottom,top,side};
    setOutput();

    quadric.initLabelsIncludingBottom(labels);
    quadric.updatePartsVisualStyle();

    // force update for side
    update();
  }
 private final void computeHelpers() {
   // side must be done before ends (for midpoint)
   algoSide.compute();
   algoEnds.compute();
 }