summaryrefslogtreecommitdiffstats
path: root/src/gleem/BSphere.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/gleem/BSphere.java')
-rw-r--r--src/gleem/BSphere.java166
1 files changed, 0 insertions, 166 deletions
diff --git a/src/gleem/BSphere.java b/src/gleem/BSphere.java
deleted file mode 100644
index c628bc9..0000000
--- a/src/gleem/BSphere.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * gleem -- OpenGL Extremely Easy-To-Use Manipulators.
- * Copyright (C) 1998-2003 Kenneth B. Russell ([email protected])
- *
- * Copying, distribution and use of this software in source and binary
- * forms, with or without modification, is permitted provided that the
- * following conditions are met:
- *
- * Distributions of source code must reproduce the copyright notice,
- * this list of conditions and the following disclaimer in the source
- * code header files; and Distributions of binary code must reproduce
- * the copyright notice, this list of conditions and the following
- * disclaimer in the documentation, Read me file, license file and/or
- * other materials provided with the software distribution.
- *
- * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright
- * holder may not be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY
- * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF
- * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE
- * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE
- * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST
- * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT
- * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION,
- * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT
- * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED
- * WARRANTY OF FITNESS FOR SUCH USES.
- */
-
-package gleem;
-
-import gleem.linalg.*;
-
-/** Represents a bounding sphere. */
-
-public class BSphere {
- private Vec3f center = new Vec3f();
- private float radius;
- private float radSq;
-
- /** Default constructor creates a sphere with center (0, 0, 0) and
- radius 0 */
- public BSphere() {
- makeEmpty();
- }
-
- public BSphere(Vec3f center, float radius) {
- set(center, radius);
- }
-
- /** Re-initialize this sphere to center (0, 0, 0) and radius 0 */
- public void makeEmpty() {
- center.set(0, 0, 0);
- radius = radSq = 0;
- }
-
- public void setCenter(Vec3f center) { this.center.set(center); }
- public Vec3f getCenter() { return center; }
-
- public void setRadius(float radius) { this.radius = radius;
- radSq = radius * radius; }
- public float getRadius() { return radius; }
-
- public void set(Vec3f center, float radius) {
- setCenter(center); setRadius(radius);
- }
- /** Returns radius and mutates passed "center" vector */
- float get(Vec3f center) {
- center.set(this.center); return radius;
- }
-
- /** Mutate this sphere to encompass both itself and the argument.
- Ignores zero-size arguments. */
- public void extendBy(BSphere arg) {
- if ((radius == 0.0f) || (arg.radius == 0.0f))
- return;
- // FIXME: This algorithm is a quick hack -- minimum bounding
- // sphere of a set of other spheres is a well studied problem, but
- // not by me
- Vec3f diff = arg.center.minus(center);
- if (diff.lengthSquared() == 0.0f) {
- setRadius(Math.max(radius, arg.radius));
- return;
- }
- IntersectionPoint[] intPt = new IntersectionPoint[4];
- for (int i = 0; i < intPt.length; i++) {
- intPt[i] = new IntersectionPoint();
- }
- int numIntersections;
- numIntersections = intersectRay(center, diff, intPt[0], intPt[1]);
- assert numIntersections == 2;
- numIntersections = intersectRay(center, diff, intPt[2], intPt[3]);
- assert numIntersections == 2;
- IntersectionPoint minIntPt = intPt[0];
- IntersectionPoint maxIntPt = intPt[0];
- // Find minimum and maximum t values, take associated intersection
- // points, find midpoint and half length of line segment -->
- // center and radius.
- for (int i = 0; i < 4; i++) {
- if (intPt[i].getT() < minIntPt.getT()) {
- minIntPt = intPt[i];
- } else if (intPt[i].getT() > maxIntPt.getT()) {
- maxIntPt = intPt[i];
- }
- }
- // Compute the average -- this is the new center
- center.add(minIntPt.getIntersectionPoint(),
- maxIntPt.getIntersectionPoint());
- center.scale(0.5f);
- // Compute half the length -- this is the radius
- setRadius(
- 0.5f *
- minIntPt.getIntersectionPoint().
- minus(maxIntPt.getIntersectionPoint()).
- length()
- );
- }
-
- /** Intersect a ray with the sphere. This is a one-sided ray
- cast. Mutates one or both of intPt0 and intPt1. Returns number
- of intersections which occurred. */
- int intersectRay(Vec3f rayStart,
- Vec3f rayDirection,
- IntersectionPoint intPt0,
- IntersectionPoint intPt1) {
- // Solve quadratic equation
- float a = rayDirection.lengthSquared();
- if (a == 0.0)
- return 0;
- float b = 2.0f * (rayStart.dot(rayDirection) - rayDirection.dot(center));
- Vec3f tempDiff = center.minus(rayStart);
- float c = tempDiff.lengthSquared() - radSq;
- float disc = b * b - 4 * a * c;
- if (disc < 0.0f)
- return 0;
- int numIntersections;
- if (disc == 0.0f)
- numIntersections = 1;
- else
- numIntersections = 2;
- intPt0.setT((0.5f * (-1.0f * b + (float) Math.sqrt(disc))) / a);
- if (numIntersections == 2)
- intPt1.setT((0.5f * (-1.0f * b - (float) Math.sqrt(disc))) / a);
- Vec3f tmp = new Vec3f(rayDirection);
- tmp.scale(intPt0.getT());
- tmp.add(tmp, rayStart);
- intPt0.setIntersectionPoint(tmp);
- if (numIntersections == 2) {
- tmp.set(rayDirection);
- tmp.scale(intPt1.getT());
- tmp.add(tmp, rayStart);
- intPt1.setIntersectionPoint(tmp);
- }
- return numIntersections;
- }
-}