5. Введение в программирование графики и математическое моделирование. (Семинары)
Описание файла
Файл "5. Введение в программирование графики и математическое моделирование." внутри архива находится в папке "Семинары". PDF-файл из архива "Семинары", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрЯзык программирования Си++Иванов А.П., Князева О.С.Семинар 5. Введение в программирование графики иматематическое моделирование.1. Постановка задачиВ типовом задании требуется построить траекторию движения тела массы m в поле силытяжести (ускорение св. падения g), если это тело вбрасывается на левой границе полязрения на высоте h с горизонтальной начальной скоростью V0.Тело может отскакивать от нижнего края экрана (упруго, или неупруго – с потерей f %энергии при каждом ударе о поверхность).В момент выхода тела за правый кран экрана (ширину экрана будем считать равной L) илиего остановки (при неупругом ударе), выполнение задачи заканчивается.2.
Программирование графикиПоследовательность создания проекта:1. Завести проект Win32 Console Application.2. Выбрать пункт меню Project/Add New Item3. В карточке выбрать C++ Source file, назвать его как-нибудь.4. Повторить пункт 3.5. В карточке выбрать Resource Script, тоже как-то назвать файл.6. По щелчку правой кнопки мыши выбрать Add Resource.7.
В карточке выбора типа ресурса выбрать Dialog и нажать кнопку New.8. Удалить с диалога кнопку Cancel.9. В заголовке диалога написать (можно по-русски) название задачи.10. В окне редактирования свойств диалога (правая кнопка мыши) надо поставитьгалочки Set Foreground и Visible.11. Закрыть окно редактирования ресурсов.12.
Писать программу.Рекомендуется сначала добиться того, чтобы программа хоть что-то нарисовала вграфическом окне и лишь по достижении этого результата переходить к обсчету ирисованию траектории для конкретной физической задачи.#include <iostream>#include <windows.h>#include "resource.h"using namespace std;/* Блок глобальных переменных (массивы заранее рассчитанных координат)в двух системах: физической (вещественные координаты) и пиксельной,связанной с текущим окном, в котором производится отрисовка траектории.*/int x1, y1, x2, y2;int WINAPI DlgProc( HWND hDlg, WORD wMsg, WORD wParam, DWORD ){PAINTSTRUCT ps;13.11.20111Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрif( wMsg == WM_CLOSE || wMsg == WM_COMMAND && wParam == IDOK ) {EndDialog(hDlg,0);} elseif( wMsg == WM_INITDIALOG ) {/* Узнаем размер окна (ось OY направлена вниз): */RECT rc;GetClientRect(hDlg,&rc);int dx = rc.right - rc.left;int dy = rc.bottom- rc.top;/* После этого нужно отмасштабировать физические координаты траектории,чтобы они помещались в поле зрения окна.
То есть, нужно рассчитатьдля каждой точки траектории пиксельные координаты в системе координатданного окна. Само окно пользователь еще не видит.*/} elseif( wMsg == WM_PAINT ) {BeginPaint(hDlg,&ps);/* Зададим цвет линий: */HPEN hPen = (HPEN)CreatePen(PS_SOLID,1,RGB(0,0,255));HPEN hOldPen = (HPEN)SelectObject(ps.hdc,hPen);/*Вот что вообще можно здесь рисовать:MoveToEx(ps.hdc,int x,int y,NULL);( последний параметр – адрес структуры POINTдля возврата координат предыдущей позиции )LineTo(ps.hdc,int x,int y); (с первого пиксела, но без последнего)TextOut(ps.hdc,int x,int y,char* szText,lstrlen(szText));Rectangle(ps.hdc,int left,int top,int right,int bottom);Ellipse(ps.hdc,int left,int top,int right,int bottom);Polygon(ps.hdc,const POINT * lp,int nPoints);Polyline(ps.hdc,const POINT * lp,int nPoints);SetPixel(ps.hdc,int x,int y, RGB(red,green,blue));*//* Здесь – производится отрисовка расчитанных пиксельных координаттраектории в виде ломаной, в цикле по общему количеству точек.*/POINT ptOld;MoveToEx(ps.hdc,x1,y1,&ptOld);LineTo(ps.hdc,x2,y2);/* Перо нам больше не требуется, уничтожим его: */SelectObject(ps.hdc,hOldPen);DeleteObject(hPen);EndPaint(hDlg,&ps);}return 0;}void main(){/* Ввод параметров задачи: */cout << "Please, enter 4 coords:\n" << flush;cin >> x1 >> y1 >> x2 >> y2;cout << "x1 = " << x1 << "\ny1 = " << y1<< "\nx2 = " << x2 << "\ny2 = " << y2 << "\n" << flush;13.11.20112Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр/*Здесь, перед показом,всех точек траекторииМассивы x-y координатв DlgProc и в функциинужно расчитать координатыв физической системе координат.должны быть доступны глобально main.*/DialogBox(NULL,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);}3.
Метод решенияОтвлечемся от процесса визуализации и сосредоточимся на расчете координат тела впоследовательные моменты времени.Уравнение движения тела под действием силы тяжести записывается в виде:d 2rm 2 mg – это дифференциальное уравнение второго порядка. Сделаем заменуdtdr переменной v , тогда получим систему дифференциальных уравнений первогоdtпорядка, которую будем решать методом конечных разностей (методом Эйлера).dv / dt g dr / dt vТак как мы заранее не знаем, какая будет скорость и как скоро тело вылетит за пределыполя зрения, то будем действовать следующим образом: зададим систему координат сцентром в точке вброса тела, осью Y, направленной вертикально вниз и осью X,направленной вправо.
При этом, начальное положение тела (0,0), а поверхность землипроходит по линии h оси Y.В любой момент времени (между ударами), горизонтальная составляющая скоростисохраняется постоянной, а вертикальная изменяется по закону:Vy = gtЗададим некоторый дискретный шаг отсчета времени Δt.Состояние тела в любой момент будет описываться четырьмя параметрами:X, Y, Vx, VyИзменения этого состояния можно вычислять рекуррентно:X[i] = X[i-1] + VxΔtY[i] = Y[i-1] + Vy[i-1]ΔtVy[i] = Vy[i-1] + gΔtПри этом, надо будет обнаружить два события:выход тела за нижнюю границу экрана (когда выполнится условие Y[i] > h)выход тела за правую границу экрана (когда выполнится условие X[i] > L)В первом случае надо сменить знак скорости на противоположный (неупругий удар далеене рассматривается), а во втором – закончить просчет траектории и перейти к ее выводу,после чего можно будет завершить задачу.13.11.20113Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрПосле удара о поверхность, который поменяет знак вертикальной компоненты скоростина отрицательный (при неупругом ударе – еще уменьшится абсолютное значениескорости), формула изменения скорости приобретет вид:Vy = Vy1 + gtгде Vy1 будет отрицательной величиной.Описанный рекуррентный метод решения известен как метод Эйлера и применим, в томчисле и к задачам, где внешняя сила меняется с течением времени.
Однако, следуетпомнить, что точность этого метода – невысока, кроме того, он характерен накоплениемошибок вычислений с течением времени.Для более точного решения поставленной задачи следует в выражении:t1y (t1 ) y (t0 ) y '(t )dtt0заменить определенный интеграл не по формуле прямоугольников (как это делается вметоде Эйлера), а по формуле трапеций:y(t1) = y(t0) + Δt (y'(t0) + y'(t1)) / 213.11.20114Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр1. ВариантПостроить траекторию падения тела в поле силы тяжести, если тело начало движение вточке (x0,y0), c начальной скоростью (Vx0,Vy0).
Начальные условия задает пользователь.Удар о землю абсолютно неупругий. Следовательно, траектория должна заканчиватьсялибо в точке удара тела о землю, либо в точке вылета тела за границы экрана.2. ВариантПостроить траекторию падения тела в поле силы тяжести, если тело начало движение вточке (x0,y0), c начальной скоростью (Vx0,Vy0). Начальные условия задает пользователь.Удар о землю абсолютно упругий. Построение траектории должно заканчиваться вмомент вылета тела за границы экрана.3. ВариантПостроить траекторию падения тела в поле силы тяжести, если тело начало движение вточке (x0,y0), c начальной скоростью (Vx0,Vy0).
Начальные условия задает пользователь.При ударе о землю тело теряет 10% своей кинетической энергии. Построение траекториидолжно заканчиваться в момент вылета тела за границы экрана.4. ВариантПостроить траекторию движения заряженной частицы в электрическом поле снапряженностью E . Частица начинает движение в точке (x0,y0), c начальной скоростью(Vx0,Vy0). Построение траектории должно заканчиваться в момент вылета частицы заграницы экрана.dV qE .Уравнение движения: mdt5. ВариантПостроить траекторию движения заряженной частицы в однородном магнитном полеB=(0,0,B). Частица начинает движение в точке (x0,y0), c начальной скоростью (Vx0,Vy0).Построение траектории должно заканчиваться в момент вылета частицы за границыэкрана. dV q[V B] .Уравнение движения: mdt6.
ВариантПостроить траекторию движения заряженной частицы в поле электрического диполя.Частица начинает движение в точке (x0,y0), c начальной скоростью (Vx0,Vy0). Построениетраектории должно заканчиваться в момент вылета частицы за границы экрана.7. ВариантПостроить траекторию движения заряженной частицы в поле электрического квадруполя.Частица начинает движение в точке (x0,y0), c начальной скоростью (Vx0,Vy0).