самостоялки / 3rab_voprosy_i_otvety_cpp_pole_i_volnovod
.docxВопросы и ответы по полям и графическим объектам
Векторы поля, Z-буфер, точечные заряды и обработка сообщений
Вариант 2
Вопросы - 2, 8, 14, 21, 26
Краткие ответы по вычислениям в C++ и MATLAB для моделирования полей и графических объектов.
Вопрос 2. Как выглядит код нахождения касательного вектора к линиям магнитного поля
Ответ. Вектор магнитного поля H всегда направлен по касательной к линии магнитного поля. Для программного нахождения касательного вектора сначала вычисляются компоненты вектора H в заданной точке, затем находится его модуль (длина) H. После этого компоненты делятся на модуль, чтобы получить единичный касательный вектор n (направляющие косинусы).
Код нахождения вектора (стр. 4-5):
mag = magn(x,y,z); // вычисляем магнитное поле в точке Hx = mag.hx; Hy = mag.hy; Hz = mag.hz; Ha = sqrt(Hx*Hx + Hy*Hy + Hz*Hz); // находим модуль вектора // находим проекции единичного касательного вектора vect.dx = Hx/Ha; vect.dy = Hy/Ha; vect.dz = Hz/Ha;
Вопрос 8. Как используется контекст памяти и битовая карта для моделирования движения графических объектов
Ответ. Контекст памяти и битовая карта используются для создания эффекта плавного движения или вращения сложных 3D-объектов без раздражающего мерцания (стр. 10-11). При перерисовке сцены, например по сообщению WM_PAINT, вся сложная картина линий сначала полностью рисуется на невидимой битовой карте, загруженной в контекст памяти (виртуальный экран). После того как кадр полностью сформирован в памяти, он практически мгновенно копируется на реальный экран с помощью функции BitBlt(). Этот прием называется двойной буферизацией и позволяет глазу не замечать процесса поочередного вывода отдельных линий.
Вопрос 14. Каков код вычисления глубины Z-буфера
Ответ. При оптимизированном рисовании отрезков линий в экранных координатах глубина Z-буфера вычисляется для каждого пикселя с помощью линейной интерполяции между глубинами начальной (ze1) и конечной (ze2) точек отрезка (стр. 20-21).
Если отрезок более горизонтальный (изменяется по координате x), код выглядит так:
zz = ze1 + (ze2 - ze1)*(x - x1)/(x2 - x1);
Если отрезок более вертикальный (изменяется по координате y), код выглядит так:
zz = ze1 + (ze2 - ze1)*(y - y1)/(y2 - y1);
Ответ. Переменная zz - это вычисленная Z-глубина для текущего пикселя.
Вопрос 21. Какие формулы используются для вычисления вектора напряженности электрического поля точечных зарядов
Ответ. Для вычисления вектора напряженности электрического поля E системы из N точечных зарядов используется принцип суперпозиции - суммирование полей от каждого отдельного заряда. Базовая формула имеет вид (стр. 31):
Векторная форма
E(r) = Σⁿ⁼¹ᴺ qₙ (r − rₙ) / |r − rₙ|³
В виде скалярных проекций на декартовы оси координат (x, y, z) эти формулы записываются следующим образом:
Проекция на ось x
Eₓ(x, y, z) = Σⁿ⁼¹ᴺ qₙ(x − xₙ) / ((x − xₙ)² + (y − yₙ)² + (z − zₙ)²)³⁄²
Проекция на ось y
Eᵧ(x, y, z) = Σⁿ⁼¹ᴺ qₙ(y − yₙ) / ((x − xₙ)² + (y − yₙ)² + (z − zₙ)²)³⁄²
Проекция на ось z
E𝓏(x, y, z) = Σⁿ⁼¹ᴺ qₙ(z − zₙ) / ((x − xₙ)² + (y − yₙ)² + (z − zₙ)²)³⁄²
Вопрос 26. Какова структура сообщений, приходящих к диалоговым окнам
Ответ. Сообщения, приходящие в диалоговое окно, обрабатываются специальной функцией окна, например DialProc, с использованием конструкции switch(uMsg). Обычная структура обработки сообщений включает (стр. 29, 54, 57):
WM_INITDIALOG. сообщение при открытии окна. Здесь выполняется инициализация: переменные конвертируются в строки и выводятся в текстовые поля Edit с помощью функции SetWindowText().
WM_PAINT. сообщение перерисовки. По нему открывается графический контекст (BeginPaint), рисуются фоновые элементы, рамочки и текст, после чего контекст закрывается (EndPaint).
WM_COMMAND. сообщение от элементов управления, например при нажатии кнопок «ОК» или «Отмена». Внутри этого блока считываются данные из полей ввода (GetWindowText) и окно закрывается функцией EndDialog().
WM_CLOSE. сообщение при принудительном закрытии диалогового окна крестиком. Обычно оно вызывает EndDialog().
