
ОСНОВЫ МЕТОДА ТРАССИРОВКИ ЛУЧЕЙ
164
public: // Plane Eq. (n,r) + D = 0
Vectorn; // unit plane normal
doubleD; // distance from origin
Plane ( Vector& normal, double dist ) { n = normal; D = dist; };
Plane ( double, double, double, double ); // ax + by + cz + d = 0
virtual int Intersect ( Ray&, double& );
virtual VectorFindNormal ( Vector& ) { return n; };
};
class Rect : public GObject
{
public:
VectorLoc;
VectorSide1, Side2;
Vectorn;
Vectorku, kv;
doubleu0, v0;
Rect ( Vector&, Vector&, Vector& );
virtual int Intersect ( Ray&, double& );
virtual VectorFindNormal ( Vector& ) { return n; };
};
class Triangle : public Rect
{
public:
Triangle ( Vector& l, Vector& s1, Vector& s2 ) : Rect ( l, s1, s2 ) {};
virtual int Intersect ( Ray&, double& );
};
class Box : public GObject
{
Vectorn [3]; // normals no sides, sides are : ( p, n ) + d = 0;
doubled1 [3], d2 [3]; // dist, for plane eq., d1 [i] < d2 [i]
VectorCenter; // center of
public:
VectorLoc; // origin
Vectore1, e2, e3; // main edges
Box ( Vector&, Vector&, Vector&, Vector& );
Box ( Vector&, double, double, double );
virtual int Intersect ( Ray&, double& );
virtual Vector FindNormal ( Vector& );
private:
void InitNormals ();
};
class Cylinder : public GObject
{
Vectore1, e2;
doubled1, d2; // parameters of edges
doubleLen; // length of cylinder
doubleLen2; // squared length ( vector Dir squared )
doubleRadius2;
doubleRadius4;
public:
VectorLoc;
VectorDir;
doubleRadius;