МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Ижевский государственный технический университет имени М.Т. Калашникова» Институт «СТМАиМ» Кафедра «Мехатронные системы» Работа защищена с оценкой « » Дата Подпись / КУРСОВАЯ РАБОТА по дисциплине «ОВТиОСвМиР3» на тему «Разработка трехмерной модели манипулятора в MASM32» Выполнил Студент гр. Б20-311-1 Кислицин Р.В. Руководитель Доцент, к.ф.-м.н. Лекомцев П.В. Рецензия: степень достижения поставленной цели работы полнота разработки темы уровень самостоятельности работы обучающегося недостатки работы Ижевск, 2022 Содержание Задание ............................................................................................................. 3 Введение........................................................................................................... 4 1. Разработка алгоритма. ............................................................................. 5 1.1 Разработка математического алгоритма. ........................................... 5 1.2 Обратная задача .................................................................................... 7 1.3 Движение по траектории ..................................................................... 8 2. Разработка схемы алгоритма. ................................................................. 9 2.1 Схемы алгоритмов процессов программы ........................................... 10 3. Разработка программы. ......................................................................... 12 4. Вычислительный эксперимент. ............................................................ 23 Заключение .................................................................................................... 24 Список литературы ....................................................................................... 25 Приложение А. Руководство пользователя ................................................ 26 2 Задание Разработать алгоритм и программу, осуществляющую построение трехмерной модели трёхзвенного манипулятора на языке программирования ассемблер. В модели и программе предусмотреть: 1) 2) Язык программирования – ассемблер Управление звеньями манипулятора; 3) Изменение точки наблюдения; 4) Масштабирование модели; 5) Движение выходного звена по заданной траектории; 6) Возможность одновременного выполнения п.3,4,5 путем внесения задач в отдельные вычислительные потоки; 7) Справку о программе и клавишах управления. Схема манипулятора представлена на рисунке 1. Формы звеньев произвольные. Форма траектории: Синусоида Рисунок 1 – Схема манипулятора. 3 Введение В ходе выполнения курсовой работы разработаны: алгоритм и программа создания модели робота-манипулятора. Разработанная программа выполнена в виде оконного приложения в среде программирования ассемблер. В данной работе представлены схемы алгоритмов, математические алгоритмы перемещения манипулятора, текст программы создания трехмерной модели робота-манипулятора. 4 1. Разработка алгоритма. Представим манипулятор в локальной системе координат в начальном положении в виде массива точек на концах стрежней проволочной модели. 1.1 Разработка математического алгоритма. Для определения положения манипулятора в пространстве необходимы углы поворотов первого, второго и третьего звеньев. Математический алгоритм преобразования взаимного положения звеньев представляет собой преобразование координат с помощью матриц поворота и переноса – видового преобразования. Далее происходит переход от мировых координат к камере при помощи матрицы перехода. Затем осуществляется перспективное искажение с помощью проекционной матрицы и получение экранных координат. Преобразования координат происходят в однородной системе координат. Составим конечные матрицы видового преобразования для каждого точки модели: 5 где, TL1, TL1+L2, TL1+L2+L3 – матрицы переноса с соответствующими длинами звеньев, My – матрица поворота вокруг оси Y, MZ1, MZ2 – матрицы поворота вокруг оси Z. Матрица перехода от мировых координат к камерным выглядит следующим образом: View = Tdist ⋅ My ⋅ MX (7) где Tdist – матрица переноса с дистанцией до точки наблюдения, MY, MX – матрицы поворота вокруг осей X, Y с соответствующими углами поворота камеры. Матрица проекции представлена в формуле (8): 6 1.2 Обратная задача Конечные формулы для нахождения двух углов манипулятора представлены на рисунке 2. Рисунок 2 - Формулы для нахождения углов манипулятора Обозначения: a – длина второго звена, c – длина третьего звена, b — расстояние между началом второго звена и заданной точкой в пространстве; Cx, Cy — координаты точки начала второго звена; AY, AX – координаты заданной точки в пространстве. 7 1.3 Движение по траектории Согласно индивидуальному заданию требуется перемещать выходную точку конечного звена манипулятора по траектории синусоида. Внешний вид синусоиды представлен на рисунке 3. Синусоида – это плоская кривая, задаваемая в прямоугольных координатах уравнением: (9) где a,b,с,d — постоянные. a характеризует сдвиг графика по оси Oy. Чем больше a, тем выше поднимается график; b характеризует растяжение графика по оси Oy. Чем больше увеличивается b, тем сильнее возрастает амплитуда колебаний; с характеризует растяжение графика по оси Ox. При увеличении c частота колебаний повышается ; d характеризует сдвиг графика по оси Ox. При увеличении d график двигается в отрицательном направлении оси абсцисс. Рисунок 2 — Внешний вид синусоиды 8 Исходя из 2. Разработка схемы алгоритма. математического анализа, была составлена математического алгоритм для на Рисунке 3, блок-схема описывающая последовательность действий, согласно всем условиям. Рисунок 3 – Схема алгоритма программы 9 2.1 Схема алгоритма процесса программы Исходя из задачи, была составлена блок-схема на Рисунке 4, описывающая последовательность действий, согласно которой выполняются все требования. Рисунок 4 – Схема алгоритма программы 10 Рисунок 5 – Продолжение 11 Разработка программы. Текст программы, представлен на рисунках 6 - 15 .686: .xmm .model flat, stdcall option casemap: none include \masm32\include\windows.inc include \masm32\include\gdi32.inc include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\gdi32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib WinMain proto :DWORD, :DWORD, :DWORD, :DWORD .data AppName db "Манипулятор-ВПП", 0 sz_Wind dd 1024, 720 sz_Obj dd 100.0, 20.0, 5.0, 2.0 Platforma dd 0.0, 0.0, -20.0, 1.0 Zv_1 dd 'Z', 0.0, 0.0, 200.0, 1.0, 0.0 Zv_2 dd 'z', -60.0, 0.0, 60.0, 1.0, 0.0 Zv_3 dd 'x', -180.0, 0.0, 0.0, 1.0, 0.0 Lim_Zv_1 dd -1800.0, 1800.0, 2.0, -2.0 Lim_Zv_2 dd -160.0, 0.0, 2.0, -2.0 Lim_Zv_3 dd 0.0, 140.0, 2.0, -2.0 Lim_Zoom dd 10.0, 5.0, 20.0, 1.0, -1.0 Art_IK dd -180.0, 0.0, 200.0, 1.0 A dd 1.0 B dd 5.0 XY0 dd 512, 480 ReCalMesh dd 1 RePaint dd 0 AnimIK dd -1 Radius dd 50.0 DEG dd 0 DEG_90 dd 90.0 DEG_PI dd 180.0 Rxyz dd 6, 10, 9, 5, 0, \ 8, 10, 2, 0, 5, \ 1, 5, 4, 0, 10 Matr_View dd -1.0, 0.0, 0.0, 0.0, \ 0.0, 0.0, 1.0, 0.0, \ 0.0, -1.0, 0.0, 0.0, \ 0.0, 0.0, 0.0, 1.0 StepRot dd 2.0, -2.0 Mesh0 dd 32 dup(?) Mesh1 dd 32 dup(?) Mesh2 dd 32 dup(?) Mesh3 dd 32 dup(?) Dot_0 dd 4 dup(?) Dot_IK dd 4 dup(?) WindowClass db "Window", 0 ButtonClass db "Button", 0 ButtonText db "Инв. кин.", 0 TextH db "Помощь(H)", 0 Рисунок 6 – Текст программы 12 TextHelp db "W/A/S/D - Вращение вида", 13, 10, \ "Q/E - Масштабирование вида", 13, 10, \ "U/J - Управление 1-ым звеном", 13, 10, \ "I/K - Управление 2-ым звеном", 13, 10, \ "O/L - Управление 3-им звеном", 13, 10, 0 hInstance HINSTANCE ? CommandLine LPSTR ? hButton HWND ? .const X0 equ 320 Y0 equ 240 .code start: finit fldpi fdiv DEG_PI fstp DEG_PI invoke GetModuleHandle, 0 mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain, hInstance, 0, CommandLine, 1 invoke ExitProcess, 0 Mul_Matr proc lp_M:DWORD, lp_V:DWORD, lp_RS:DWORD pushad mov ecx, 40h mov esi, lp_V movups XMM0, [esi] mov esi, lp_M xorps XMM3, XMM3 m0: movups XMM1, XMM0 shufps XMM1, XMM1, 0FFh movups XMM2, [esi+ecx-10h] mulps XMM1, XMM2 addps XMM3, XMM1 shufps XMM0, XMM0, 093h sub ecx, 10h jnz m0 mov esi, lp_RS movups [esi], XMM3 popad ret Mul_Matr endp Rot_Matr proc axis:DWORD, angle:DWORD, lp_RS:DWORD pushad mov ecx, axis sub ecx, 'X' lea ecx, [ecx*4+ecx] lea esi, [Rxyz+ecx*4] mov edi, lp_RS xorps XMM0, XMM0 mov ecx, 40h m0: movups [edi+ecx-10h], XMM0 sub ecx, 10h jnz m0 fld angle ; Mul_Matr = (Матр*Вект) ; Rot_Matr = (Матр Вращ) Рисунок 7 – Продолжение 13 fmul DEG_PI fsincos fld st(1) fchs fld st(1) fld1 fst dword ptr[edi+60] mov ecx, 5 m1: mov ebx, dword ptr[esi+ecx*4-4] fstp dword ptr[edi+ebx*4] loop m1 popad ret Rot_Matr endp Add_Vect proc lp_V1:DWORD, lp_V2:DWORD, lp_RS:DWORD pushad mov esi, lp_V1 movups XMM0, [esi] mov esi, lp_V2 movups XMM1, [esi] addps XMM0, XMM1 mov esi, lp_RS movups [esi], XMM0 fld1 fstp dword ptr[esi+12] popad ret Add_Vect endp Shf_Vect proc axis:DWORD, dist:DWORD, lp_RS:DWORD pushad mov esi, lp_RS xorps XMM0, XMM0 movups [esi], XMM0 fld dist mov ecx, axis sub ecx, 'x' fstp dword ptr[esi+ecx*4] fld1 fstp dword ptr[esi+12] popad ret Shf_Vect endp Dot_Mesh proc axis:DWORD, dist:DWORD, lp_RS:DWORD pushad mov esi, lp_RS xorps XMM0, XMM0 movups [esi], XMM0 sub esp, 10h mov esi, esp mov ebx, axis sub ebx, 'W' mov axis, 'z' mov ecx, 3 m0: cmp ebx, ecx je m1 invoke Shf_Vect, axis, dist, esi ; Add_Vect = (Вект+Вект) ; Shf_Vect = (Вект Смещ) ; Dot_Mesh = (Точк Меша) Рисунок 8 – Продолжение 14 invoke Add_Vect, esi, lp_RS, lp_RS m1: dec axis loop m0 add esp, 10h popad ret Dot_Mesh endp Lin_Mesh proc axis:DWORD, lp_V:DWORD, lp_RS:DWORD pushad mov esi, lp_V mov edi, lp_RS movups XMM0, [esi] movups [edi], XMM0 sub esp, 40h mov esi, esp invoke Rot_Matr, axis, DEG_90, esi mov ecx, 3 m0: invoke Mul_Matr, esi, edi, addr [edi+10h] add edi, 10h loop m0 add esp, 40h popad ret Lin_Mesh endp Shf_Mesh proc lp_LN:DWORD, lp_V:DWORD, lp_RS:DWORD pushad mov edi, lp_RS mov esi, lp_V push dword ptr [esi+12] mov dword ptr [esi+12], 0 movups XMM0, [esi] pop dword ptr [esi+12] mov esi, lp_LN mov ecx, 4 xor ebx, ebx m0: movups XMM1, [esi+ebx] addps XMM1, XMM0 movups [edi+ebx], XMM1 add ebx, 10h loop m0 popad ret Shf_Mesh endp Reg_Mesh proc axis:DWORD, value:DWORD, lp_LN:DWORD pushad sub esp, 40h mov esi, esp mov edi, lp_LN mov ecx, 8 cmp axis, 'x' jge m0 invoke Rot_Matr, axis, value, esi m1: invoke Mul_Matr, esi, edi, edi add edi, 10h loop m1 jmp m3 ; Lin_Mesh = (Квад Меша) ; Shf_Mesh = (Смещ Меша) ; Reg_Mesh = (Отнс Меша) Рисунок 9 - Продолжение 15 m0: invoke Shf_Vect, axis, value, esi m2: invoke Add_Vect, esi, edi, edi add edi, 10h loop m2 m3: add esp, 40h popad ret Reg_Mesh endp Cal_Mesh proc num:DWORD ; Cal_Mesh = (Расч Меша) cmp num, 3 jg m4 je m3 cmp num, 1 jg m2 jl m0 invoke Dot_Mesh, 'Z', sz_Obj, addr Mesh0 invoke Lin_Mesh, 'Z', addr Mesh0, addr Mesh0 invoke Dot_Mesh, 'Z', sz_Obj, addr Mesh0+40h invoke Lin_Mesh, 'Z', addr Mesh0+40h, addr Mesh0+40h invoke Shf_Mesh, addr Mesh0+40h, addr Platforma, addr Mesh0+40h m2: invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh1 invoke Lin_Mesh, 'Z', addr Mesh1, addr Mesh1 invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh1+40h invoke Lin_Mesh, 'Z', addr Mesh1+40h, addr Mesh1+40h invoke Shf_Mesh, addr Mesh1+40h, addr Zv_1+4, addr Mesh1+40h invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh1 m3: invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh2 invoke Lin_Mesh, 'Z', addr Mesh2, addr Mesh2 invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh2+40h invoke Lin_Mesh, 'Z', addr Mesh2+40h, addr Mesh2+40h invoke Shf_Mesh, addr Mesh2+40h, addr Zv_2+4, addr Mesh2+40h invoke Reg_Mesh, Zv_2, Zv_2+20, addr Mesh2 invoke Shf_Mesh, addr Mesh2, addr Zv_1+4, addr Mesh2 invoke Shf_Mesh, addr Mesh2+40h, addr Zv_1+4, addr Mesh2+40h invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh2 m4: invoke Dot_Mesh, 'X', sz_Obj+8, addr Mesh3 invoke Lin_Mesh, 'X', addr Mesh3, addr Mesh3 invoke Dot_Mesh, 'X', sz_Obj+8, addr Mesh3+40h invoke Lin_Mesh, 'X', addr Mesh3+40h, addr Mesh3+40h invoke Shf_Mesh, addr Mesh3+40h, addr Zv_3+4, addr Mesh3+40h invoke Reg_Mesh, Zv_3, Zv_3+20, addr Mesh3 invoke Shf_Mesh, addr Mesh3, addr Zv_2+4, addr Mesh3 invoke Shf_Mesh, addr Mesh3+40h, addr Zv_2+4, addr Mesh3+40h invoke Reg_Mesh, Zv_2, Zv_2+20, addr Mesh3 invoke Shf_Mesh, addr Mesh3, addr Zv_1+4, addr Mesh3 invoke Shf_Mesh, addr Mesh3+40h, addr Zv_1+4, addr Mesh3+40h invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh3 movups XMM0, Mesh3+40h movups XMM1, Mesh3+60h addps XMM0, XMM1 movups XMM1, sz_Obj shufps XMM1, XMM1, 0FFh divps XMM0, XMM1 movups Dot_0, XMM0 m0: ret Cal_Mesh endp Dot_Draw proc hdc:DWORD, lp_M:DWORD, lp_V:DWORD, lp_XY:DWORD Точк) ; Dot_Draw = (Рисн Рисунок 10 - Продолжение 16 pushad sub esp, 10h mov esi, esp invoke Mul_Matr, lp_M, lp_V, esi mov edi, lp_XY mov ecx, 2 m0: fld dword ptr[esi+ecx*4-4] fmul Lim_Zoom fidiv Rxyz+4 fiadd dword ptr[edi+ecx*4-4] fistp dword ptr[esi+ecx*4-4] loop m0 invoke MoveToEx, hdc, [esi], [esi+4], 0 invoke LineTo, hdc, [esi], [esi+4] add esp, 10h popad ret Dot_Draw endp Lin_Draw proc hdc:DWORD, lp_M:DWORD, lp_V1:DWORD, lp_V2:DWORD, lp_XY:DWORD (Рисн Лини) pushad sub esp, 20h mov esi, esp invoke Mul_Matr, lp_M, lp_V1, esi invoke Mul_Matr, lp_M, lp_V2, addr [esi+10h] mov edi, lp_XY push esi mov ecx, 2 m1: push ecx mov ecx, 2 m0: fld dword ptr[esi+ecx*4-4] fmul Lim_Zoom fidiv Rxyz+4 fiadd dword ptr[edi+ecx*4-4] fistp dword ptr[esi+ecx*4-4] loop m0 add esi, 10h pop ecx loop m1 pop esi invoke MoveToEx, hdc, [esi], [esi+4], 0 invoke LineTo, hdc, [esi+10h], [esi+14h] add esp, 20h popad ret Lin_Draw endp Box_Draw proc hdc:DWORD, lp_M:DWORD, lp_B:DWORD, lp_XY:DWORD Ящик) pushad mov esi, lp_B mov ecx, 3 m0: invoke Lin_Draw, hdc, lp_M, esi, addr [esi+10h], lp_XY invoke Lin_Draw, hdc, lp_M, esi, addr [esi+40h], lp_XY invoke Lin_Draw, hdc, lp_M, addr [esi+40h], addr [esi+50h], lp_XY add esi, 10h loop m0 invoke Lin_Draw, hdc, lp_M, esi, addr [esi-30h], lp_XY invoke Lin_Draw, hdc, lp_M, esi, addr [esi+40h], lp_XY ; Lin_Draw = ; Box_Draw = (Рисн Рисунок 11 - Продолжение 17 invoke Lin_Draw, hdc, lp_M, addr [esi+10h], addr [esi+40h], lp_XY popad ret Box_Draw endp Rot_View proc axis:DWORD, angle:DWORD, lp_M:DWORD pushad sub esp, 40h mov esi, esp invoke Rot_Matr, axis, angle, esi mov ecx, 4 m0: invoke Mul_Matr, esi, lp_M, lp_M add lp_M, 10h loop m0 add esp, 40h popad ret Rot_View endp ; Rot_View = (Вращ Вида) Lim_Actn proc lp_D:DWORD, lp_V:DWORD, step:DWORD sub esp, 8 mov esi, lp_V mov edi, lp_D mov ecx, step fld dword ptr[esi+ecx*4+8] fadd dword ptr[edi] fist dword ptr[edi] mov ecx, dword ptr[edi] fld dword ptr[esi] fistp dword ptr[esp] fld dword ptr[esi+4] fistp dword ptr[esp+4] cmp ecx, dword ptr[esp] jge m0 fstp dword ptr[edi] fld dword ptr[esi] jmp m1 m0: cmp ecx, dword ptr[esp+4] jle m1 fstp dword ptr[edi] fld dword ptr[esi+4] m1: fstp dword ptr[edi] ret Lim_Actn endp ; Lim_Actn = (Огрн Движ) Inv_Kinm proc cmp DEG, 360 jne m0 mov DEG, 0 m0: xorps XMM0, XMM0 movups Dot_IK, XMM0 shl DEG, 3 fild DEG fmul A fmul DEG_PI fsin fmul Radius fstp Dot_IK+8 fldz fstp Dot_IK+4 ; Inv_Kinm = (Инвр Кинм) Рисунок 12 - Продолжение 18 shr DEG, 3 invoke Add_Vect, addr Art_IK, addr Dot_IK, addr Dot_IK fild DEG fstp Zv_1+20 fld Dot_IK+8 fsub Zv_1+12 fsub Zv_2+12 fstp Zv_2+20 fld Dot_IK fmul st(0), st(0) fld Dot_IK+4 fmul st(0), st(0) faddp st(1), st(0) fsqrt fadd Zv_2+4 fadd Zv_3+4 fchs fstp Zv_3+20 sub esp, 40h mov esi, esp invoke Rot_Matr, 'Z', Zv_1+20, esi invoke Mul_Matr, esi, addr Dot_IK, addr Dot_IK add esp, 40h inc DEG ret Inv_Kinm endp Art_Kinm proc hdc:DWORD, lp_M:DWORD, lp_V:DWORD, lp_XY:DWORD Кинм) pushad sub esp, 10h mov esi, esp xorps XMM0, XMM0 mov ecx, 360 m0: push ecx shl dword ptr[esp], 3 movups [esi], XMM0 fild dword ptr[esp] fmul A fmul DEG_PI fsin fmul Radius fstp dword ptr[esi+8] fldz fstp dword ptr[esi+4] mov dword ptr[esp], ecx fild dword ptr[esp] fstp dword ptr[esp] pop eax invoke Add_Vect, lp_V, esi, esi sub esp, 40h mov edi, esp invoke Rot_Matr, 'Z', eax, edi invoke Mul_Matr, edi, esi, esi add esp, 40h invoke Dot_Draw, hdc, lp_M, esi, lp_XY loop m0 add esp, 10h popad ; Art_Kinm = (Рисн Рисунок 13 - Продолжение 19 ret Art_Kinm endp Controls proc key:DWORD ; Controls = (Управлени) cmp key, VK_W jne m0 invoke Rot_View, 'X', StepRot, addr Matr_View m0: cmp key, VK_A jne m1 invoke Rot_View, 'Y', StepRot, addr Matr_View m1: cmp key, VK_S jne m2 invoke Rot_View, 'X', StepRot+4, addr Matr_View m2: cmp key, VK_D jne m3 invoke Rot_View, 'Y', StepRot+4, addr Matr_View m3: cmp key, VK_U jne m4 invoke Lim_Actn, addr Zv_1+20, addr Lim_Zv_1, 0 mov ReCalMesh, 2 m4: cmp key, VK_J jne m5 invoke Lim_Actn, addr Zv_1+20, addr Lim_Zv_1, 1 mov ReCalMesh, 2 m5: cmp key, VK_I jne m6 invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 0 mov ReCalMesh, 3 m6: cmp key, VK_K jne m7 invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 1 mov ReCalMesh, 3 m7: cmp key, VK_O jne m8 invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 0 mov ReCalMesh, 4 m8: cmp key, VK_L jne m9 invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 1 mov ReCalMesh, 4 m9: cmp key, VK_Q jne mA invoke Lim_Actn, addr Lim_Zoom, addr Lim_Zoom+4, 0 mA: cmp key, VK_E jne mB invoke Lim_Actn, addr Lim_Zoom, addr Lim_Zoom+4, 1 mB: cmp key, VK_H jne mC invoke MessageBox, 0, addr TextHelp, addr TextH, MB_OK mC: ret Controls endp WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize, SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc Рисунок 14 - Продолжение 20 mov wc.cbClsExtra, 0 mov wc.cbWndExtra, 0 push hInstance pop wc.hInstance mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszClassName, OFFSET WindowClass invoke LoadIcon, 0, IDI_APPLICATION mov wc.hIcon, eax mov wc.hIconSm, eax invoke LoadCursor, 0, IDC_ARROW mov wc.hCursor, eax invoke RegisterClassEx, addr wc invoke CreateWindowEx, 0, addr WindowClass, addr AppName, WS_SYSMENU, \ CW_USEDEFAULT, CW_USEDEFAULT, sz_Wind, sz_Wind+4, 0, 0, hInst, 0 mov hwnd,eax invoke ShowWindow, hwnd, SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, addr msg, 0, 0, 0 .BREAK .IF (!eax) invoke TranslateMessage, addr msg invoke DispatchMessage, addr msg .ENDW mov eax, msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL pen:HBRUSH .IF uMsg==WM_DESTROY invoke PostQuitMessage, 0 .ELSEIF uMsg==WM_CREATE invoke CreateWindowEx, 0, addr ButtonClass, addr ButtonText, \ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, \ 10, 10, 160, 30, hWnd, 1, hInstance, 0 mov hButton, eax invoke Cal_Mesh, 1 .ELSEIF uMsg==WM_COMMAND mov eax, wParam .IF lParam==0 .IF ax==1 not AnimIK invoke SetFocus, hWnd .ELSE invoke DestroyWindow, hWnd .ENDIF .ELSE .IF ax==1 shr eax, 16 .IF ax==BN_CLICKED invoke SendMessage, hWnd, WM_COMMAND, 1, 0 .ENDIF .ENDIF .ENDIF .ELSEIF uMsg==WM_KEYDOWN mov eax, wParam invoke Controls, eax invoke Cal_Mesh, ReCalMesh Рисунок 14 - Продолжение 21 mov ReCalMesh, 0 mov RePaint, 0 .ELSEIF uMsg==WM_PAINT invoke BeginPaint, hWnd, addr ps mov hdc, eax invoke CreatePen, 0, 2, 0FF0000h invoke SelectObject, hdc, eax invoke Box_Draw, hdc, addr Matr_View, addr Mesh0, addr XY0 invoke Box_Draw, hdc, addr Matr_View, addr Mesh1, addr XY0 invoke Box_Draw, hdc, addr Matr_View, addr Mesh2, addr XY0 invoke Box_Draw, hdc, addr Matr_View, addr Mesh3, addr XY0 cmp AnimIK, 0 jne s0 invoke CreatePen, 0, 4, 0FF00h invoke SelectObject, hdc, eax invoke Art_Kinm, hdc, addr Matr_View, addr Art_IK, addr XY0 s0: invoke CreatePen, 0, 10, 0FFh invoke SelectObject, hdc, eax invoke Dot_Draw, hdc, addr Matr_View, addr Dot_0, addr XY0 invoke TextOut, hdc, 10, 660, addr TextH, sizeof TextH invoke EndPaint, hWnd, addr ps invoke UpdateWindow, hButton invoke Sleep, 30 .ELSE invoke DefWindowProc, hWnd, uMsg, wParam, lParam .IF AnimIK==0 invoke Inv_Kinm invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 0 invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 1 invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 0 invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 1 invoke Cal_Mesh, 2 mov RePaint, 0 .ENDIF .IF RePaint==0 invoke InvalidateRect, hWnd, 0, TRUE not RePaint .ENDIF ret .ENDIF xor eax,eax ret WndProc endp end start Рисунок 15 - Продолжение 22 3.Вычислительный эксперимент. На рисунках 18-19 представлены вид окна и результаты вычислительных экспериментов в различных режимах работы программы. Рисунок 16 – Окно программы Рисунок 17 – Управление звеньями манипулятора с клавиатуры 23 Заключение В ходе выполнения данной курсовой работы были разработаны алгоритм и программа ассемблер. Программа осуществляет построение и графический вывод 3D- модели трехзвенного манипулятора. В модели предусмотрены управление звеньями манипулятора, изменение точки наблюдения, масштабирование модели, движение выходного звена по заданной траектории. Получены и закреплены навыки программирования на языке MASM32. 24 Список литературы 1. ГОСТ 19.504-79. Руководство программисту. Требования к содержанию и оформлению. – Введ. 1980-01-01. – М.: Издательство стандартов, 1979. – 2 с. – (Единая система программной документации) 2. ГОСТ 19.505-79. Руководство оператора. Требования к содержанию и оформлению. – Введ. 1980-01-01. – М.: Издательство стандартов, 1979. – 2 с. – (Единая система программной документации) 3. Игнатенко А. Однородные координаты: учеб-метод пособие / сост. Игнатенко А. - 5 с. 4. Роджерс Д., Адамс Дж. Математические основы машинной графики. М.: Мир, 2001. 604 с. 5. Матрица перехода. Электронная библиотека Wikipedia [ Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Матрица_перехода 6. Эллипс. Электронная библиотека Wikipedia [ Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Эллипс 7. SSE. Электронная библиотека Wikipedia [ Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/SSE 8. Алан Зуккони. Инверсная кинематика в 2Д. [Электронный ресурс]. Режим доступа: https://www.alanzucconi.com/2018/05/02/ik-2d-1/ 25 Приложение А. Руководство пользователя Назначение и условие применение программы. Данное приложение предназначена трехзвенного для графической манипулятора. визуализации Программа трехмерной позволяет модели масштабировать изображение, перемещать звенья манипулятора, изменять точку наблюдения, а также реализует движения по траектории. Рекомендуемые системные требования для программного обеспечения: Процессор Pentium 4 2Гц, Оперативная память 256 Mb, 32-bit разрядная система, 10 Mb свободного места на жёстком диске, Операционная система Windows 7, Мышь, Клавиатура, Монитор. Характеристики программы. Приложение работает в режиме оффлайн, данный дистрибутив может транспортироваться на любом носителе информации. Обращение к программе. Запуск приложения осуществляется через исполняемый файл "manipulator.exe". Управление программой осуществляется использованием клавиатуры: 1. W/A/S/D –Вращение вида 2. Q/E –Масштабирование вида 3. U/J –Управление 1-ым звеном 4. I/K –Управление 2-ым звеном 5. O/L –Управление 3-им звеном 6. H – Помощь 7. Кнопка «Инв. Кин.» – Выполняет движение по траектории Входными данными являются нажатия клавиш клавиатуры Выходные данными являются графическая визуализация трехмерной модели трехзвенного манипулятора. 26