
- •Часть 2. Дискретная математика. Структуры данных. Алгоритмы. Информатика.
- •4.1. Ограниченно-детерминированные функции
- •Ограниченно-детерминированные функции
- •Открытое хеширование
- •Закрытое хеширование
- •Метод остатков от деления
- •Метод функции середины квадрата
- •Метод свертки
- •Семафорные примитивы Дейкстры
- •4.6 Семафорные примитивы Дейкстры.
- •Концепция
- •Задача “Поставщик - Потребитель”.
- •Мониторы Хоара
- •[Править]Тип 0 — неограниченные
- •[Править]Тип 1 — контекстно-зависимые
- •[Править]Тип 2 — контекстно-свободные
- •[Править]Тип 3 — регулярные
- •Синтаксический анализ
- •Условия использования метода рекурсивного спуска
- •Устранение левой рекурсии
- •[Править]Устранение непосредственной левой рекурсии
- •[Править]Пример
- •[Править]Алгоритм устранения произвольной левой рекурсии
- •[Править]Асимптотика
- •[Править]Пример
- •[Править]Варианты реализации [править]Предсказывающий парсер
- •[Править]Парсер с возвратом
- •Виртуальные и динамические методы
- •Динамические методы
- •Символьные массивы (строки)
- •Создание функции
- •Формальные и фактические параметры
- •Очередность вызова и рекурсия
- •Способы передачи параметров в функцию
- •Перегрузка функций
- •Абстракция данных
- •Ключевые черты ооп
- •Наследование
- •Private-наследование
- •Protected-наследование
- •Public-наследование
- •Статические члены класса
- •Указатель this
- •Перегрузка операторов
- •Примеры некоторых классов Класс комплексных чисел
- •Аналитическая модель поверхности
- •Векторная полигональная модель
- •Воксельная модель
- •Равномерная сетка
Примеры некоторых классов Класс комплексных чисел
Далее будет рассмотрен пример реализации класса комплексных чисел с некоторыми операциями над ними.
В примере показано, как можно объявлять методы в классе (предъявляя прототипы методов), а описывать — за пределами класса (используя оператор ::).
Пример:
#include <iostream>
#include <cmath> // Этот заголовочный файл содержит функцию sqrt для вычисления корня
using namespace std;
class Complex {
private:
double real;
double img;
public:
Complex() { // Конструктор по умолчанию
real = 0;
img = 0;
}
Complex(const Complex& c) { // Копирующий конструктор
this->real = c.real;
this->img = c.img;
}
Complex(double, double); // Конструктор объявлен в классе, а определен будет вне его
void operator = (Complex c) { // Перегрузка оператора присваивания
this->real = c.real;
this->img = c.img;
}
bool operator == (Complex c) { // Перегрузка оператора сравнения
if (this->real == c.real && this->img == c.img) {
return true;
} else {
return false;
}
}
Complex operator + (Complex c) { // Перегрузка оператора сложения
Complex tmp;
tmp.real = this->real + c.real;
tmp.img = this->img + c.img;
return tmp;
}
Complex operator * (Complex c); // Перегрузка оператора умножения
// В классе только прототип, определение будет за пределами класса
double module(); // Модуль комплексного числа, в классе только прототип
void invert() { // Обращение комплексного числа в сопряженное
img = -img;
}
void printComplex() { // Вывод комплексного числа
cout << real << '+' << img << 'i' << endl;
}
};
Complex::Complex(double a, double b) { // Конструктор определен будет вне класса
real = a;
img = b;
}
double Complex::module() { // Метод определен вне класса
return sqrt(real*real + img*img);
}
Complex Complex::operator * (Complex c) { // Оператор определен вне класса
Complex tmp;
tmp.real=(real*c.real)-(img*c.img);
tmp.img=(real*c.img)+(img*c.real);
return tmp;
}
int main() {
Complex a(2,3);
Complex b(3,2);
a.printComplex();
b.printComplex();
Complex c;
c = a+b; // Перегруженный оператор сложения в действии
c.printComplex();
Complex z; // Создастся нулевое число конструктором по умолчанию
z.printComplex();
return 0;
}
43.
Аффинные
преобразования в пространстве
3D
Рассмотрим
применение аффинных преобразований на
плоскости 3D.
Для начала введем понятие “однородных
координат”. Заменим координатную
тройку (x,
у, z), задающую
точку в пространстве, на четверку
чисел (x,
у, z, 1)
или, более общо, на четверку
Каждая точка пространства (кроме начальной точки О) может быть задана четверкой одновременно не равных нулю чисел; эта четверка чисел определена однозначно с точностью до общего множителя.
Предложенный переход к новому способу задания точек дает возможность воспользоваться матричной записью и в более сложных, трехмерных задачах.
Любое аффинное преобразование в трехмерном пространстве может быть представлено в виде суперпозиции вращений, растяжений, отражений и переносов. Поэтому вполне уместно сначала подробно описать матрицы именно этих преобразований (ясно, что в данном случае порядок матриц должен быть равен четырем).
А. Матрицы вращения в пространстве.
Матрица вращения вокруг оси абсцисс на угол φ:
Матрица вращения вокруг оси ординат на угол ψ:
Матрица вращения вокруг оси аппликат на угол χ:
Замечание. Полезно обратить внимание на место знака "-" в каждой из mpex приведенных матриц
Б. Матрица растяжения (сжатия):
где α > 0 - коэффициент растяжения (сжатия) вдоль оси абсцисс
β > 0 - коэффициент растяжения (сжатия) вдоль оси ординат
γ > 0 - коэффициент растяжения (сжатия) вдоль оси аппликат.
В. Матрицы отражения.
Матрица отражения относительно плоскости xу:
Матрица отражения относительно плоскости уz:
Матрица отражения относительно плоскости zx:
Г. Матрица переноса (здесь (λ, μ, v) - вектор переноса):
Замечание. Как и в двумерном случае, все выписанные матрицы невырождены.
44.