Заголовочный файл "Vector h" содержит описание класса tvector, являющегося программной реализацией геометрического вектора. В классе - umotnas.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Программы: Повторение (8 ч) I. Векторы. Метод координат. (17 ч. 1 255.4kb.
Студент фит нгу группа 5304 Версия 0 1 83.47kb.
Вопросы к экзамену по высшей математике 1 27.45kb.
«Понятие вектора. Модуль и направление вектора. Равные вектора» 1 255kb.
Программа: Назначение системы MicroStation и ее функциональные возможности. 1 116.72kb.
Рабочая программа по предмету география Для 8 класса индивидуальное... 1 379kb.
Урок-зачет по геометрии в 7 классе по теме "Начальные геометрические... 1 50.76kb.
Программ а курса «Теория вероятностей» для студентов 1 35.83kb.
Программ а курса «Теория вероятностей» для студентов 1 35.21kb.
Формат файлов для предоставления спецификаций на бриллианты в органы... 1 124.96kb.
Программа междисциплинарного государственного экзамена по математике... 1 35.51kb.
«Понятие вектора. Модуль и направление вектора. Равные вектора» 1 255kb.
Викторина для любознательных: «Занимательная биология» 1 9.92kb.

Заголовочный файл "Vector h" содержит описание класса tvector, являющегося программной - страница №1/1

Класс «Вектор»
Заголовочный файл "Vector.h" содержит описание класса TVector, являющегося программной реализацией геометрического вектора. В классе описаны все математические и геометрические операции, применимые к векторам. Большинство из этих функций реализовано через описание стандартных операторов С++, таких как «+», «-», «*» и др., что позволяет максимально просто и наглядно оперировать векторами. Полный перечень и подробное описание всех описанных операторов см. ниже.
Как пользоваться классом TVector

Всё что нужно для использования TVector, это подключить заголовочный файл:


#include "Vector.h"
Координаты вектора представлены матрицей вида double[3], что и определяет размер класса – 24 байта. Есть несклько способов инициализации вектора, позволяющих сразу задать его координаты. Для задания x,y,z-кординат по-отдельности объявляйте вектор так:
TVector V(1.2, 3.4, 5.6);
Если известны координаты начала и конца вектора:
double begin[3] = {1.2, 3.4, 5.6}; //Или float begin[3] = {1.2, 3.4, 5.6};

double end[3] = {7.8, 9.0, 1.2}; //Или float end[3] = {7.8, 9.0, 1.2};
то удобно задавать вектор так:
TVector V(begin, end);
Если координаты не указаны, значения по умолчанию (x=0,y=0,z=0) будут присвоены конструктором автоматически при инициализации вектора:
TVector V; //Значения по умолчанию: V.Vxyz[0]=0, V.Vxyz[1]=0, V.Vxyz[2]=0
Задать координаты вектора можно в любое время. Способ задания x,y,z-кординат по-отдельности:
TVector V;

V(1.2, 3.4, 5.6);


Или:
V[0]=1.2; //Задать x-координату

V[1]=3.4; //Задать y-координату

V[2]=5.6; //Задать z-координату
Скопировать все три координаты из матрицы, их содержащей:
TVector V;

double coordinates[3] = {1.2, 3.4, 5.6}; //Или float coordinates[3] = {1.2, 3.4, 5.6};

V = coordinates;


Скопировать координаты другого вектора:
TVector V1(1.2, 3.4, 5.6);

TVector V2;

V2 = V1;
Множество операций, такие как сложение и вычитание векторов, векторное умножение, умножение на скаляр и многие другие осуществляются с помощью стандартных операторов С++. Перечень применимых к классу TVector операторов и их описания даны ниже.
Операторы, применимые к классу TVector

"="

Два способа применения этого оператора были описаны выше. Третий способ используется для задания длины вектора (масштабирования). Т.е. если необходимо отмасштабировать некий вектор так, чтобы его длина стала равна, скажем, 1.0 («нормировать вектор»), код будет выглядеть так:
TVector V(1.2, 3.4, 5.6);

V = 1.0;
Масштабированию не подлежат нулевые вектора (x=0,y=0,z=0). Попытка провести масштабирование нулевого вектора не вызовёт ошибки, но и не даст никаких результатов. Проконтролировать успех операции можно так:


TVector V(0,0,0); //V – нулевой вектор

if( !(V=3) )Beep(); //Если масштабирование невозможно, прозвучит сигнал
Узнать длину вектора можно с помощью функции Length():
TVector V(1.2, 3.4, 5.6);

double length = V.Length();
Функция SquareLength(), возвращающая квадрат длины вектора, работает значительно быстрее Length(), поскольку не требует вычисления квадратного корня:
TVector V(1.2, 3.4, 5.6);

double SquareLength = V.SquareLength();
"!"

Меняет направление вектора на противоположное («инверсирует вектор»):


TVector V(1.2, 3.4, 5.6);

!V; //Координаты после инверсии: {-1.2, -3.4, -5.6}


"+=" / "-="

Прибавляет / вычитает вектор к(из) данному(го):


TVector V1(1, 2, 3);

TVector V2(4, 5, 6);

TVector V3(4, 5, 6);

V2+=V1; //Координаты вектора V2 после суммирования с вектором V1: {5,7,9}

V3-=V1; //Координаты вектора V3 после вычитания вектора V1: {3,3,3}
"*=" / "/="

Умножает / делит вектор на скаляр (масштабирует вектор):


TVector V1(1, 2, 3);

TVector V2(1, 2, 3);

V1*=2; //Координаты вектора V1 после умножения на 2: {2, 4, 6}

V3/=2; //Координаты вектора V2 после деления на 2: {0.5, 1, 1.5}


Следующие операторы могут использоваться в векторных уравнениях:
"+" / "-"

Складывают / вычитают вектора:




TVector a(5, 2, 0);

TVector b(1, 3, 0);

TVector c;

TVector d;

c = a + b; //Вектор с равен сумме векторов a и b, т.е. имеет координаты: {6,5,0}

d = a – b; //Вектор d равен разности векторов a и b, т.е. имеет координаты: {4,-1,0}


"*"

Если между собой перемножаются два вектора, оператор "*" производит их векторное умножение, т.е. результатом будет вектор, им перпендикулярный, и имеющий длину, равную произведению их длин на синус угла между ними:




TVector a(4, 1, -2);

TVector b(1, 0, -5);

TVector c;

c = a * b; //Вектор с равен векторному произведению векторов a и b; |c|=|a|*|b|*sin(a^b)


"^"

Скалярное произведение векторов. Возвращаемое значение – косинус угла между векторами:




TVector a(4, 1, 1);

TVector b(1, 2, -3);



double cos_ab = a ^ b; //cos_ab = cos(a^b)
"*" / "/"

Если аргументы – вектор и число (скаляр), результатом вычислений будет произведение / деление вектора на скаляр (масштабирование вектора):


TVector a(1, 2, 3);

TVector b;

b = a * 2; //Координаты вектора b: {2, 4, 6}

b = a / 2; //Координаты вектора b: {0.5, 1, 1.5}


"%"

Проецирование одного вектора на другой:



К примеру, если нужно найти проекцию вектора «a» на вектор «b», код будет выглядеть так:


TVector a(5, 2, 1);

TVector b(1, 4, -3);

TVector c;

c = a % b;


Полученный вектор «с» будет коллинеарен вектору, на который производилось проецирование («b») и его длина будет равна длине проецируемого вектора («а») домноженная на косинус угла между «а» и «b».

Проекция на нулевой вектор (|b|=0) всегда даёт вектор, эквивалентный проецируемому («а»).


Следующие операторы могут использоваться при сравнении векторов (в логических уравнениях):

Примечание: т.к. в классе TVector используется тип переменных double, обеспечивающий точность до 15 знаков после запятой, то при сравнении векторов проводятся соответствующие округления.
"||"

Проверяет параллельность двух векторов:




TVector a(1, 2, 3);

TVector b(-0.5, -1, -1.5);



bool a_parallel_b = a || b; //a_parallel_b = true, т.к. a и b параллельны
"==" / "!="

Проверяет эквивалентность / неэквивалентность длин и направлений векторов:




TVector a(1, 4, 3);

TVector b(1, 4, 3);

TVector c(4, 3, 1);

TVector d(2, 8, 6);



bool a_equal_to_b = a==b; //a_equal_to_b = true, т.к. a и b равны

bool a_not_equal_to_b = a!=b; //a_not_equal_to_b = false

bool a_equal_to_c = a==c; //a_equal_to_c = false, т.к. a и c отличаются направлением

bool a_not_equal_to_c = a!=c; //a_not_equal_to_c = true

bool a_equal_to_d = a==d; //a_equal_to_d = false, т.к. a и d отличаются по длине

bool a_not_equal_to_d = a!=d; //a_no_equal_to_d = true
">" / "", ">=" / ""

Применяются для сравнения длин векторов:


TVector a(1, 2, 3);

TVector b(3, 2, 1);

TVector с(-4, -5, -6);

bool a_more_than_b = a>b; //a_more_than_b = false, т.к. |a| и |b| равны

bool a_less_than_b = a //a_less_than_b = false, т.к. |a| и |b| равны

bool a_less_than_c = a //a_less_than_c = true, т.к. |a| меньше |c|

bool a_more_or_equal_to_b = a>=b; //a_more_or_equal_to_b = true, т.к. |a| и |b| равны

bool a_less_or_equal_to_b = a//a_less_or_equal_to_b = true, т.к. |a| и |b| равны

bool a_less_or_equal_to_c = a//a_less_or_equal_to_c = true, т.к. |a| меньше |c|
"==" / "!=", ">" / "=" / "

Все эти операторы также могут применяться при сравнении длины вектора с конкретно заданным числом:


TVector a(-3, 4, 0); //Нетрудно посчитать, что длина вектора a (|a|) равна 5

bool a_equal_to_5 = a==5; //a_equal_to_5 = true

bool a_not_equal_to_5 = a!=5; //a_not_equal_to_5 = false

bool a_more_than_5 = a>5; //a_more_than_5 = false

bool a_less_than_5 = a//a_less_than_5 = false

bool a_more_or_equal_to_5 = a>=5; //a_more_or_equal_to_5 = true

bool a_less_or_equal_to_5 = a//a_less_or_equal_to_5 = true
Дополнительно

"&"

Возвращает указатель на массив, содержащий координаты вектора. Возьмём, к примеру, такую функцию OpenGL, как
void glNormal3dv(double *v);
Функция требует указатель на массив типа double, содержащий 3 члена, являющихся x,y,z-координатами вектора нормали. Координаты TVector представлены как раз массивом такого типа (double[3]), поэтому вызов вышеописанной функции будет выглядеть так:
TVector n(0.6, 0.0, 0.8); //n - вектор нормали

glNormal3dv(&n); //Используем оператор & для передачи указателя на массив координат


Неупомянутой осталась лишь одна функция, включённая в класс TVector – "RotateAround(RotationVector,Angle)". Функция поворачивает вектор вокруг указанного вектора "RotationVector" на угол "Angle" (заданный в градусах):


TVector a(3, 1, 2);

TVector r(1, 4, -3);

a.RotateAround(r,80); //Повернуть вектор a вокруг вектора r на 80 градусов
При этом длина поворачиваемого вектора (a) и его проекция на вектор r остаются неизменными

(|a'| = |a|; a'пр.r = aпр.r).



При расчёте вектора a' производится вычисление синуса, косинуса и квадратного корня, так что рационально избегать её многократного использования.