private boolean setQuadric() {
    // check end points
    if (!((GeoElement) origin).isDefined()
        || origin.isInfinite()
        || !((GeoElement) secondPoint).isDefined()
        || secondPoint.isInfinite()
        || !radius.isDefined()) {
      getQuadric().setUndefined();
      return false;
    }

    Coords o = origin.getInhomCoordsInD3();
    Coords o2 = secondPoint.getInhomCoordsInD3();
    Coords d = o2.sub(o);

    if (d.equalsForKernel(0, Kernel.STANDARD_PRECISION)) {
      getQuadric().setUndefined();
      return false;
    }

    double r = radius.getDouble();

    d.calcNorm();
    double altitude = d.getNorm();

    quadric.setDefined();

    setQuadric(o, o2, d.mul(1 / altitude), r, 0, altitude);

    return true;
  }
 @Override
 public void compute() {
   // cover undefined cases
   if (!degree.isDefined() || !min.isDefined() || !max.isDefined() || degree.getDouble() < 0) {
     polynomial.setUndefined();
     return;
   }
   int lower = (int) Math.ceil(min.getDouble());
   int upper = (int) Math.floor(max.getDouble());
   if (lower > upper || (lower == 0 && upper == 0)) {
     polynomial.setUndefined();
     return;
   }
   // input is sane, we can do the computation
   int deg = (int) Math.floor(degree.getDouble());
   ExpressionNode varExpr = new ExpressionNode(kernel, fv);
   ExpressionNode newExpr = randomCoef(deg != 0);
   for (int i = 1; i <= deg; i++) {
     newExpr = varExpr.power(new MyDouble(kernel, i)).multiply(randomCoef(i != deg)).plus(newExpr);
   }
   f.setExpression(newExpr, fv);
   polynomial.setFunction(f);
 }