Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ПП и МЭ
Программа для демонстрации шаблона для численного интегрирования уравнения прогиба плоской пластины (двумерный случай)
Факультет: РЭФ
Группа: РМС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 страницах приводится код программы
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.