12#ifndef TT_INCLUDE__SPHERECLASS_H
13#define TT_INCLUDE__SPHERECLASS_H
20 inline SphereClass(
void) { };
21 inline SphereClass(
const Vector3 & center,
float radius) { Init(center,radius); }
22 inline SphereClass(
const Vector3 & center,
const SphereClass & s0);
23 inline SphereClass(
const Vector3 *Position,
const int VertCount);
25 inline void Init(
const Vector3 & pos,
float radius);
26 inline void Re_Center(
const Vector3 & center);
27 inline void Add_Sphere(
const SphereClass & s);
28 inline void Transform(
const Matrix3D & tm);
29 inline float Volume(
void)
const;
31 inline SphereClass & operator += (
const SphereClass & s);
32 inline SphereClass & operator *= (
const Matrix3D & m);
37inline SphereClass::SphereClass(
const Vector3 & center,
const SphereClass & s0)
39 float dist = (s0.Center - center).Length();
41 Radius = s0.Radius + dist;
43inline SphereClass::SphereClass(
const Vector3 *Position,
const int VertCount)
47 Vector3 xmin(Position[0].X,Position[0].Y,Position[0].Z);
48 Vector3 xmax(Position[0].X,Position[0].Y,Position[0].Z);
49 Vector3 ymin(Position[0].X,Position[0].Y,Position[0].Z);
50 Vector3 ymax(Position[0].X,Position[0].Y,Position[0].Z);
51 Vector3 zmin(Position[0].X,Position[0].Y,Position[0].Z);
52 Vector3 zmax(Position[0].X,Position[0].Y,Position[0].Z);
53 for (i=1; i<VertCount; i++)
55 if (Position[i].X < xmin.X)
57 xmin.X = Position[i].X; xmin.Y = Position[i].Y; xmin.Z = Position[i].Z;
59 if (Position[i].X > xmax.X)
61 xmax.X = Position[i].X; xmax.Y = Position[i].Y; xmax.Z = Position[i].Z;
63 if (Position[i].Y < ymin.Y)
65 ymin.X = Position[i].X; ymin.Y = Position[i].Y; ymin.Z = Position[i].Z;
67 if (Position[i].Y > ymax.Y)
69 ymax.X = Position[i].X; ymax.Y = Position[i].Y; ymax.Z = Position[i].Z;
71 if (Position[i].Z < zmin.Z)
73 zmin.X = Position[i].X; zmin.Y = Position[i].Y; zmin.Z = Position[i].Z;
75 if (Position[i].Z > zmax.Z)
77 zmax.X = Position[i].X; zmax.Y = Position[i].Y; zmax.Z = Position[i].Z;
83 float xspan = dx*dx + dy*dy + dz*dz;
87 float yspan = dx*dx + dy*dy + dz*dz;
91 float zspan = dx*dx + dy*dy + dz*dz;
94 float maxspan = xspan;
108 center.X = (dia1.X + dia2.X) / 2.0f;
109 center.Y = (dia1.Y + dia2.Y) / 2.0f;
110 center.Z = (dia1.Z + dia2.Z) / 2.0f;
111 dx = dia2.X - center.X;
112 dy = dia2.Y - center.Y;
113 dz = dia2.Z - center.Z;
114 float radsqr = dx*dx + dy*dy + dz*dz;
115 float radius = sqrt(radsqr);
116 for (i=0; i<VertCount; i++)
118 dx = Position[i].X - center.X;
119 dy = Position[i].Y - center.Y;
120 dz = Position[i].Z - center.Z;
121 float testrad2 = dx*dx + dy*dy + dz*dz;
122 if (testrad2 > radsqr)
124 float testrad = sqrt(testrad2);
125 radius = (radius + testrad) / 2.0f;
126 radsqr = radius * radius;
127 float oldtonew = testrad - radius;
128 center.X = (radius * center.X + oldtonew * Position[i].X) / testrad;
129 center.Y = (radius * center.Y + oldtonew * Position[i].Y) / testrad;
130 center.Z = (radius * center.Z + oldtonew * Position[i].Z) / testrad;
136inline void SphereClass::Init(
const Vector3 & pos,
float radius)
141inline void SphereClass::Re_Center(
const Vector3 & center)
143 float dist = (Center - center).Length();
147inline void SphereClass::Add_Sphere(
const SphereClass & s)
149 if (s.Radius == 0.0f)
153 float dist = (s.Center - Center).Length();
156 Radius = (Radius > s.Radius) ? Radius : s.Radius;
159 float rnew = (dist + Radius + s.Radius) / 2.0f;
167 Init(s.Center, s.Radius);
171 float lerp = (rnew - Radius) / dist;
172 Vector3 center = (s.Center - Center) * lerp + Center;
177inline void SphereClass::Transform(
const Matrix3D & tm)
179 Center = tm * Center;
181inline float SphereClass::Volume(
void)
const
183 return (4.0f / 3.0f) * WWMATH_PI * (Radius * Radius * Radius);
185inline SphereClass & SphereClass::operator += (
const SphereClass & s)
190inline SphereClass & SphereClass::operator *= (
const Matrix3D & m)
192 Init(m * Center, Radius);
195inline bool Spheres_Intersect(
const SphereClass & s0,
const SphereClass & s1)
197 Vector3 delta = s0.Center - s1.Center;
198 float dist2 = delta*delta;
199 if (dist2 < (s0.Radius + s1.Radius) * (s0.Radius + s1.Radius))
208inline SphereClass Add_Spheres(
const SphereClass & s0,
const SphereClass & s1)
210 if (s0.Radius == 0.0f)
216 SphereClass result(s0);
217 result.Add_Sphere(s1);
221inline SphereClass operator + (
const SphereClass & s0,
const SphereClass & s1)
223 return Add_Spheres(s0,s1);
225inline SphereClass Transform_Sphere(
const Matrix3D & m,
const SphereClass & s)
227 return SphereClass(m*s.Center,s.Radius);
229inline void Transform_Sphere(
const Matrix3D & m,
const SphereClass & s,SphereClass & res)
231 res.Center = m*s.Center;
232 res.Radius = s.Radius;
234inline SphereClass operator * (
const Matrix3D & m,
const SphereClass & s)
236 return Transform_Sphere(m,s);