예제 #1
0
 public Geo3DVec get3DVec() {
   return new Geo3DVec(
       kernel,
       ((NumberValue) x.evaluate()).getDouble(),
       ((NumberValue) y.evaluate()).getDouble(),
       ((NumberValue) z.evaluate()).getDouble());
 }
예제 #2
0
 /** returns all GeoElement objects in the both coordinate subtrees */
 public HashSet getVariables() {
   HashSet temp, varset = x.getVariables();
   if (varset == null) varset = new HashSet();
   temp = y.getVariables();
   if (temp != null) varset.addAll(temp);
   temp = z.getVariables();
   if (temp != null) varset.addAll(temp);
   return varset;
 }
예제 #3
0
  public final String toString() {
    StringBuilder sb = new StringBuilder();

    sb.append('(');
    sb.append(x.toString());
    sb.append(", ");
    sb.append(y.toString());
    sb.append(", ");
    sb.append(z.toString());
    sb.append(')');
    return sb.toString();
  }
예제 #4
0
  /** Returns the given expression as a string in Maxima syntax. */
  private String doToMaximaString(ExpressionValue ev, boolean substituteVariables) {
    String MathPiperString;

    if (!ev.isExpressionNode()) {
      ev = new ExpressionNode(casParser.getKernel(), ev);
    }

    MathPiperString =
        ((ExpressionNode) ev).getCASstring(ExpressionNode.STRING_TYPE_MAXIMA, !substituteVariables);

    return MathPiperString;
  }
  // evaluate the current value of the arithmetic tree
  protected final void compute() {
    // get resulting list of ExpressionNodes
    ExpressionValue evlist = root.evaluate();
    MyList myList = (evlist instanceof MyList) ? (MyList) evlist : ((GeoList) evlist).getMyList();

    int evalListSize = myList.size();
    int cachedListSize = list.getCacheSize();

    list.clear();
    for (int i = 0; i < evalListSize; i++) {
      ExpressionValue element = myList.getListElement(i).evaluate();
      GeoElement geo = null;

      // number result
      if (element.isNumberValue()) {
        double val = ((NumberValue) element).getDouble();

        // try to use cached element of same type
        if (i < cachedListSize) {
          GeoElement cachedGeo = list.getCached(i);

          // the cached element is a number: set value
          if (cachedGeo.isGeoNumeric()) {
            ((GeoNumeric) cachedGeo).setValue(val);
            geo = cachedGeo;
          }
        }

        // no cached number: create new one
        if (geo == null) {
          geo = new GeoNumeric(cons, val);
        }

        // add number to list
        list.add(geo);
      }

      // point
      else if (element.isVectorValue()) {
        GeoVec2D vec = ((VectorValue) element).getVector();

        // try to use cached element of same type
        if (i < cachedListSize) {
          GeoElement cachedGeo = list.getCached(i);

          // the cached element is a point: set value
          if (cachedGeo.isGeoPoint()) {
            ((GeoPoint) cachedGeo).setCoords(vec);
            geo = cachedGeo;
          }
        }

        // no cached point: create new one
        if (geo == null) {
          GeoPoint point = new GeoPoint(cons);
          point.setCoords(vec);
          geo = point;
        }

        // add point to list
        list.add(geo);
      }

      // needed for matrix multiplication
      // eg {{1,3,5},{2,4,6}}*{{11,14},{12,15},{13,a}}
      else if (element instanceof MyList) {
        MyList myList2 = (MyList) element;
        GeoList list2 = new GeoList(cons);
        list2.clear();

        /* removed Michael Borcherds 20080602
         * bug: 9PointCubic.ggb (matrix multiplication)
        // try to use cached element of  type GeoList
        GeoList list2 = null;
        if (i < cachedListSize) {
        	GeoElement cachedGeo = list.getCached(i);

        	// the cached element is a number: set value
        	if (cachedGeo.isGeoList()) {
        		list2 = (GeoList) cachedGeo;
        	}
        }

        if (list2 == null) {
        	list2 = new GeoList(cons);
        } */

        for (int j = 0; j < myList2.size(); j++) {
          ExpressionValue en = myList2.getListElement(j);
          ExpressionValue ev = en.evaluate();

          if (ev instanceof MyDouble) {
            GeoNumeric geo2 = new GeoNumeric(cons);
            geo2.setValue(((NumberValue) ev).getDouble());
            list2.add(geo2);
          }
        }

        list.add(list2);
      } else if (element instanceof MyStringBuffer) {
        MyStringBuffer str = (MyStringBuffer) element;
        // try to use cached element of same type
        if (i < cachedListSize) {
          GeoElement cachedGeo = list.getCached(i);

          // the cached element is a point: set value
          if (cachedGeo.isGeoText()) {
            ((GeoText) cachedGeo).setTextString(str.toValueString());
            geo = cachedGeo;
          }
        }

        // no cached point: create new one
        if (geo == null) {
          GeoText text = new GeoText(cons);
          text.setTextString(str.toValueString());
          geo = text;
        }

        // add point to list
        list.add(geo);
      } else if (element instanceof MyBoolean) {
        MyBoolean bool = (MyBoolean) element;
        // try to use cached element of same type
        if (i < cachedListSize) {
          GeoElement cachedGeo = list.getCached(i);

          // the cached element is a point: set value
          if (cachedGeo.isGeoBoolean()) {
            ((GeoBoolean) cachedGeo).setValue(bool.getBoolean());
            geo = cachedGeo;
          }
        }

        // no cached point: create new one
        if (geo == null) {
          GeoBoolean geoBool = new GeoBoolean(cons);
          geoBool.setValue(bool.getBoolean());
          geo = geoBool;
        }

        // add point to list
        list.add(geo);
      } else if (element instanceof GeoFunction) {
        GeoFunction fun = (GeoFunction) element;
        if (i < cachedListSize) {
          GeoElement cachedGeo = list.getCached(i);

          // the cached element is a point: set value
          if (cachedGeo.isGeoFunction()) {
            ((GeoFunction) cachedGeo).set(fun);
            geo = cachedGeo;
          }
        }

        // no cached point: create new one
        if (geo == null) {
          GeoFunction geoFun = new GeoFunction(cons);
          geoFun.set(fun);
          geo = geoFun;
        }
        list.add(geo);

      } else {
        Application.debug("unsupported list addition: " + element.getClass() + "");
      }
    }
  }
예제 #6
0
  public final double[] getCoords() {
    // check if both ExpressionNodes represent NumberValues
    ExpressionValue evx = x.evaluate();
    if (!evx.isNumberValue()) {
      String[] str = {"NumberExpected", evx.toString()};
      throw new MyParseError(kernel.getApplication(), str);
    }
    ExpressionValue evy = y.evaluate();
    if (!evy.isNumberValue()) {
      String[] str = {"NumberExpected", evy.toString()};
      throw new MyParseError(kernel.getApplication(), str);
    }
    ExpressionValue evz = z.evaluate();
    if (!evz.isNumberValue()) {
      String[] str = {"NumberExpected", evz.toString()};
      throw new MyParseError(kernel.getApplication(), str);
    }

    double[] ret = {
      ((NumberValue) evx).getDouble(),
      ((NumberValue) evy).getDouble(),
      ((NumberValue) evz).getDouble()
    };
    return ret;
  }
예제 #7
0
 public void resolveVariables() {
   x.resolveVariables();
   y.resolveVariables();
   z.resolveVariables();
 }
예제 #8
0
 public ExpressionValue deepCopy(Kernel kernel) {
   return new MyVec3DNode(kernel, x.deepCopy(kernel), y.deepCopy(kernel), z.deepCopy(kernel));
 }
예제 #9
0
 public boolean isConstant() {
   return x.isConstant() && y.isConstant() && z.isConstant();
 }