@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(); } } }