107 lines
2.6 KiB
C++
107 lines
2.6 KiB
C++
/* Copyright (C) John W. Ratcliff, 2001.
|
|
* All rights reserved worldwide.
|
|
*
|
|
* This software is provided "as is" without express or implied
|
|
* warranties. You may freely copy and compile this source into
|
|
* applications you distribute provided that the copyright text
|
|
* below is included in the resulting source code, for example:
|
|
* "Portions Copyright (C) John W. Ratcliff, 2001"
|
|
*/
|
|
#pragma once
|
|
|
|
#include "vector.h"
|
|
|
|
|
|
/***********************************************************************/
|
|
/** SPHERE.H : Base class to represent a Sphere in 3 space. */
|
|
/** */
|
|
/** Written by John W. Ratcliff jratcliff@att.net */
|
|
/***********************************************************************/
|
|
|
|
class SphereInterface
|
|
{
|
|
public:
|
|
SphereInterface();
|
|
virtual ~SphereInterface();
|
|
virtual int GetVertexCount(void) const = 0;
|
|
virtual bool GetVertex(int i,Vector3d &vect) const = 0;
|
|
private:
|
|
};
|
|
|
|
|
|
|
|
class Sphere
|
|
{
|
|
public:
|
|
Sphere();
|
|
Sphere(const Vector3d ¢er, float radius);
|
|
|
|
virtual ~Sphere() {}
|
|
|
|
void Set(const Vector3d ¢er, float radius);
|
|
|
|
void Compute(const SphereInterface &source);
|
|
|
|
float GetRadius(void) const { return mRadius; };
|
|
float GetRadius2(void) const { return mRadius2; };
|
|
const Vector3d& GetCenter(void) const { return mCenter; };
|
|
|
|
bool RayIntersection(const Vector3d &rayOrigin,
|
|
const Vector3d &V,
|
|
float distance,
|
|
Vector3d *intersect);
|
|
|
|
|
|
bool RayIntersection(const Vector3d &rayOrigin,
|
|
const Vector3d &rayDirection,
|
|
Vector3d *intersect);
|
|
|
|
bool RayIntersectionInFront(const Vector3d &rayOrigin,
|
|
const Vector3d &rayDirection,
|
|
Vector3d *intersect);
|
|
|
|
void Report(void);
|
|
|
|
void SetRadius(float radius)
|
|
{
|
|
mRadius = radius;
|
|
mRadius2 = radius*radius;
|
|
}
|
|
|
|
|
|
bool InSphereXY(const Vector3d &pos,float distance) const
|
|
{
|
|
float dx = pos.x - mCenter.x;
|
|
float dy = pos.y - mCenter.y;
|
|
float dist = sqrtf( dx*dx + dy*dy );
|
|
if ( dist < (mRadius+distance) ) return true;
|
|
return false;
|
|
};
|
|
|
|
bool InSphere(const Vector3d &pos,float distance) const
|
|
{
|
|
float dx = pos.x - mCenter.x;
|
|
float dy = pos.y - mCenter.y;
|
|
float dz = pos.z - mCenter.z;
|
|
|
|
float dist = sqrtf( dx*dx + dy*dy + dz*dz );
|
|
if ( dist < (mRadius+distance) ) return true;
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
Vector3d mCenter;
|
|
private:
|
|
float mRadius;
|
|
float mRadius2; // radius squared.
|
|
};
|
|
|
|
|
|
inline Sphere::Sphere()
|
|
: mCenter(Vector3d(0.0f, 0.0f, 0.0f)), mRadius(0.0f), mRadius2(0.0f) { };
|
|
|
|
inline Sphere::Sphere(const Vector3d ¢er, float radius)
|
|
: mCenter(center), mRadius(radius), mRadius2(radius*radius) { };
|