/* * __ .__ .__ ._____. * _/ |_ _______ __|__| ____ | | |__\_ |__ ______ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \ * |__| \____/__/\_ \__|\___ >____/__||___ /____ > * \/ \/ \/ \/ * * Copyright (c) 2006-2011 Karsten Schmidt * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * http://creativecommons.org/licenses/LGPL/2.1/ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ package spimedb.util.geom; /** * A geometric definition of a cone (and cylinder as a special case) with * support for mesh creation/representation. The class is currently still * incomplete in that it doesn't provide any other features than the * construction of a cone shaped mesh. */ public class Cone extends Vec3D { public Vec3D dir; public float radiusSouth; public float radiusNorth; public float length; /** * Constructs a new cone instance. * * @param pos * centre position * @param dir * direction * @param rNorth * radius on the side in the forward direction * @param rSouth * radius on the side in the opposite direction * @param len * length of the cone */ public Cone(roVec3D pos, roVec3D dir, float rNorth, float rSouth, float len) { super(pos); this.dir = dir.getNormalized(); this.radiusNorth = rNorth; this.radiusSouth = rSouth; this.length = len; } // public Mesh3D toMesh(int steps) { // return toMesh(steps, 0); // } // // public Mesh3D toMesh(int steps, float thetaOffset) { // return toMesh(null, steps, thetaOffset, true, true); // } // // public Mesh3D toMesh(Mesh3D mesh, int steps, float thetaOffset, // boolean topClosed, boolean bottomClosed) { // roVec3D c = this.add(0.01f, 0.01f, 0.01f); // roVec3D n = c.cross(dir.getNormalized()).normalize(); // Vec3D halfAxis = dir.scale(length * 0.5f); // Vec3D p = sub(halfAxis); // Vec3D q = add(halfAxis); // Vec3D[] south = new Vec3D[steps]; // Vec3D[] north = new Vec3D[steps]; // float phi = MathUtils.TWO_PI / steps; // for (int i = 0; i < steps; i++) { // float theta = i * phi + thetaOffset; // XYZ nr = n.getRotatedAroundAxis(dir, theta); // south[i] = nr.scale(radiusSouth).addSelf(p); // north[i] = nr.scale(radiusNorth).addSelf(q); // } // int numV = steps * 2 + 2; // int numF = steps * 2 + (topClosed ? steps : 0) // + (bottomClosed ? steps : 0); // if (mesh == null) { // mesh = new TriangleMesh("cone", numV, numF); // } // for (int i = 0, j = 1; i < steps; i++, j++) { // if (j == steps) { // j = 0; // } // mesh.addFace(south[i], north[i], south[j], null, null, null, null); // mesh.addFace(south[j], north[i], north[j], null, null, null, null); // if (bottomClosed) { // mesh.addFace(p, south[i], south[j], null, null, null, null); // } // if (topClosed) { // mesh.addFace(north[i], q, north[j], null, null, null, null); // } // } // return mesh; // } }