001: /*
002: * $RCSfile: PickCylinder.java,v $
003: *
004: * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
006: *
007: * This code is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License version 2 only, as
009: * published by the Free Software Foundation. Sun designates this
010: * particular file as subject to the "Classpath" exception as provided
011: * by Sun in the LICENSE file that accompanied this code.
012: *
013: * This code is distributed in the hope that it will be useful, but WITHOUT
014: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: * version 2 for more details (a copy is included in the LICENSE file that
017: * accompanied this code).
018: *
019: * You should have received a copy of the GNU General Public License version
020: * 2 along with this work; if not, write to the Free Software Foundation,
021: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
022: *
023: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
024: * CA 95054 USA or visit www.sun.com if you need additional information or
025: * have any questions.
026: *
027: * $Revision: 1.6 $
028: * $Date: 2008/02/28 20:17:27 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: import javax.vecmath.*;
035:
036: /**
037: * PickCylinder is the abstract base class of all cylindrical pick shapes.
038: *
039: * @since Java 3D 1.2
040: */
041: public abstract class PickCylinder extends PickShape {
042:
043: Point3d origin;
044: Vector3d direction;
045: double radius;
046:
047: /**
048: * Constructs an empty PickCylinder.
049: * The origin of the cylinder is
050: * initialized to (0,0,0). The radius is initialized
051: * to 0.
052: */
053: public PickCylinder() {
054: origin = new Point3d();
055: direction = new Vector3d();
056: radius = 0.0;
057: }
058:
059: /**
060: * Gets the origin point of this cylinder object.
061: * @param origin the Point3d object into which the origin
062: * point will be copied
063: */
064: public void getOrigin(Point3d origin) {
065: origin.set(this .origin);
066: }
067:
068: /**
069: * Gets the radius of this cylinder object
070: * @return the radius in radians
071: */
072: public double getRadius() {
073: return radius;
074: }
075:
076: /**
077: * Gets the direction of this cylinder.
078: * @param direction the Vector3d object into which the direction
079: * will be copied
080: */
081: public void getDirection(Vector3d direction) {
082: direction.set(this .direction);
083: }
084:
085: /**
086: * Return true if shape intersect with bounds.
087: * The point of intersection is stored in pickPos.
088: */
089: abstract boolean intersect(Bounds bounds, Point4d pickPos);
090:
091: // This is a duplicate of the same method, declared private inside of
092: // BoundingPolytope
093: // XXXX: remove this once the original method is available (public) in
094: // BoundingPolytope
095: static boolean pointInPolytope(BoundingPolytope ptope, double x,
096: double y, double z) {
097: Vector4d p;
098: int i = ptope.planes.length - 1;
099:
100: while (i >= 0) {
101: p = ptope.planes[i--];
102: if ((x * p.x + y * p.y + z * p.z + p.w) > Bounds.EPSILON) {
103: return false;
104: }
105: }
106: return true;
107: }
108:
109: Point3d getStartPoint() {
110: return origin;
111: }
112:
113: int getPickType() {
114: return PICKCYLINDER;
115: }
116: }
|