
ПРЕОБРАЗОВАНИЯ НА ПЛОСКОСТИ И В ПРОСТРАНСТВЕ
77
оказываются неустойчивыми при малых изменениях либо направления проектирования, либо
взаимного расположения плоскости и проектируемой поверхности эти особенности не
сохраняются и переходят в более простые.
Замечание
По существу, в приведенных примерах рассмотрены три типа отображения 2?плоскости в 2?
плоскость (рис. 40).
Использование средств языка C++ для работы с векторами и преобразованиями
Язык C++ предоставляет очень удобные средства, позволяющие заметно упростить
работу с векторами и преобразованиями в пространстве.
Рассмотрим реализацию работы с векторами.
!// File Vector.h
#ifndef __VECTOR__
#define __VECTOR__
#include <math.h>
class Vector
{
public:
double x, y, z;
Vector () {};
Vector ( double v ) { x = y = z = v; };
Vector ( const Vector& v ) { x = v.x; y = v.y; z = v.z; };
Vector ( double vx, double vy, double vz ) { x = vx; y = vy; z = vz; };
Vector& operator = ( const Vector& v ) { x = v.x; y = v.y; z = v.z; return *this; };
Vector& operator = ( double f ) { x = y = z = f; return *this; };
Vector operator () const;
Vector& operator += ( const Vector& );
Vector& operator = ( const Vector& );
Vector& operator *= ( const Vector& );
Vector& operator *= ( double );
Vector& operator /= ( double );
friend Vector operator + ( const Vector&, const Vector& );
friend Vector operator ( const Vector&, const Vector& );
friend Vector operator * ( const Vector&, const Vector& );
friend Vector operator * ( double, const Vector& );
friend Vector operator * ( const Vector&, double );
friend Vector operator / ( const Vector&, double );
friend Vector operator / ( const Vector&, const Vector& );
friend double operator & ( const Vector& u, const Vector& v ) { return u.x*v.x + u.y*v.y + u.z*v.z;
};
friend Vector operator ^ ( const Vector&, const Vector& );
double operator ! () { return (double) sqrt ( x*x + y*y + z*z ); };
double& operator [] ( int n ) { return * ( &x + n ); };
int operator < ( double v ) { return x < v && y < v && z < v; };
int operator > ( double v ) { return x > v && y > v && z > v; };
};
class Ray
{
public:
Vector Org;
Vector Dir; // direction must be normalyzed