Beispiel #1
0
  /**
   * draws a disc
   *
   * @param center
   * @param v1
   * @param v2
   * @param radius
   */
  public void disc(Coords center, Coords v1, Coords v2, double radius) {
    manager.startGeometry(Manager.Type.TRIANGLE_FAN);

    int longitude = manager.getLongitudeDefault();

    Coords vn;

    float dt = (float) 1 / longitude;
    float da = (float) (2 * Math.PI * dt);

    manager.texture(0, 0);
    manager.normal(v1.crossProduct(v2));
    manager.triangleFanApex(center);

    float u = 1, v = 0;
    vn = v1.mul(u).add(v2.mul(v));
    manager.triangleFanVertex(center.add(vn.mul(radius)));

    for (int i = 1; i <= longitude; i++) {
      u = (float) Math.cos(i * da);
      v = (float) Math.sin(i * da);

      vn = v1.mul(u).add(v2.mul(v));
      manager.triangleFanVertex(center.add(vn.mul(radius)));
    }

    manager.endGeometry();
  }
Beispiel #2
0
  private void drawTNV(int ui, int vi) {

    float uT = getTextureCoord(ui, uNb, uMinFadeNb, uMaxFadeNb);
    float vT = getTextureCoord(vi, vNb, vMinFadeNb, vMaxFadeNb);
    manager.texture(uT, vT);

    float u = uMin + ui * du;
    float v = vMin + vi * dv;
    drawNV(functional2Var.evaluateNormal(u, v), functional2Var.evaluatePoint(u, v));
  }
Beispiel #3
0
  public void drawTriangle(Coords p1, Coords p2, Coords p3) {
    manager.startGeometry(Manager.Type.TRIANGLE_STRIP);

    float uT = getTextureCoord(1, uNb, uMinFadeNb, uMaxFadeNb);
    float vT = getTextureCoord(1, vNb, vMinFadeNb, vMaxFadeNb);
    manager.texture(uT, vT);

    manager.vertex(p1);
    manager.vertex(p3);
    manager.vertex(p2);
    manager.endGeometry();
  }
Beispiel #4
0
  /**
   * fill a parabola
   *
   * @param center center
   * @param v1 1st eigenvector
   * @param v2 2nd eigenvector
   * @param p eigenvalue
   * @param tMin t min
   * @param tMax t max
   */
  public void parabola(Coords center, Coords v1, Coords v2, double p, double tMin, double tMax) {

    manager.startGeometry(Manager.Type.TRIANGLE_FAN);

    manager.texture(0, 0);
    manager.normal(v1.crossProduct(v2));

    int longitude = manager.getLongitudeDefault();

    Coords m;

    float dt = (float) (tMax - tMin) / longitude;

    float u, v;
    double t;

    // first point
    t = tMin;
    u = (float) (p * t * t / 2);
    v = (float) (p * t);
    m = v1.mul(u).add(v2.mul(v));

    // center of the fan is midpoint of branch ends
    t = tMax;
    u = (float) (p * t * t / 2);
    v = (float) (p * t);
    manager.triangleFanApex(center.add((m.add(v1.mul(u).add(v2.mul(v)))).mul(0.5)));

    // first point
    manager.triangleFanVertex(center.add(m));

    for (int i = 1; i <= longitude; i++) {
      t = tMin + i * dt;
      u = (float) (p * t * t / 2);
      v = (float) (p * t);

      m = v1.mul(u).add(v2.mul(v));
      manager.triangleFanVertex(center.add(m));
    }

    manager.endGeometry();
  }
Beispiel #5
0
  /**
   * draws the inside of the hyperobola part
   *
   * @param center center
   * @param v1 1st eigenvector
   * @param v2 2nd eigenvector
   * @param a 1st eigenvalue
   * @param b 2nd eigenvalue
   * @param tMin t min
   * @param tMax t max
   */
  public void hyperbolaPart(
      Coords center, Coords v1, Coords v2, double a, double b, double tMin, double tMax) {

    manager.startGeometry(Manager.Type.TRIANGLE_FAN);

    manager.texture(0, 0);
    manager.normal(v1.crossProduct(v2));

    int longitude = manager.getLongitudeDefault();

    Coords m;

    float dt = (float) (tMax - tMin) / longitude;

    float u, v;

    // first point on the branch
    u = (float) Math.cosh(tMin);
    v = (float) Math.sinh(tMin);
    m = v1.mul(a * u).add(v2.mul(b * v));

    // center of the fan is midpoint of branch ends
    u = (float) Math.cosh(tMax);
    v = (float) Math.sinh(tMax);
    manager.triangleFanApex(center.add((m.add(v1.mul(a * u).add(v2.mul(b * v)))).mul(0.5)));

    // first point
    manager.triangleFanVertex(center.add(m));

    for (int i = 1; i <= longitude; i++) {
      u = (float) Math.cosh(tMin + i * dt);
      v = (float) Math.sinh(tMin + i * dt);

      m = v1.mul(a * u).add(v2.mul(b * v));
      manager.triangleFanVertex(center.add(m));
    }

    manager.endGeometry();
  }
  /** draws a section point */
  private void draw(PlotterBrushSection s, double u, double v, int texture) {

    GgbVector[] vectors = s.getNormalAndPosition(u, v);

    // Application.debug(vectors[0].toString());

    /*
    manager.normal(
    		(float) vectors[0].getX(),
    		(float) vectors[0].getY(),
    		(float) vectors[0].getZ());	*/
    manager.normal(vectors[0]);
    manager.texture(
        getTexture(textureX[texture], textureTypeX), getTexture(textureY[texture], textureTypeY));
    manager.vertex(vectors[1]);
    /*
    manager.vertex(
    		(float) vectors[1].getX(),
    		(float) vectors[1].getY(),
    		(float) vectors[1].getZ());
    		*/

  }
Beispiel #7
0
  public Coords cylinder(
      Coords center,
      Coords vx,
      Coords vy,
      Coords vz,
      double r1,
      double r2,
      double start,
      double extent,
      double min,
      double max,
      boolean minFading,
      boolean maxFading,
      int longitude) {
    manager.startGeometry(Manager.Type.TRIANGLE_STRIP);

    float c, s;

    float dt = (float) 1 / longitude;
    float da = (float) (extent * dt);

    center1.set(vz);
    center1.mulInside3(min);
    center1.addInside(center);

    center2.set(vz);
    center2.mulInside3(max);
    center2.addInside(center);

    boolean fading = minFading || maxFading;
    if (!fading) {
      manager.setDummyTexture();
    }

    for (int i = 0; i <= longitude; i++) {
      c = (float) Math.cos(start + i * da);
      s = (float) Math.sin(start + i * da);

      n.setAdd(tmpCoords.setMul(vx, r2 * c), tmpCoords2.setMul(vy, r1 * s));
      n.normalize();

      // point on top circle
      if (fading) {
        if (maxFading) {
          manager.texture(0, 1);
        } else {
          manager.texture(0, 0);
        }
      }

      tmpCoords3.setAdd(tmpCoords.setMul(vx, r1 * c), tmpCoords2.setMul(vy, r2 * s));

      manager.normal(n);
      manager.vertexToScale(tmpCoords.setAdd(center2, tmpCoords3));
      // point on bottom circle
      if (fading) {
        if (minFading) {
          manager.texture(0, 1);
        } else {
          manager.texture(0, 0);
        }
      }
      manager.normal(n);
      manager.vertexToScale(tmpCoords.setAdd(center1, tmpCoords3));
    }

    manager.endGeometry();

    return center2;
  }
Beispiel #8
0
  public void cone(
      Coords center,
      Coords vx,
      Coords vy,
      Coords vz,
      double r1,
      double r2,
      double start,
      double extent,
      double min,
      double max,
      boolean minFading,
      boolean maxFading) {
    manager.startGeometry(Manager.Type.TRIANGLE_STRIP);

    int longitude = manager.getLongitudeDefault();

    float u, v;

    float dt = (float) 1 / longitude;
    float da = (float) (extent * dt);

    center1.set(vz);
    center1.mulInside3(min);
    center1.addInside(center);

    center2.set(vz);
    center2.mulInside3(max);
    center2.addInside(center);

    double rmin = r1 * min;
    double rmax = r1 * max;
    double ratio = r2 / r1;

    // ensure radius are positive and normals go outside
    int sgn = 1;
    if (max > 0) {
      sgn = -1;
    } else {
      rmin *= -1;
      rmax *= -1;
    }

    double rr = r1 * r2 * sgn;

    boolean fading = minFading || maxFading;
    if (!fading) {
      manager.setDummyTexture();
    }

    for (int i = 0; i <= longitude; i++) {
      u = (float) Math.cos(start + i * da);
      v = (float) Math.sin(start + i * da);

      m.setAdd(tmpCoords2.setMul(vx, u), tmpCoords3.setMul(vy, v * ratio));

      n.setMul(vx, r2 * u);
      tmpCoords.setMul(vy, r1 * v);
      n.addInside(tmpCoords);
      tmpCoords.setMul(vz, rr);
      n.addInside(tmpCoords);
      n.normalize();

      // point on top circle
      if (fading) {
        if (maxFading) {
          manager.texture(0, 1);
        } else {
          manager.texture(0, 0);
        }
      }
      manager.normal(n);
      manager.vertexToScale(tmpCoords2.setAdd(center2, tmpCoords3.setMul(m, rmax)));

      // point on bottom circle
      if (fading) {
        if (minFading) {
          manager.texture(0, 1);
        } else {
          manager.texture(0, 0);
        }
      }
      manager.normal(n);
      manager.vertexToScale(tmpCoords2.setAdd(center1, tmpCoords3.setMul(m, rmin)));
    }

    manager.endGeometry();
  }
Beispiel #9
0
  /**
   * @param center
   * @param vx
   * @param vy
   * @param vz
   * @param r1
   * @param r2
   * @param start
   * @param extent
   * @param height
   * @param fading
   * @return center of the bottom
   */
  public Coords cone(
      Coords center,
      Coords vx,
      Coords vy,
      Coords vz,
      double r1,
      double r2,
      double start,
      double extent,
      double height,
      float fading) {
    manager.startGeometry(Manager.Type.TRIANGLE_STRIP);

    int longitude = manager.getLongitudeDefault();

    double u, v;

    float dt = (float) 1 / longitude;
    float da = (float) (extent * dt);
    // if (height > 0){ // ensure correct back/front face culling
    // da *= -1;
    // }

    if (fading == 1) { // no fading
      manager.setDummyTexture();
    }

    center2.set(vz);
    center2.mulInside3(height);
    center2.addInside(center);

    double r1h = r1 * -height;
    double r2h = r2 * -height;
    double rr = r1 * r2;

    for (int i = 0; i <= longitude; i++) {
      u = Math.cos(start + i * da);
      v = Math.sin(start + i * da);

      m.setAdd(tmpCoords2.setMul(vx, u * r1h), tmpCoords3.setMul(vy, v * r2h));

      n.setMul(vx, r2 * u);
      tmpCoords.setMul(vy, r1 * v);
      n.addInside(tmpCoords);
      tmpCoords.setMul(vz, rr);
      n.addInside(tmpCoords);
      n.normalize();

      // center of the triangle fan
      if (fading < 1) {
        manager.texture(0, fading);
      }
      manager.normal(n);
      manager.vertexToScale(center);

      // point on circle
      if (fading < 1) {
        manager.texture(0, 1);
      }
      manager.normal(n);
      manager.vertexToScale(tmpCoords2.setAdd(center2, m));
    }

    manager.endGeometry();

    return center2;
  }