001 package physics3d; 002 003 /** 004 * Sphere represents a sphere in 3 space 005 * 006 * @specfield centerPoint : Vect3 // point of center of sphere 007 * @specfield radius : double // radius of sphere 008 * @specfield texture : String // texture of this object 009 */ 010 public strictfp class Sphere implements PhysicsShape { 011 private final Vect3 centerPoint; 012 013 private final double radius; 014 015 private final String texture; 016 017 // Rep. Invariant: 018 // centerPoint != null && 019 // radius >= 0.0 020 021 // Abstraction Function: 022 // The sphere with a center at 'centerPoint' and a radius 'radius' 023 024 // Constructors ----------------------------------- 025 /** 026 * @requires <code>r</code> >= 0, <code>center</code> != null, 027 * <code>texture</code> != null 028 * 029 * @effects Creates a new circle with the specified size and location. 030 * 031 * @param center 032 * the center point of the circle 033 * @param r 034 * the radius of the circle 035 */ 036 public Sphere(Vect3 center, double r, String texture) { 037 if ((r < 0) || (center == null)) { 038 throw new IllegalArgumentException(); 039 } 040 centerPoint = center; 041 radius = r; 042 this.texture = texture; 043 } 044 045 /** 046 * @requires <code>r</code> >= 0, <code>center</code> != null 047 * 048 * @effects Creates a new circle with the specified size and location. 049 * 050 * @param center 051 * the center point of the circle 052 * @param r 053 * the radius of the circle 054 */ 055 public Sphere(Vect3 center, double r) { 056 if ((r < 0) || (center == null)) { 057 throw new IllegalArgumentException(); 058 } 059 centerPoint = center; 060 radius = r; 061 this.texture = null; 062 } 063 064 /** 065 * @requires <code>r</code> >= 0 066 * 067 * @effects Creates a new circle with the specified size and location. 068 * 069 * @param cx 070 * the x coordinate of the center point of the circle 071 * @param cy 072 * the y coordinate of the center point of the circle 073 * @param cz 074 * the z coordinate of the center point of the circle 075 * @param r 076 * the radius of the circle 077 */ 078 public Sphere(double cx, double cy, double cz, double r, String texture) { 079 this(new Vect3(cx, cy, cz), r, texture); 080 } 081 082 @SuppressWarnings("unused") 083 private void checkRep() { 084 if (centerPoint == null || radius < 0.0) { 085 throw new RuntimeException(); 086 } 087 } 088 089 // Observers -------------------------------------- 090 091 /** 092 * @return the center point of this circle. 093 */ 094 public Vect3 getCenter() { 095 // checkRep(); 096 return centerPoint; 097 } 098 099 /** 100 * @return the radius of this circle. 101 */ 102 public double getRadius() { 103 // checkRep(); 104 return radius; 105 } 106 107 /** 108 * @return texture of this object 109 */ 110 public String getTexture() { 111 // checkRep(); 112 return this.texture; 113 } 114 115 /** 116 * @requires p != null 117 * @return true if 118 * <code>Vect3.isAbout(this.minDistanceToObjectFromP(p),0)</code>, 119 * false otherwise 120 */ 121 public boolean containsPoint(Vect3 p) { 122 // checkRep(); 123 return Vect3.isAbout(this.minDistanceToObjectFromP(p), 0); 124 } 125 126 /** 127 * @requires <code>p</code> is not null 128 * @return the minimum distance between <code>p</code> and <code>this</code> 129 */ 130 public double minDistanceToObjectFromP(Vect3 p) { 131 // checkRep(); 132 return Math.abs(p.minus(centerPoint).rho() - radius); 133 } 134 135 /** 136 * @requires center != null, axis != null, axis.rho() > 0, tAngle != null. 137 * @return A Sphere rotated about the line created by center and axis 138 * counterclockwise by an amount tAngle with same texture. 139 */ 140 public Sphere rotateAboutCwithAxisAandAngleT(Vect3 center, Vect3 axis, 141 Angle tAngle) { 142 return new Sphere(this.getCenter().minus(center).rotateAroundVect(axis, 143 tAngle).plus(center), this.getRadius(), this.texture); 144 } 145 146 /** 147 * @requires t != null 148 * @return A Sphere translated by t with same texture 149 */ 150 public Sphere translateByT(Vect3 t) { 151 return new Sphere(this.getCenter().plus(t), this.getRadius(), this.texture); 152 } 153 154 // Object methods -------------------------------------- 155 // 156 // public boolean equals(Sphere c) { 157 // if (c == null) return false; 158 // return (radius == c.radius) && centerPoint.equals(c.centerPoint); 159 // } 160 // 161 // public boolean equals(Object o) { 162 // if (o instanceof Sphere) 163 // return equals((Sphere) o); 164 // else 165 // return false; 166 // } 167 // 168 public String toString() { 169 return "[Sphere center=" + centerPoint + " radius=" + radius + "]"; 170 } 171 // 172 // public int hashCode() { 173 // return centerPoint.hashCode() + 17 * (new Double(radius)).hashCode(); 174 // } 175 176 public ShapeClassification getShapeClassification() { 177 return ShapeClassification.SPHERE; 178 } 179 }