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