예제 #1
0
  @Override
  public synchronized void drawObject(GL2 gl) {
    if (state == ObjectState.notCounted) {
      int pointsCount = points.size(); // pocet bodu
      if (pointsCount > getDegree()) // existuje pouze když stupeň křivky je menší než počet bodů
      {
        setState(ObjectState.OK);
        setStateMessage(null);
      } else // nedostatek bodů
      {
        setStateMessage(
            "Nedostatek bodů pro vykreslení. Přidejte bodů: " + (degree - pointsCount + 1));
        setState(ObjectState.inputError);
      }
    }

    // vykresleni
    if (getState() == ObjectState.OK) {
      // nastavení vlastností čáry
      gl.glLineWidth(lineWidth);
      gl.glColor3fv(color.getColorComponents(null), 0);

      // určení počtu kroků
      int loopSteps = getSteps();
      if (loopSteps == 0) {
        loopSteps = 20 * points.size();
        loopSteps = loopSteps > MAX_STEPS ? MAX_STEPS : loopSteps;
        // steps = (int)scale*40*points.size();
      }

      /*
       * Výpočet pomocí grafické karty
       */
      /*if (useHWAcceleration)
      {
      //body uložím do obyčejného pole
      float[] pointArray = new float[points.size() * 4];
      int i = 0;
      for (IPoint3f p : points)
      {
      pointArray[i] = p.getX();
      pointArray[i + 1] = p.getY();
      pointArray[i + 2] = p.getZ();
      pointArray[i + 3] = ((IPoint4f) p).getW();
      i += 4;
      }
      //uložím knot do pole
      float[] knotArray = new float[knot.size()];
      i = 0;
      for (Float p : knot)
      {
      knotArray[i] = p.floatValue();
      i++;
      }

      //vlastní vykreslení
      try
      {
      GLU glu=new GLU();
      GLUnurbs nurbs = glu.gluNewNurbsRenderer();
      //glu.gluNurbsProperty(nurbs,glu.GLU_U_STEP,steps);//nepodporavane v JOGLu
      glu.gluBeginCurve(nurbs);
      glu.gluNurbsCurve(nurbs,
      knotArray.length, knotArray,
      4,
      pointArray,
      getDegree()+1,
      gl.GL_MAP1_VERTEX_4);
      glu.gluEndCurve(nurbs);
      } catch (GLException ex)
      {
      setUseHWAcceleration(false);//zakažu HW akceleraci
      }
      }*/
      /*
       * Výpočet pomocí CPU
       */
      if (!useHWAcceleration) {
        double step = 1. / (double) loopSteps;

        // uložím knot do pole+transformace do intervalu <0,1>
        float[] knotArray = knot.getTransformedValues();

        double sumx1, sumy1, sumz1;
        double sumx2, sumy2, sumz2;
        int k = getDegree() + 1;
        int n = points.size() - 1;
        int i;
        double[] N = new double[points.size()];
        IPoint4f p;

        gl.glBegin(gl.GL_LINE_STRIP);
        for (double t = knotArray[getDegree()] - step, tMax = knotArray[knotArray.length - k];
            t < tMax; ) {
          t += step;
          if (t > tMax) {
            t = tMax;
          }

          for (i = 0; i <= n; i++) {
            N[i] = MathUtils.bsplineBaseFunction(i, k, t, knotArray);
          }

          sumx1 = sumy1 = sumz1 = sumx2 = sumy2 = sumz2 = 0;
          for (i = 0; i <= n; i++) {
            p = (IPoint4f) points.get(i);
            sumx1 += p.getW() * p.getX() * N[i];
            sumy1 += p.getW() * p.getY() * N[i];
            sumz1 += p.getW() * p.getZ() * N[i];
            sumx2 += p.getW() * N[i];
            sumy2 += p.getW() * N[i];
            sumz2 += p.getW() * N[i];
          }
          gl.glVertex3d(sumx1 / sumx2, sumy1 / sumy2, sumz1 / sumz2);
        }
        gl.glEnd();
      }
    }
  }