МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ПП и МЭ
Программа для демонстрации шаблона для численного интегрирования уравнения прогиба плоской пластины (двумерный случай)
Факультет: РЭФ
Группа: РМС7-71
Студент: Кохно К.C.
Преподаватель: Усольцев Н.В.
Новосибирск 2010
Задача:
Сделать программу, которая будет демонстрировать обход шаблона для численного интегрирования уравнения прогиба плоской пластины для двумерного случая. А также выводить соответствующие уравнения и матрицу.
Проще говоря сделать более удобный Windows аналог предоставленного консольного приложения.
В программе должно быть:
- Сетка 4х4 точек
- Должна быть возможность перемещать шаблон по этой сетке произвольным образом
- Для каждого положения шаблона должно быть выведено соответствующее уравнение
- После демонстрации всех положений шаблона должна быть выведена на экран матрица полученных уравнений
Математическое описание:
Уравнение на прогиб пластины (уравнение Софи Жермен):
В нашем случае:
; ;
И тогда уравнение сокращается до:
Сделаем замену:
; ;
;
И для удобства С=-(4+2B);
В итоге:
;
Разбиваем пластину на n+4 точек и получаем следующую картину для одномерного случая:
Где 2a – длина балки.
Для выбранной i-той точки:
Считая аналогично другие составляющие полученного ранее уравнения получаем шаблон для одномерного случая:
Числа наверху – множители а снизу – индексы.
Таким образом, перемещая шаблон по точкам разбиения и составляя по нему уравнения получаем систему уравнений для поиска W.
Рассуждая аналогично можно получить шаблон для двумерного случая:
Расположение точек шаблона в двумерной системе координат:
Общий вид шаблона:
Далее полученный шаблон перемещается по узлам сетки разбиения и для каждого узла составляется соответствующее уравнение по шаблону.
Инструкция:
После запуска программы возникает квадратное окно с шаблоном и мерцающий выделенный круг показывает обход шаблона.
Кнопки << и >> служат для перехода на 1 шаг назад и вперед соответственно.
Кнопки <<<< и >>>> служат для перехода в начало и в конец соответственно.
Между кнопками показывается номер текущего узла.
Для смены узла можно пользоваться как кнопками вперед и назад, так и левым щелчком мыши на выбранном узле для перехода.
Разработка программы:
Во первых определимся с окном графики – оно квадратное с размерами 600x600 точек экрана.
Вся графика рисуется не в пространстве экрана а в «Узловом» пространстве, т.е. вместо x y фигурируют i j пространства узлов, которые соответствуют положению текущего узла. Это позволяет рисовать картину используя не 600 значений по х и у а всего по 9 значений а также сразу определить координаты текущего узла используя обратный переход от индексного пространства к пространству экрана.
Пример использования:
// Определяем координаты узла в индексном пространстве
int stp; // номер текущего узла
k=0; // прогоночный коэффициент
for (j=3; j<=6; j++)
for (i=3; i<=6; i++)
{
k++;
if (k==stp)
{
x=i;
y=j;
}
else break();
}
Здесь перебираются узлы сетки (их всего 9) и запоминаются индексные координаты нужного узла.
После того, как определились индексы узла можно легко нарисовать точку в узле отстоящем от найденного на любое целое количество узлов, прибавив или отняв целое количество соответствующих индексов.
Пример:
im->Canvas->MoveTo( x*100 /1.5 , ((y-2)*100)/1.5 );
поставит кисть в точку удаленную от текущего узла на 2 узла вверх.
Умножение на 100/1.5 соответствует переходу к пространству экрана.
По этому принципу реализуется вся графика данной программы.
Названия визуальных компонентов лучше выводить на экран или в их заголовок и потом менять в одном месте программы. Это дает возможность программисту сразу видеть на форме названия соответствующих видимых компонентов (меньше задумываться о вводе/выводе). А также используя данную технику можно с легкостью перевести программу на разные языки…
Пример:
fm1->Caption="KR Шаблон"; // заголовок формы программы
bn1->Caption="<<"; // надпись на кнопке
bn2->Caption=">>"; // надпись на кнопке
lb->Caption=""; // надпись между кнопками (номер узла) изначально не нужна
re1->Lines->Clear(); // текст в TRichEdit *re1 изначально отсутствует
Эта часть кода выполняется сразу при загрузке формы программы и производит все исходные надписи на форме.
На форме содержится TRichEdit *re1 для вывода формул. Нижний регистр индексов ставится следующим нетривиальным образом:
1) Определяем индексы символов с нижним регистром
2) Ставим этим символам нижний регистр
Обычными билдеровскими методами определить нижний регистр (переместить символ вниз) невозможно. Для этого составим формат текста и применим его с помощью WinApi функции SendMessage(handle компонента с выделенным форматируемым текстом, EM_SETCHARFORMAT, SCF_SELECTION, Integer(Адрес нашего формата))
TCharFormat CF; // Формат текста
CF.cbSize= sizeof(CF); // размер формата (байт)
CF.yHeight=5; //высота текста
CF.dwMask= CFM_OFFSET; // стиль текста (нижний регистр)
CF.yOffset=-70; // смещение по У, направленному вверх
SendMessage(re1->Handle,EM_SETCHARFORMAT, SCF_SELECTION, Integer(&CF) ); //применяем созданный формат
Непосредственный пример из кода программы:
bool Nlow[50]; // индексы символов в re1, которые имеют нижний регистр (true)
// форматируем формулу
re1->SelAttributes->Size=12; // выбираем размер обычного символа
// идем по всем символм поля re1
for (i=1;i<=re1->Text.Length();i++)
if (Nlow[i])
{
re1->SelStart = i-1; // старт выделения текста
re1->SelLength = 1; // конец выделения текста (выделен 1 символ)
re1->SelAttributes->Size=12;
CF.cbSize= sizeof(CF);
CF.yHeight=5;
CF.dwMask= CFM_OFFSET;
CF.yOffset=-70;
SendMessage(re1->Handle,EM_SETCHARFORMAT, SCF_SELECTION, Integer(&CF) );
}
Аналогично ставится верхний регистр, только составляется формат следующим образом.
CF.cbSize= sizeof(CF);
CF.yHeight=5;
CF.dwMask= CFM_OFFSET;
CF.yOffset=200; // знак «+» говорит о том, что символ смещается вверх
На следующих 12 страницах приводится код программы
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.