43173

Разработка 3D модели манипулятора в MASM32

Курсовая

Информатика, кибернетика и программирование

В данной работе используются WinApi (Application Programming Interface) функции. Они позволяют пользователю в полной мере использовать все функции предоставленные операционной системой. Одними из областей применения этих функций являются консоли, операции с буфером обмена, управление памятью, управление окнами, файлами, процессами и потоками и т.д. Для построения модели манипулятора с помощью этих функций используется алгоритм видового преобразования, выполняющий умножение матриц и векторов.

Русский

2013-11-03

1.36 MB

22 чел.

Министерство образования и науки РФ

Государственное образовательное учреждение высшего профессионального образования Ижевский государственный технический университет

Кафедра «Мехатронные системы»

Курсовая работа

Дисциплина: «Основы вычислительной техники»

Тема: «Разработка 3D модели манипулятора в MASM32»

Выполнил:  студент гр. 4-05-3

Журавлева Е.В.

Проверил: преподаватель

Лекомцев П. В.

Рецензент: преподаватель

        Караваев Ю.Л.

Ижевск 2011

Содержание

Техническое задание             3

Введение              5

1 Разработка алгоритма           6

1.1 Математический алгоритм преобразования взаимного

положения звеньев         6

1.2 Алгоритм программы построения проволочной модели робота-манипулятора           10

1.3 Схемы алгоритмов процессов программы       11

2 Разработка программы           21

3 Вычислительный  эксперимент         52

Заключение            55

Список литературы           56

Приложение А. Руководство оператора        57

Приложение Б.  Руководство программиста        58

Приложение В. Параметры сечений фигур-примитивов    61


Техническое задание

Разработать алгоритм и программу 3D модели манипулятора. В модели предусмотреть:

  1.  язык программирования - ассемблер;
  2.  среда программирования - MASM32;
  3.  управление звеньями манипулятора;
  4.  изменение точки наблюдения;
  5.  масштабирование модели;
  6.  помощь.

На рисунке 1 представлена кинематическая схема манипулятора.

Рисунок 1 – Кинематическая схема манипулятора

Форма звеньев:

  1.  основание – показано на рисунке 2;
  2.  сечение первого звена – показано на рисунке 3;
  3.  сечение второго звена – показано на рисунке 3;
  4.  сечение третьего звена – показано на рисунке 3;
  5.  сечение четвертого звена–  показано на рисунке 4;
  6.  пятое звено – схват, осуществлен в виде звеньев с сечениями на рисунке 3.

Рисунок 2 - Сечение основания

Рисунок 3 - Сечение первого, второго, третьего звена и сечение схвата

Рисунок 4 - Сечение четвертого звена

                                                      Введение

 Цель курсовой работы: получить практические навыки программирования видовых и перспективных преобразований в MASM32, ознакомиться с расширением SSE инструкций процессора, приобрести навыки работы с математическим сопроцессором, закрепить навыки программирования на ассемблере MASM32 для современных процессоров архитектуры Intel-32.

В ходе выполнения курсовой работы разработаны: алгоритм и программа создания проволочной модели робота-манипулятора.  Разработанная программа выполнена в виде оконного приложения в среде программирования MASM32.

В данной работе представлены схемы алгоритмов, текст программы создания трехмерной проволочной модели робота - манипулятора.

В данной работе используются WinApi (Application Programming Interface) функции. Они позволяют пользователю в полной мере использовать все функции предоставленные операционной системой. Одними из областей применения этих функций являются консоли, операции с буфером обмена, управление памятью, управление окнами, файлами, процессами и потоками и т.д. Для построения модели манипулятора с помощью этих функций используется алгоритм видового преобразования, выполняющий умножение матриц и векторов. Для оптимизации работы программы при этом используются функции параллельных вычислений SSE. SSE (Streaming SIMD Extensions) - расширение инструкций процессора для потоковой обработки в режиме SIMD (Single Instruction Multiple Data), т.е. когда требуется применять одну инструкцию к потоку данных. Блоком SSE осуществляется распараллеливание вычислительного процесса между данными.

 

1 Разработка алгоритма

В данном разделе представлены: математический алгоритм видового преобразования,  схемы алгоритмов создания проволочной модели робота-манипулятора.

  

1.1  Математический алгоритм преобразования взаимного положения звеньев

Математический алгоритм преобразования взаимного положения звеньев

представляет собой преобразование координат с помощью матриц поворота и переноса – видового преобразования.

Видовое преобразование  состоит из 5 видов преобразования:

  1.  перенос начала системы координат;
  2.  поворот координатной системы вокруг оси OX;
  3.  поворот координатной системы вокруг оси OY;
  4.  поворот координатной системы вокруг оси OZ;
  5.  масштабирование системы координат.

Матрица переноса начала системы координат,

где a, b и c – смещение соответственно по осям

OX, OY и OZ (рисунок 5):

Матрица поворота координатной системы

вокруг оси OX на угол φ (рисунок 6):

    

Матрица поворота координатной системы

вокруг оси OY на угол ψ (рисунок 7):

                                 

Матрица поворота координатной системы

вокруг оси OZ на угол χ (рисунок 8):

        

Матрица масштабирования системы координат,

где a, b и c - коэффициенты масштабирования

соответственно по осям OX, OY и OZ (рисунок 9): 

    

                                                                           

Свяжем с каждым звеном механизма особую систему прямоугольных координат (в скобках указаны фигуры-примитивы, которые строятся в этих системах координат):

1) с основанием 0.1 – x0.1, y0.1, z0.1;  

2) с основанием 0.2 – x0.2, y0.2, z0.2;  

3) со звеном 1 – x1, y1, z1;   

4) со звеном 2 – x2, y2, z2;   

5) со звеном 3 – x3, y3, z3;   

6) со звеном 4 – x4, y4, z4;   

7) со звеном 5.1 – x5.1, y5.1, z5.1;  

8) со звеном 5.2 – x5.2, y5.2, z5.2;  

9) со звеном 5.3 – x5.3, y5.3, z5.3.

Составим матричное уравнение перехода от системы координат x5.3, y5.3, z5.3  к системе координат xw, yw, zw, где rw совокупность точек мировых координат и r0.1, r0.2r5.3 совокупность точек в соответствующих локальных системах координат-  Матричное уравнение представлено на рисунке 10.

|rw|=   

Рисунок 10 – Матричное уравнение перехода от мировых координат к видовым

      

          Параметры masst, fi, teta, Offset_position_x, Offset_position_y, Offset_1, Offset_2, Offset_3, Angle_1, Angle_2изменяемые переменные, а именно:

1) masst – переменная в матрице масштабирования. При изменении её значения изменяется масштаб изображения манипулятора;

2) fi – переменная в матрице поворота вокруг оси OX. При изменении её значения изменяется положение изображения вокруг оси OX в окне вывода;

3) teta– переменная в матрице поворота вокруг оси OY. При изменении её значения изменяется положение изображения вокруг оси OY в окне вывода;

4) Offset_position_x и Offset_position_y – переменные, используемые в одной матрице перемещения. При изменении их значений изменяется положение манипулятора в окне вывода по осям OX и OY;

5) Offset_1 – переменная в матрице перемещения. При изменении её значения изменяется положение этой и последующих локальных систем координат по оси OZ в текущей системе;

6)Offset_2 – переменная в матрице перемещения. При изменении её значения изменяется положение этой и последующих локальных систем координат по оси OY в текущей системе;

  1.  Offset_3 – переменная в матрице перемещения. При изменении её значения изменяется положение этой и последующих локальных систем координат по оси OX в текущей системе;
  2.  Angle_1 – переменная в матрице поворота вокруг оси OY. При изменении её значения изменяется положение этой и последующих локальных систем координат вокруг оси OY в текущей системе;
  3.  Angle_2 – переменная в матрице поворота вокруг оси OZ. При изменении её значения изменяется положение этой и последующих локальных систем координат вокруг оси OZ в текущей системе;

1.2  Алгоритм программы построения проволочной модели робота-манипулятора

Схема алгоритма программы построения проволочной модели робота-манипулятора приведена на рисунке 11.

Рисунок  11 – Схема алгоритма программы построения проволочной модели робота-манипулятора


1.3 Схемы алгоритмов процессов программы

В данном разделе приведены схема алгоритма процедуры WndProc, обрабатывающей сообщения, поступающие от окна, схема типового алгоритма построения фигур-примитивов заданного сечения (Box, DvuTavr и т.д.), схемы алгоритмов создания матриц поворота вокруг осей OX, OY, OZ, матрицы переноса и матрицы масштабирования, а также алгоритмы процедур MxPush, сохраняющей текущее положение локальной системы координат в памяти, MxPop, загружающей последнее сохраненное положение локальной системы координат и MultiplyAll, перемножающей массив точек на массив матриц. В процедуре WndProc реализована корректировка параметров манипулятора и камеры, а также построение звеньев манипулятора.

Алгоритм процедуры WinMain не представлен, так как в ней последовательно вызываются стандартные команды создания класса окна.

Схема алгоритма процедуры WndProc представлена на рисунке 12, схема типового алгоритма для функций построения фигур примитивов – на рисунке 13,

схема алгоритма процедуры MultiplyAll – на рисунке 14, схемы алгоритмов создания матриц поворота вокруг осей OX, OY, OZ, матрицы переноса и матрицы масштабирования представлены соответственно на рисунках 15, 16, 17; схемы алгоритмов процедур MxPush, MxPop  представлены соответственно на рисунках 18 и 19.

Рисунок 12 – Схема алгоритма процедуры WndProc

Рисунок 12 – Продолжение

Рисунок 12 – Продолжение

Рисунок 12 – Продолжение

Рисунок 12 – Продолжение

Рисунок 13 – Схема типового алгоритма построения фигур-примитивов

Рисунок 14 – Схема алгоритма перемножения массива точек на  массив матриц

Рисунок 15 – Схема алгоритма функции формирования матриц поворота

Рисунок 16 – Схема алгоритма функции формирования матрицы переноса

Рисунок 16 - Продолжение

Рисунок 17 – Схема алгоритма функции формирования матрицы масштабирования

Рисунок 18 – Схема алгоритма процедуры сохранения матрицы в «стек» матриц

Рисунок 19 – Схема алгоритма процедуры выгрузки матрицы из «стека» матриц

2  Разработка программы

Текст программы создания трехмерной проволочной модели робота-манипулятора представлен на рисунке 20.

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Заголовки

.686

.XMM

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

include \masm32\include\gdi32.inc

includelib \masm32\lib\gdi32.lib

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

;include \masm32\include\dialogs.inc

;include \masm32\include\masm32.inc

;includelib \masm32\lib\masm32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>         

;Прототипы функций

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

dlgproc   PROTO :DWORD,:DWORD,:DWORD,:DWORD

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Сегмент данных

.data

;дефайн

; -------------------------------------------------------------------------

intgr  equ 0

frct    equ 1

; -------------------------------------------------------------------------

hello_title db "First win32 gui programm",0

hello_message db ?,0

ClassName db "SimpleWinClass",0

Рисунок 20 - Текст программы создания трехмерной проволочной модели робота-манипулятора

AppName  db "Курсовая работа 4 семестр. Нажмите H для вызова окна справки",0

Uno     dd 1.0             ;вещественная единица

FPUB   dd 0.0             ;буфер сопроцессора  DD 0.1

; мои даты

helpMsg db 'Программу сделала студентка гр. 4-05-3 Журавлева Лена',0Ah,0Ah,'Клавиши управления:',0Ah,'Up/Down/Left/Right/Mouse - поврот изображения',0Ah,'A-S-переместить 1-е звено',0Ah,'Q-W-поворот 2-го звена',0Ah,'D-F-переместить звено 3',0Ah,'E-R-поворот 4-го звена',0Ah,'Z-X-сжать/разжать захват',0Ah,'Колесо мыши-приблизить/удалить',0Ah,0Ah,'ИжГТУ 2011г',0

helptext db 'Справка',0

;массивы

; -------------------------------------------------------------------------

MasPoints          dd 4096 dup(0.0)                                    ;массив обрабатываемых точек

MasPointsQ       dd 0                                                       ;указатель массива обрабатываемых точек

MasMatrix        dd  512 dup (0.0)                                     ;стек матриц (макс 32матрицы по 16 элементов)

ThisMatrix      dd 0                                                          ;указатель массива матриц

MasNumberOfMatrix    dd  32 dup(0)                                ;массив указателей (макс глубина стека - 32 матрицы))

ThisNumber  dd 0                                                           ;указатель массива указателей

; -------------------------------------------------------------------------

;размеры окна

; -------------------------------------------------------------------------

winwidth   dd 1024  ;ширина

winheight  dd 768   ;высота

; -------------------------------------------------------------------------

;координаты мыши

; -------------------------------------------------------------------------

MouseY      dd 0.0

MouseX      dd 0.0

MouseX_previous dd 0.0

MouseY_previous dd 0.0

MouseM dd 0

; -------------------------------------------------------------------------

.data?

hInstance HINSTANCE ?

CommandLine LPSTR ?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Макросы

;макрос установки RGB цвета

; -------------------------------------------------------------------------

RGB MACRO red, green, blue

mov al,blue

Рисунок 20 - Продолжение  

shl eax,8  

add al,green  

shl eax,8   

add al,red   

and eax,0FFFFFFh  

 ENDM

; -------------------------------------------------------------------------

;макрос прямой записи в память

; -------------------------------------------------------------------------

movm    MACRO dst, src

           push eax

           mov eax, src

           mov dst, eax

           pop eax

           ENDM

; -------------------------------------------------------------------------

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Сегмент кода

.code

;создание окна

start:

invoke GetModuleHandle, NULL

mov    hInstance,eax

invoke GetCommandLine

mov    CommandLine,eax

invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

invoke ExitProcess,eax

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Функция работы с окном

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX

LOCAL msg:MSG

LOCAL hwnd:HWND

     LOCAL Pen:HBRUSH

     

mov   wc.cbSize,SIZEOF WNDCLASSEX

mov   wc.style, CS_HREDRAW or CS_VREDRAW

mov   wc.lpfnWndProc, OFFSET WndProc

mov   wc.cbClsExtra,NULL

Рисунок 20 - Продолжение 

mov   wc.cbWndExtra,NULL

push  hInstance

pop   wc.hInstance

     RGB  50,50,50 ;задаем цвет окна

     invoke CreatePen, 0,2,eax     

       

mov   wc.hbrBackground,eax         

mov   wc.lpszMenuName,NULL

mov   wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_APPLICATION

mov   wc.hIcon,eax

mov   wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW

mov   wc.hCursor,eax

invoke RegisterClassEx, addr wc

INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\

           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\

           CW_USEDEFAULT,winwidth,winheight,NULL,NULL,hInst,NULL

mov   hwnd,eax

invoke ShowWindow, hwnd,SW_SHOWNORMAL

invoke UpdateWindow, hwnd

.WHILE TRUE

 invoke GetMessage, ADDR msg,NULL,0,0

 .BREAK .IF (!eax)

 invoke TranslateMessage, ADDR msg

 invoke DispatchMessage, ADDR msg

.ENDW

mov     eax,msg.wParam

ret

WinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>

;Далее следует блок пользовательских функций. Необходимо иметь ввиду что для каждой

;из них имеется возможность задавать тип числа: целое или дробное. За данный выбор от-

;вечает  спецификатор Typ (Тип) Значение равное 0 задает целый тип вводимых чисел

;единица задает вещественный тип, который в данной программе задается из глобальных

;переменных.

;<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MxRotateX proc Typ:BOOL, Angle:DWORD

; -------------------------------------------------------------------------

;Создание матрицы поворота вокруг оси x

Рисунок 20 - Продолжение 

; [0]=1   [1]=0      [2]=0           [3]=0           0/4/8/12

; [4]=0   [5]=cosA [6]=-sinA     [7]=0           16/20/24/28

; [8]=0   [9]=sinA  [10]=cosA    [11]=0         32/36/40/44

; [12]=0 [13]=0     [14]=0         [15]=1         48/52/56/60

; -------------------------------------------------------------------------

                       pusha

                       lea esi,MasMatrix           ;esi - адрес массива==стека матриц

                       mov ebx,ThisMatrix        ;ebx- сдвиг относительно начала массива (шаг между матрицами 64байта==16двойных слов)

                       cmp Typ,0                     ;если 1 то дробь если 0 то целое

                       jnz no_int

;GRAD to RAD  

                       fild Angle

                       fldpi

                       mov eax,180

                       push eax

                       fild dword ptr [esp]

                       pop eax

                       fdivp st(1), st(0)

                       fmulp st(1), st(0)

                       fstp Angle

no_int:

; -------------------------------------------------------------------------

;формирование матрицы

                       movm dword ptr[esi+ebx],Uno

                       movm dword ptr[esi+ebx+4],0

                       movm dword ptr[esi+ebx+8],0

                       movm dword ptr[esi+ebx+12],0

                       movm dword ptr[esi+ebx+16],0

                       movm dword ptr[esi+ebx+28],0

                       movm dword ptr[esi+ebx+32],0

                       movm dword ptr[esi+ebx+44],0

                       movm dword ptr[esi+ebx+48],0

                       movm dword ptr[esi+ebx+52],0

                       movm dword ptr[esi+ebx+56],0

                       movm dword ptr[esi+ebx+60],Uno

                       finit

                       fld Angle

                       fcos

                       fstp FPUB

                       movm dword ptr[esi+ebx+20],FPUB

                       movm dword ptr[esi+ebx+40],FPUB

                       fld Angle

                       fsin

                       fst FPUB

                       movm dword ptr[esi+ebx+36],FPUB

                       fchs

                       fstp FPUB

                       movm dword ptr[esi+ebx+24],FPUB

;конец формирования матрицы                        

; -------------------------------------------------------------------------

Рисунок 20 - Продолжение 

                       add ThisMatrix,64 ;- следующая матрица

                       popa

                       ret

MxRotateX endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MxRotateY proc Typ:BOOL, Angle:DWORD

; -------------------------------------------------------------------------

;Создание матрицы поворота вокруг оси y

; [0]=cosA   [1]=0      [2]=sinA       [3]=0           0/4/8/12

; [4]=0        [5]=1      [6]=0           [7]=0           16/20/24/28

; [8]=-sinA   [9]=0      [10]=cosA    [11]=0         32/36/40/44

; [12]=0       [13]=0    [14]=0         [15]=1         48/52/56/60

; -------------------------------------------------------------------------

                       pusha

                       lea esi,MasMatrix           ;esi - адрес массива==стека матриц

                       mov ebx,ThisMatrix        ;ebx- сдвиг относительно начала массива (шаг между матрицами 64байта==16двойных слов)

                       cmp Typ,0                     ;если 1 то дробь если 0 то целое

                       jnz no_int

;GRAD to RAD  

                       fild Angle

                       fldpi

                       mov eax,180

                       push eax

                       fild dword ptr [esp]

                       pop eax

                       fdivp st(1), st(0)

                       fmulp st(1), st(0)

                       fstp Angle

no_int:

; -------------------------------------------------------------------------

;формирование матрицы

                       movm dword ptr[esi+ebx+4],0

                       movm dword ptr[esi+ebx+12],0

                       movm dword ptr[esi+ebx+16],0

                       movm dword ptr[esi+ebx+20],Uno

                       movm dword ptr[esi+ebx+24],0                        

                       movm dword ptr[esi+ebx+28],0

                       movm dword ptr[esi+ebx+36],0

                       movm dword ptr[esi+ebx+44],0

                       movm dword ptr[esi+ebx+48],0

                       movm dword ptr[esi+ebx+52],0

                       movm dword ptr[esi+ebx+56],0

                       movm dword ptr[esi+ebx+60],Uno

                       finit

                       fld Angle

                       fcos

Рисунок 20 - Продолжение 

                       fstp FPUB

                       movm dword ptr[esi+ebx],FPUB

                       movm dword ptr[esi+ebx+40],FPUB

                       fld Angle

                       fsin

                       fst FPUB

                       movm dword ptr[esi+ebx+8],FPUB

                       fchs

                       fstp FPUB

                       movm dword ptr[esi+ebx+32],FPUB

;конец формирования матрицы                        

; -------------------------------------------------------------------------

                      add ThisMatrix,64 ;- следующая матрица

                       popa

                       ret

MxRotateY endp                        

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MxRotateZ proc Typ:BOOL, Angle:DWORD

; -------------------------------------------------------------------------

;Создание матрицы поворота вокруг оси z

; [0]=cosA    [1]=-sinA      [2]=0          [3]=0           0/4/8/12

; [4]=sinA     [5]=cosA      [6]=0          [7]=0           16/20/24/28

; [8]=0         [9]=0           [10]= 1       [11]=0         32/36/40/44

; [12]=0       [13]=0           [14]=0       [15]=1         48/52/56/60

; -------------------------------------------------------------------------

                       pusha

                       lea esi,MasMatrix   ;esi - адрес массива==стека матриц

                       mov ebx,ThisMatrix        ;ebx- сдвиг относительно начала массива (шаг между матрицами 64бита==16двойных слов)  

                       cmp Typ,0 ;если 1 то дробь если 0 то целое

                       jnz no_int

;GRAD to RAD  

                       fild Angle

                       fldpi

                       mov eax,180

                       push eax

                       fild dword ptr [esp]

                       pop eax

                       fdivp st(1), st(0)

                       fmulp st(1), st(0)

                       fstp Angle

no_int:                                           

; -------------------------------------------------------------------------

;формирование матрицы

                       movm dword ptr[esi+ebx+8],0

                       movm dword ptr[esi+ebx+12],0

Рисунок 20 - Продолжение 

                       movm dword ptr[esi+ebx+24],0      

                 

                       movm dword ptr[esi+ebx+28],0

                       movm dword ptr[esi+ebx+32],0                        

                       movm dword ptr[esi+ebx+36],0

                       movm dword ptr[esi+ebx+40],Uno

                       movm dword ptr[esi+ebx+44],0

                       movm dword ptr[esi+ebx+48],0

                       movm dword ptr[esi+ebx+52],0

                       movm dword ptr[esi+ebx+56],0

                       movm dword ptr[esi+ebx+60],Uno

                       finit

                       fld Angle

                       fcos

                       fstp FPUB

                       movm dword ptr[esi+ebx],FPUB

                       movm dword ptr[esi+ebx+20],FPUB

                       fld Angle

                       fsin

                       fst FPUB

                       movm dword ptr[esi+ebx+16],FPUB

                       fchs

                       fstp FPUB

                       movm dword ptr[esi+ebx+4],FPUB

;конец формирования матрицы                        

; -------------------------------------------------------------------------

                       add ThisMatrix,64 ;- следующая матрица

                       popa

                       ret

MxRotateZ endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MxTranslate proc Typ:BOOL, zX:BOOL, zY:BOOL, zZ:BOOL, TX:DWORD, TY:DWORD, TZ:DWORD

; -------------------------------------------------------------------------

;HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>HELP!>>>

;Функция переноса. Три бульных параметра это знаки для x, y и z. 0 экв +, 1 экв -.

;Далее идет также же бульный параметр отвечающий за тип задаваемых значений

;<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!<<<HELP!

;Создание матрицы перемещения

; [0]=1         [1]=0           [2]=0          [3]=x           0/4/8/12

; [4]=0         [5]=1           [6]=0          [7]=y           16/20/24/28

; [8]=0         [9]=0           [10]= 1       [11]=z         32/36/40/44

; [12]=0       [13]=0          [14]=0       [15]=1         48/52/56/60

; -------------------------------------------------------------------------

                       pusha

                       lea esi,MasMatrix   ;esi - адрес массива==стека матриц

                       mov ebx,ThisMatrix        ;ebx- сдвиг относительно начала массива (шаг между матрицами 64бита==16двойных слов)

Рисунок 20 - Продолжение 

                      cmp Typ,0

                       jnz Int_param

                       fild TX

                       fstp TX

                       fild TY

                       fstp TY

                       fild TZ

                       fstp TZ

Int_param:

                       cmp zX,0            ;проверяем знаки координат

                       jz x_is_positiv

                       fld TX

                       fchs

                       fstp TX

x_is_positiv:

                       cmp zY,0

                       jz y_is_positiv

                       fld TY

                       fchs

                       fstp TY

y_is_positiv:

                       cmp zZ,0

                       jz z_is_positiv

                       fld TZ

                       fchs

                       fstp TZ

z_is_positiv:                        

; -------------------------------------------------------------------------

;формирование матрицы

                       movm dword ptr[esi+ebx+4],0

                       movm dword ptr[esi+ebx+8],0                        

                       movm dword ptr[esi+ebx+16],0

                       movm dword ptr[esi+ebx+24],0                        

                       movm dword ptr[esi+ebx+32],0                        

                       movm dword ptr[esi+ebx+36],0

                       movm dword ptr[esi+ebx+12],0

                       movm dword ptr[esi+ebx+28],0

                       movm dword ptr[esi+ebx+44],0

                       

                       movm dword ptr[esi+ebx],Uno

                       movm dword ptr[esi+ebx+20],Uno

                       movm dword ptr[esi+ebx+40],Uno

                       movm dword ptr[esi+ebx+60],Uno

                       finit

                       fld TX

                       fstp FPUB

                       movm dword ptr[esi+ebx+48],FPUB

                       fld TY

                       fstp FPUB

                       movm dword ptr[esi+ebx+52],FPUB  

                       fld TZ

Рисунок 20 - Продолжение 

                       fstp FPUB

                       movm dword ptr[esi+ebx+56],FPUB

; -------------------------------------------------------------------------

                       add ThisMatrix,64 ;- следующая матрица

                       popa

                       ret

MxTranslate endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MxScale proc ScaleX:DWORD, ScaleY:DWORD, ScaleZ:DWORD

;Создание матрицы масштаба

; [0]=X         [1]=0           [2]=0          [3]=0           0/4/8/12

; [4]=0         [5]=Y           [6]=0          [7]=0           16/20/24/28

; [8]=0         [9]=0           [10]= Z       [11]=0         32/36/40/44

; [12]=0       [13]=0          [14]=0       [15]=1         48/52/56/60

; -------------------------------------------------------------------------

                       pusha

                       lea esi,MasMatrix           ;esi - адрес массива==стека матриц

                       mov ebx,ThisMatrix        ;ebx- сдвиг относительно начала массива (шаг между матрицами 64бита==16двойных слов)

                       movm dword ptr[esi+ebx],ScaleX

                       movm dword ptr[esi+ebx+4],0

                       movm dword ptr[esi+ebx+8],0

                       movm dword ptr[esi+ebx+12],0

                       movm dword ptr[esi+ebx+16],0

                       movm dword ptr[esi+ebx+20],ScaleY

                       movm dword ptr[esi+ebx+24],0

                       movm dword ptr[esi+ebx+28],0

                       movm dword ptr[esi+ebx+32],0

                       movm dword ptr[esi+ebx+36],0

                       movm dword ptr[esi+ebx+40],ScaleZ

                       movm dword ptr[esi+ebx+44],0

                       movm dword ptr[esi+ebx+48],0

                       movm dword ptr[esi+ebx+52],0

                       movm dword ptr[esi+ebx+56],0

                       movm dword ptr[esi+ebx+60],Uno

                       mov ebx,ThisMatrix

                       add ThisMatrix,64 ;- следующая матрица

                       popa

                       ret

MxScale endp                        

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

MxPush proc

push ebx

lea ebx,MasNumberOfMatrix

add ebx,ThisNumber

movm dword ptr[ebx],ThisMatrix

add ThisNumber,4

pop ebx

ret

MxPush endp

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

MxPop proc

push ebx

lea ebx,MasNumberOfMatrix

add ebx,ThisNumber

sub ebx,4

movm ThisMatrix, dword ptr[ebx]

sub ThisNumber,4

pop ebx

ret

MxPop endp

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

MultiplyAll proc

pusha

; -------------------------------------------------------------------------

;Перемножение всех матриц из массива MasMatrix на все точки массива MasPoint

; -------------------------------------------------------------------------

               lea esi,MasMatrix

               mov ecx,esi

               add esi,ThisMatrix

;далее сравниваем регистры ecx и esi (esi>=ecx)

mul_next_Matrix:

                lea edi,MasPoints

                xor eax,eax

                sub esi,64

mul_next_Point:                

; -------------------------------------------------------------------------

;Умножение координат точки на матрицу

;esi - начало матрицы

;edi - начало массива точек

; -------------------------------------------------------------------------

;загрузить матрицу по столбцам в регистры xmm4-7

                                         movups XMM4, [esi]

                                    movups XMM5, [esi+10h]

                                    movups XMM6, [esi+20h]

Рисунок 20 - Продолжение 

                                    movups XMM7, [esi+30h] 

;загрузить xyz в xmm0

                                               movups XMM0, dword ptr[edi]

; конечный результат будет хранится в XMM2, обнулим его

                                                xorps XMM2, XMM2                                        

;записать x в xmm1, умножить его на первый столбец матрицы (xmm4), и добавить его к результату

                                                movups XMM1, XMM0

                                                shufps XMM1, XMM1, 0

                                                mulps  XMM1, XMM4

                                                addps  XMM2, XMM1

;повторить для y, z и w

                                                movups XMM1, XMM0

                                                shufps XMM1, XMM1, 55h

                                                mulps  XMM1, XMM5

                                                addps  XMM2, XMM1

                                                movups XMM1, XMM0

                                                shufps XMM1, XMM1,0aah

                                                mulps  XMM1, XMM6

                                                addps  XMM2, XMM1

                                                movups XMM1, XMM0

                                                shufps XMM1, XMM1, 0ffh

                                                mulps  XMM1, XMM7

                                                addps  XMM2, XMM1

;записать результат в rez

                                                movups [edi], XMM2

;сейчас в массив rez распаковываются 128 бит из регистра ХММ2 по четыре 32-х разрядных числа.

; -------------------------------------------------------------------------

;конец умножения координат точки на матрицу

; -------------------------------------------------------------------------

              add edi,16

              inc eax

              cmp eax,MasPointsQ

jbe mul_next_Point

              cmp esi,ecx

ja mul_next_Matrix

; -------------------------------------------------------------------------

;Центрируем изображение по х и у

; -------------------------------------------------------------------------

               mov ecx,MasPointsQ

               lea edi, MasPoints

CenterCoord:

               finit

               fld dword ptr[edi]  ;загружаем x

               fld1

               fld1

               fadd

               fild winwidth

               fdivr

               fadd

               frndint

Рисунок 20 - Продолжение 

               fistp dword ptr[edi]

               

               fld dword ptr[edi+4];загружаем y

               fld1

               fld1

               fadd

               fild winheight

               fdivr

               fadd

               frndint

               fistp dword ptr[edi+4]

               

               fld dword ptr[edi+8]  ;загружаем z

               frndint

               fistp dword ptr[edi+8]

               add edi,16

               dec ecx

jnz CenterCoord

popa

               ret

MultiplyAll endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Box proc hndl:DWORD,Typ:BOOL, xL:DWORD, yH:DWORD, zW:DWORD

; -------------------------------------------------------------------------

;процедура рисования прямоугольного параллелепипеда, "коробка"

; -------------------------------------------------------------------------

LOCAL xLM:DWORD

LOCAL yHM:DWORD

LOCAL zWM:DWORD

cmp Typ,0

jnz no_int

               finit

               fild xL

               fstp xL

               fild yH

               fstp yH

               fild zW

               fstp zW

               

               fld xL

               fchs

               fstp xLM

               fld yH

               fchs

               fstp yHM

               fld zW

               fchs

Рисунок 20 - Продолжение 

               fstp zWM

               jmp nextB

no_int:   

               finit

               fld xL

               fchs

               fstp xLM

               fld yH

               fchs

               fstp yHM

               fld zW

               fchs

               fstp zWM

nextB:                            

;заполняем массив вершин коробки (8вершин*4координаты=32элемента)

               mov ecx,8

               mov MasPointsQ,ecx

               lea esi, MasPoints

; -------------------------------------------------------------------------

;устанавливаем каждый четвертый элемент в единицу

; -------------------------------------------------------------------------

               mov ebx,12

write_unoB:

               movm dword ptr[ebx+esi],Uno

               add ebx,16

               dec ecx

               jnz write_unoB

; -------------------------------------------------------------------------

;пишем вершины. После преобразования получим массив:

;    (1)---1(2)+--1(3)+-+1(4)--+1(5)-+-1(6)++-1(7)+++1(8)-++1

;     |         |         |         |          |         |         |         |

;    esi   esi+16    +32     +48     +64      +80    +96     +112    

; -------------------------------------------------------------------------

             movm dword ptr [esi],xLM

             movm dword ptr [esi+4],yHM

             movm dword ptr [esi+8],zWM              

             movm dword ptr [esi+16],xL

             movm dword ptr [esi+20],yHM

             movm dword ptr [esi+24],zWM

             movm dword ptr [esi+32],xL

             movm dword ptr [esi+36],yHM

             movm dword ptr [esi+40],zW

             movm dword ptr [esi+48],xLM

             movm dword ptr [esi+52],yHM

             movm dword ptr [esi+56],zW

             movm dword ptr [esi+64],xLM

             movm dword ptr [esi+68],yH

             movm dword ptr [esi+72],zWM

             movm dword ptr [esi+80],xL

             movm dword ptr [esi+84],yH

             movm dword ptr [esi+88],zWM

Рисунок 20 - Продолжение 

             movm dword ptr [esi+96],xL

             movm dword ptr [esi+100],yH

             movm dword ptr [esi+104],zW

             movm dword ptr [esi+112],xLM

             movm dword ptr [esi+116],yH

             movm dword ptr [esi+120],zW   

; -------------------------------------------------------------------------

invoke MultiplyAll                

; -------------------------------------------------------------------------

lea esi,MasPoints

;соединяем точки

             invoke MoveToEx, hndl, dword ptr[esi],dword ptr[esi+4],NULL;1

             invoke LineTo, hndl,dword ptr[esi+16],dword ptr[esi+20];1-2

             invoke LineTo, hndl,dword ptr[esi+32],dword ptr[esi+36];2-3

             invoke LineTo, hndl,dword ptr[esi+48],dword ptr[esi+52];3-4

             invoke LineTo, hndl,dword ptr[esi],dword ptr[esi+4];4-1

             invoke LineTo, hndl,dword ptr[esi+64],dword ptr[esi+68];1-5

             invoke LineTo, hndl,dword ptr[esi+80],dword ptr[esi+84];5-6

             invoke LineTo, hndl,dword ptr[esi+96],dword ptr[esi+100];6-7

             invoke LineTo, hndl,dword ptr[esi+112],dword ptr[esi+116];7-8

             invoke LineTo, hndl,dword ptr[esi+64],dword ptr[esi+68];8-5  

             invoke MoveToEx, hndl, dword ptr[esi+16],dword ptr[esi+20],NULL;2

             invoke LineTo, hndl,dword ptr[esi+80],dword ptr[esi+84];2-6

             invoke MoveToEx, hndl, dword ptr[esi+32],dword ptr[esi+36],NULL;3  

             invoke LineTo, hndl,dword ptr[esi+96],dword ptr[esi+100];3-7

             invoke MoveToEx, hndl, dword ptr[esi+48],dword ptr[esi+52],NULL;4

             invoke LineTo, hndl,dword ptr[esi+112],dword ptr[esi+116];4-8  

;----------------------------------------------------------              

ret

Box endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Ugol proc hndl:DWORD, Typ:BOOL, xL:DWORD, xM:DWORD, h:DWORD

; -------------------------------------------------------------------------

;процедура рисования L сечения - Угла

; -------------------------------------------------------------------------

LOCAL xLN:DWORD     ;отрицательные значения (N-negative)

LOCAL xMN:DWORD

LOCAL hN:DWORD

pusha

       cmp Typ,0     ;определение типа введенных параметров

       jnz no_intU

;если задан целый тип

intU:

               finit               ;инициализация сопроцессора

               fild xL

Рисунок 20 - Продолжение 

               fstp xL

               fild xM

               fstp xM

               fild h

               fstp h

               fld xL

               fchs

               fstp xLN

               fld xM

               fchs

               fstp xMN

               fld h

               fchs

               fstp hN

               jmp nextU

;если задан тип с плавающей точкой                

no_intU:

               finit               ;инициализация сопроцессора              

               fld xL

               fchs

               fstp xLN

               fld xM

               fchs

               fstp xMN

               fld h

               fchs

               fstp hN

nextU:                         

;заполняем массив вершин двутавра (12вершин*4координаты=48элементов)

               mov ecx,12

               mov MasPointsQ,ecx

               lea esi, MasPoints

; -------------------------------------------------------------------------

;устанавливаем каждый четвертый элемент в единицу

; -------------------------------------------------------------------------

               mov ebx,12

write_unoU:

               movm dword ptr[ebx+esi],Uno

               add ebx,16

               dec ecx

               jnz write_unoU

; -------------------------------------------------------------------------

;Пишем вершины

; -------------------------------------------------------------------------                

             movm dword ptr [esi],xLN

             movm dword ptr [esi+4],xLN

             movm dword ptr [esi+8],h

                           

             movm dword ptr [esi+16],xLN

             movm dword ptr [esi+20],xMN

Рисунок 20 - Продолжение 

             movm dword ptr [esi+24],h 

             

             movm dword ptr [esi+32],xM

             movm dword ptr [esi+36],xMN

             movm dword ptr [esi+40],h

              

             movm dword ptr [esi+48],xM

             movm dword ptr [esi+52],xL

             movm dword ptr [esi+56],h

             

             movm dword ptr [esi+64],xL

             movm dword ptr [esi+68],xL

             movm dword ptr [esi+72],h

             

             movm dword ptr [esi+80],xL

             movm dword ptr [esi+84],xLN

             movm dword ptr [esi+88],h

              

             movm dword ptr [esi+96],xLN

             movm dword ptr [esi+100],xLN

             movm dword ptr [esi+104],hN

             

             movm dword ptr [esi+112],xLN

             movm dword ptr [esi+116],xMN

             movm dword ptr [esi+120],hN

             movm dword ptr [esi+128],xM

             movm dword ptr [esi+132],xMN

             movm dword ptr [esi+136],hN

             movm dword ptr [esi+144],xM

             movm dword ptr [esi+148],xL

             movm dword ptr [esi+152],hN

             movm dword ptr [esi+160],xL

             movm dword ptr [esi+164],xL

             movm dword ptr [esi+168],hN

             movm dword ptr [esi+176],xL

             movm dword ptr [esi+180],xLN

             movm dword ptr [esi+184],hN             

; -------------------------------------------------------------------------

invoke MultiplyAll                

; -------------------------------------------------------------------------

lea esi,MasPoints

;соединяем точки

             ;верхнее сечение

             invoke MoveToEx, hndl, dword ptr[esi],dword ptr[esi+4],NULL   ;перейти в точку 1

             mov ecx,5 ;Количество вершин верхней грани - 1

             mov ebx,16

Рисунок 20 - Продолжение 

U_line1:

             push ecx             

             invoke LineTo, hndl,dword ptr[esi+ebx],dword ptr[esi+ebx+4];

             pop ecx

             add ebx,16

             dec ecx

             jnz U_line1                

             invoke LineTo, hndl,dword ptr[esi],dword ptr[esi+4];8-1

                            

             ;нижнее сечение  

             invoke MoveToEx, hndl, dword ptr[esi+96],dword ptr[esi+100],NULL   ;перейти в точку 9  

             mov ecx,5 ;Количество вершин нижней грани - 1

             mov ebx,112

U_line2:

             push ecx             

             invoke LineTo, hndl,dword ptr[esi+ebx],dword ptr[esi+ebx+4]

             pop ecx

             add ebx,16

             dec ecx

             jnz U_line2                                                                                        

             invoke LineTo, hndl,dword ptr[esi+96],dword ptr[esi+100]    ;16-9

             ;соединяем нижнее и верхнее сечения

             mov ecx,6

             xor ebx,ebx

U_line3:

             push ecx

             invoke MoveToEx, hndl, dword ptr[esi+ebx],dword ptr[esi+ebx+4],NULL   ;перейти в точку

             invoke LineTo, hndl,dword ptr[esi+ebx+96],dword ptr[esi+ebx+100]

             pop ecx

             add ebx,16

             dec ecx

             jnz U_line3                                                                                          

;----------------------------------------------------------  

popa            

ret

Ugol endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DvuTavr proc hndl:DWORD, Typ:BOOL, xL:DWORD, xM:DWORD, h:DWORD

; -------------------------------------------------------------------------

;процедура рисования двутавра

; -------------------------------------------------------------------------

LOCAL xLN:DWORD     ;отрицательные значения (N-negative)

LOCAL xMN:DWORD

LOCAL hN:DWORD

pusha

Рисунок 20 - Продолжение 

       cmp Typ,0     ;определение типа введенных параметров

       jnz no_intDT

;если задан целый тип

intDT:

               finit               ;инициализация сопроцессора

               fild xL

               fstp xL

               fild xM

               fstp xM

               fild h

               fstp h

               fld xL

               fchs

               fstp xLN

               fld xM

               fchs

               fstp xMN

               fld h

               fchs

               fstp hN

               jmp nextDT

;если задан тип с плавающей точкой                

no_intDT:

               finit               ;инициализация сопроцессора              

               fld xL

               fchs

               fstp xLN

               fld xM

               fchs

               fstp xMN

               fld h

               fchs

               fstp hN

nextDT:                         

;заполняем массив вершин двутавра (24вершины*4координаты=96элементов)

               mov ecx,24

               mov MasPointsQ,ecx

               lea esi, MasPoints

; -------------------------------------------------------------------------

;устанавливаем каждый четвертый элемент в единицу

; -------------------------------------------------------------------------

               mov ebx,12

write_unoDT:

               movm dword ptr[ebx+esi],Uno

               add ebx,16

               dec ecx

               jnz write_unoDT

               

             movm dword ptr [esi],xLN

             movm dword ptr [esi+4],xLN

Рисунок 20 - Продолжение 

             movm dword ptr [esi+8],h

                           

             movm dword ptr [esi+16],xLN

             movm dword ptr [esi+20],xL

             movm dword ptr [esi+24],h

             

             movm dword ptr [esi+32],xMN

             movm dword ptr [esi+36],xL

             movm dword ptr [esi+40],h

              

             movm dword ptr [esi+48],xMN

             movm dword ptr [esi+52],xM

             movm dword ptr [esi+56],h

             

             movm dword ptr [esi+64],xM

             movm dword ptr [esi+68],xM

             movm dword ptr [esi+72],h

             

             movm dword ptr [esi+80],xM

             movm dword ptr [esi+84],xL

             movm dword ptr [esi+88],h

              

             movm dword ptr [esi+96],xL

             movm dword ptr [esi+100],xL

             movm dword ptr [esi+104],h

             

             movm dword ptr [esi+112],xL

             movm dword ptr [esi+116],xLN

             movm dword ptr [esi+120],h

             movm dword ptr [esi+128],xM

             movm dword ptr [esi+132],xLN

             movm dword ptr [esi+136],h

             movm dword ptr [esi+144],xM

             movm dword ptr [esi+148],xMN

             movm dword ptr [esi+152],h

             movm dword ptr [esi+160],xMN

             movm dword ptr [esi+164],xMN

             movm dword ptr [esi+168],h

             movm dword ptr [esi+176],xMN

             movm dword ptr [esi+180],xLN

             movm dword ptr [esi+184],h              

             movm dword ptr [esi+192],xLN

             movm dword ptr [esi+196],xLN

             movm dword ptr [esi+200],hN

             movm dword ptr [esi+208],xLN

Рисунок 20 - Продолжение 

             movm dword ptr [esi+212],xL

             movm dword ptr [esi+216],hN

             movm dword ptr [esi+224],xMN

             movm dword ptr [esi+228],xL

             movm dword ptr [esi+232],hN

             movm dword ptr [esi+240],xMN

             movm dword ptr [esi+244],xM

             movm dword ptr [esi+248],hN

             movm dword ptr [esi+256],xM

             movm dword ptr [esi+260],xM

             movm dword ptr [esi+264],hN

             movm dword ptr [esi+272],xM

             movm dword ptr [esi+276],xL

             movm dword ptr [esi+280],hN

             movm dword ptr [esi+288],xL

             movm dword ptr [esi+292],xL

             movm dword ptr [esi+296],hN

             movm dword ptr [esi+304],xL

             movm dword ptr [esi+308],xLN

             movm dword ptr [esi+312],hN                                            

             movm dword ptr [esi+320],xM

             movm dword ptr [esi+324],xLN

             movm dword ptr [esi+328],hN    

             movm dword ptr [esi+336],xM

             movm dword ptr [esi+340],xMN

             movm dword ptr [esi+344],hN    

             movm dword ptr [esi+352],xMN

             movm dword ptr [esi+356],xMN

             movm dword ptr [esi+360],hN    

             movm dword ptr [esi+368],xMN

             movm dword ptr [esi+372],xLN

             movm dword ptr [esi+376],hN                  

; -------------------------------------------------------------------------

invoke MultiplyAll                

; -------------------------------------------------------------------------

lea esi,MasPoints

;соединяем точки

             ;верхнее сечение

             invoke MoveToEx, hndl, dword ptr[esi],dword ptr[esi+4],NULL   ;перейти в точку 1

             mov ecx,11

Рисунок 20 - Продолжение 

             mov ebx,16

DT_line1:

             push ecx             

             invoke LineTo, hndl,dword ptr[esi+ebx],dword ptr[esi+ebx+4];1-2

             pop ecx

             add ebx,16

             dec ecx

             jnz DT_line1                

             invoke LineTo, hndl,dword ptr[esi],dword ptr[esi+4];12-1

                            

             ;нижнее сечение  

             invoke MoveToEx, hndl, dword ptr[esi+192],dword ptr[esi+196],NULL   ;перейти в точку 13  

             mov ecx,11

             mov ebx,208

DT_line2:

             push ecx             

             invoke LineTo, hndl,dword ptr[esi+ebx],dword ptr[esi+ebx+4];1-2

             pop ecx

             add ebx,16

             dec ecx

             jnz DT_line2                                                                                        

             invoke LineTo, hndl,dword ptr[esi+192],dword ptr[esi+196]    ;24-13

             ;соединяем нижнее и верхнее сечения

             mov ecx,12

             xor ebx,ebx

DT_line3:

             push ecx

             invoke MoveToEx, hndl, dword ptr[esi+ebx],dword ptr[esi+ebx+4],NULL   ;перейти в точку

             invoke LineTo, hndl,dword ptr[esi+ebx+192],dword ptr[esi+ebx+196]

             pop ecx

             add ebx,16

             dec ecx

             jnz DT_line3                                                                                          

;----------------------------------------------------------  

popa            

ret

DvuTavr endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Сегмент данных для рисования конкретной сцены

.data

; ¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤=ч=¤

;переменные движений

masst dd 0.799  ;масштабирование

masst_lim_1 dd 0.06 ;нижний предел масштабирования

masst_lim_2 dd 2.0  ;верхний предел масштабирования

const_pi dd 3.14159265358979

Рисунок 20 - Продолжение 

const_pi_2 dd 1.570796326794

;углы: 0- в градусах(целое число); 1- в радианах(вещественное дробное)!

teta                       DD          0                                     ;вращение

fi                           DD          0                                     ;вращение

ro                          DD          0                                   ;масштаб

Angle_1                dd          0.0

Angle_2                dd          0.0

Angle_3                dd          0.0

Angle_tmp                dd          0.0

Offset_1               dd      0.0

Offset_2               dd      0.0

Offset_3               dd      0.0

; -------------------------------------------------------------------------

;Шаги

stp                                              DD 0.1 ;шаг перемещений

stpm                                            DD 0.06283185307179586476925286766559

stp5GRAD                                   DD 0.087266462599716478846184538424431

stp10GRAD                                    DD 0.17453292519943295769236907684886

stpSLIP                   dd 7.0

stpSLIP2                 dd 3.0

stpa                        dd 0.1

stpR                       dd 0.3

stpLite                    dd 0.02  ;шаг масштабирования

; -------------------------------------------------------------------------

;Пользовательские макросы

;Инкремент вещественного числа

; -------------------------------------------------------------------------

IncParam MACRO Parametr, Step

finit

fld Parametr

fld Step

fadd

fstp Parametr

ENDM

; -------------------------------------------------------------------------

;Декремент вещественного числа

; -------------------------------------------------------------------------

DecParam MACRO Parametr, Step

finit

fld Parametr

fld Step

fchs

fadd

fstp Parametr

ENDM

Рисунок 20 - Продолжение 

; -------------------------------------------------------------------------

;integer to float - перевод целого в число с плавающей точкой

; -------------------------------------------------------------------------

itfeax MACRO Number

mov eax,Number

finit

push eax

fild dword ptr[esp]

fstp dword ptr[esp]

pop eax

ENDM

; -------------------------------------------------------------------------

;integer to float negative - перевод отрицательного целого в число с плавающей точкой

; -------------------------------------------------------------------------

itfneax MACRO Number

mov eax,Number

finit

push eax

fild dword ptr[esp]

fchs

fstp dword ptr[esp]

pop eax

ENDM

; -------------------------------------------------------------------------

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

            LOCAL hdc:HDC

  LOCAL ps:PAINTSTRUCT

            LOCAL hMemoryDC:HDC

            LOCAL yellowPen:HBRUSH

            LOCAL greenPen:HBRUSH

            LOCAL redPen:HBRUSH

            LOCAL orangePen:HBRUSH

            LOCAL bluePen:HBRUSH

            LOCAL grayPen:HBRUSH

            LOCAL darkgrayPen:HBRUSH

            LOCAL whitePen:HBRUSH

            LOCAL blackPen:HBRUSH

            LOCAL darkbluePen:HBRUSH

; -------------------------------------------------------------------------

;Обработка нажатий клавиш

; -------------------------------------------------------------------------

Finit

Рисунок 20 - Продолжение 

.IF uMsg==WM_KEYDOWN

mov eax,wParam

; -------------------------------------------------------------------------

;Вращение сцены

Key_LEFT:

cmp eax,VK_LEFT ;если нажата клавиша влево то teta+0.1

jne Key_RIGHT

IncParam teta, stp5GRAD

Key_RIGHT:

cmp eax,VK_RIGHT;если нажата клавиша вправо то teta-0.1

jne Key_UP

DecParam teta, stp5GRAD

Key_UP:

cmp eax,VK_UP ;если нажата клавиша вверх то fi-0.1

jne Key_DOWN

IncParam fi, stp5GRAD

Key_DOWN:

cmp eax,VK_DOWN;если нажата клавиша вниз то fi+0.1

jne Key_Q

DecParam fi, stp5GRAD

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Вращательное движение 2го звена

Key_Q:

cmp eax, VK_Q ;если нажата клавиша 1 то ro+1

jne Key_W

IncParam Angle_1, stp5GRAD

Key_W:

cmp eax, VK_W

jne Key_E

DecParam Angle_1, stp5GRAD

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Вращательное движение 4го звена

Key_E:

cmp eax, VK_E ;если нажата клавиша 1 то ro+1

jne Key_R

IncParam Angle_2, stp5GRAD

Key_R:

cmp eax, VK_R

jne Key_A

DecParam Angle_2, stp5GRAD

Рисунок 20 - Продолжение 

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Поступательноe движение звена 1

Key_A:

cmp eax, VK_A

jne Key_S

cmp Offset_1,0

jle Key_S

DecParam Offset_1, stpSLIP

Key_S:

cmp eax, VK_S

jne Key_D

mov eax,280

push eax

fild dword ptr[esp]

fstp dword ptr[esp]

pop eax

cmp Offset_1,eax

jge Key_D

IncParam Offset_1, stpSLIP

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Поступательно движение  звена 3

Key_D:

cmp eax, VK_D

jne Key_F

cmp Offset_2,0

jle Key_F

DecParam Offset_2, stpSLIP

Key_F:

cmp eax, VK_F

jne Key_Z

mov eax,200

push eax

fild dword ptr[esp]

fstp dword ptr[esp]

pop eax

cmp Offset_2,eax

jge Key_Z

IncParam Offset_2, stpSLIP

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Поступательноe движение захвата

Key_Z:

cmp eax, VK_Z

jne Key_X

Рисунок 20 - Продолжение 

cmp Offset_3,0

jle Key_X

DecParam Offset_3, stpSLIP

Key_X:

cmp eax, VK_X

jne Key_H

mov eax,60

push eax

fild dword ptr[esp]

fstp dword ptr[esp]

pop eax

cmp Offset_3,eax

jge Key_H

IncParam Offset_3, stpSLIP

; -------------------------------------------------------------------------

; -------------------------------------------------------------------------

;Вызов справки

Key_H:

cmp eax, VK_H

; -------------------------------------------------------------------------

jne EndKeys

invoke MessageBox,hWnd,ADDR helpMsg,ADDR helptext,MB_OK

EndKeys:

; -------------------------------------------------------------------------

invoke InvalidateRect,hWnd,NULL,TRUE ; вызов перерисовки окна

; -------------------------------------------------------------------------

;Обработка движений колесика мыши

;Масштабирование

; -------------------------------------------------------------------------

.elseif uMsg == WM_MOUSEWHEEL

mov eax, wParam

cmp eax,0h  ;Выявляем, в какую сторону вращается колесо

js Dec_par

mov eax,masst_lim_2

cmp masst,eax

jg Dec_par

IncParam masst, stpLite  ;Увеличиваем масштаб

jmp Ex

Dec_par:

mov eax,masst_lim_1

cmp masst,eax

jl Ex

DecParam masst, stpLite   ;уменьшаем масштаб

Рисунок 20 - Продолжение 

Ex:

; -------------------------------------------------------------------------

invoke InvalidateRect,hWnd,NULL,TRUE ; вызов перерисовки окна

; -------------------------------------------------------------------------

;Обработка движений мыши

; -------------------------------------------------------------------------

.elseif uMsg == WM_MOUSEMOVE

.if wParam == MK_LBUTTON

           mov ecx,MouseM

           inc ecx

           mov MouseM,ecx

           cmp ecx,2

           jl no_null

           movm MouseM,0

no_null:

           mov ecx,MouseM

           cmp ecx,0 ;0-запоминает 1-сравнивает текущее положение с нулем

           jnz no_memory

           mov eax,lParam  ; lParam - вмещает в себя координаты Х и Y в упакованной форме

           shr eax,16      

           mov MouseY_previous, eax ; сохраняем параметр Y

           mov eax, lParam ; восстанавливаем Xи Y координаты

           and eax, 0FFFFh ; используем маску

           mov MouseX_previous, eax ; сохраняем X

no_memory:

           mov eax,lParam  ; lParam - вмещает в себя координаты Х и Y в упакованной форме

           shr eax,16      ; shift hi word to lo                  

           mov MouseY, eax ; сохраняем параметр Y

           mov eax, lParam ; восстанавливаем Xи Y координаты

           and eax, 0FFFFh ; используем маску

           mov MouseX, eax ; сохраняем X

no_read:

           mov eax, MouseX

           mov ebx, MouseX_previous

           cmp eax, ebx

           jg positivX

           jl negativX

           jmp no_shiftX

positivX:

           fld teta

           fld stpm

           fadd

           FSTP teta

           jmp no_shiftX

negativX:

           fld teta

           fld stpm

           fchs

Рисунок 20 - Продолжение 

           fadd

           FSTP teta

no_shiftX:

           mov eax, MouseY

           mov ebx,MouseY_previous

           cmp eax,ebx

           jl positivY

           jg negativY

           jmp no_shiftY

positivY:

           fld fi

           fld stpm

           fadd

           fstp fi

           jmp no_shiftY

negativY:

           fld fi

           fld stpm

           fchs

           fadd

           FSTP fi

no_shiftY:

           invoke InvalidateRect,hWnd,NULL,TRUE ; вызов перерисовки окна

     .endif

; -------------------------------------------------------------------------

     

.ELSEIF uMsg==WM_PAINT

             invoke CreateCompatibleDC,hdc

             mov hMemoryDC,eax

  invoke BeginPaint,hWnd, ADDR ps

  mov    hdc,eax

; --------------------------------Pen-------------------------------------

       RGB  255, 250, 75

       invoke CreatePen, 0,2,eax    

       mov  yellowPen,eax

       

       RGB  30, 230, 30  

       invoke CreatePen, 0,2,eax     

       mov  greenPen,eax

      

       RGB  230, 30, 30  

       invoke CreatePen, 0,2,eax     

       mov  redPen,eax   

       RGB  255, 150, 0  

       invoke CreatePen, 0,2,eax     

       mov  orangePen,eax        

Рисунок 20 - Продолжение 

       RGB  200, 200, 200  

       invoke CreatePen, 0,2,eax     

       mov  grayPen,eax

       RGB  150, 150, 150  

       invoke CreatePen, 0,2,eax     

       mov  darkgrayPen,eax

       RGB  50, 80, 255  

       invoke CreatePen, 0,2,eax     

       mov  bluePen,eax  

       RGB  20, 30, 220  

       invoke CreatePen, 0,2,eax     

       mov  darkbluePen,eax

       RGB  255, 255, 255  

       invoke CreatePen, 0,2,eax     

       mov  whitePen,eax      

       RGB  0, 0, 0  

       invoke CreatePen, 0,2,eax     

       mov  blackPen,eax

; -------------------------------------------------------------------------

mov ThisMatrix,0

mov ThisNumber,0

invoke MxScale, masst,masst,masst

invoke MxTranslate, 0, 0,0,0 ,0,200,0

invoke MxRotateX,1,fi  

invoke MxRotateY,1,teta

; -------------------------------------------------------------------------

;рисуем пол

; -------------------------------------------------------------------------

invoke SelectObject, hdc,darkgrayPen ; выбираем инструмент рисования

invoke Box, hdc,intgr,420,1,420

;Постамент

invoke SelectObject, hdc,darkgrayPen

invoke MxTranslate, 0, 0,1,0 ,0,20,0

invoke Box, hdc,intgr, 370,20,370

; -------------------------------------------------------------------------

;рисуем манипулятор

; -------------------------------------------------------------------------

;Рельса ( сечение - двутавр  )

invoke SelectObject, hdc, darkbluePen

invoke MxRotateY,0,90

invoke MxTranslate, 0, 0,1,0 ,0,120,0

Рисунок 20 - Продолжение 

invoke DvuTavr, hdc, intgr, 100,60,240

;1 звено ( сечение - коробка )

invoke SelectObject, hdc, whitePen

invoke MxRotateX,0,180

invoke MxTranslate, 0, 0,0,1, 0,160,140

invoke MxTranslate, 1, 0,0,0, 0,0,Offset_1

invoke Box, hdc, intgr, 60,100,60

;2 звено ( сечение - коробка )

invoke SelectObject, hdc, bluePen

invoke MxTranslate, 0, 0,0,0, 0,160,0

invoke MxRotateY,1, Angle_1

invoke Box, hdc, intgr, 80,60,130

;3 звено ( сечение - коробка )

invoke SelectObject, hdc,whitePen

invoke MxTranslate,0, 0,0,0, 0,0,20

invoke MxTranslate,1, 0,0,0, 0,0,Offset_2

invoke Box, hdc, intgr,50,40,150

;4 звено ( сечение - Угол )

invoke SelectObject, hdc,bluePen

invoke MxTranslate,0, 0,0,0, 0,0,230

invoke MxRotateZ,1,Angle_2

invoke Ugol, hdc, intgr, 40,0,80

;1 звено захвата

invoke SelectObject, hdc,whitePen

invoke MxTranslate, intgr, 0,0,0 ,0,0,90

invoke Box, hdc,intgr,80,40,10

invoke MxPush

;2 звено захвата

invoke SelectObject, hdc,bluePen

invoke MxTranslate, intgr, 1,0,0, 10,0,40

invoke MxTranslate, 1, 1,0,0 ,Offset_3,0,0

invoke Box, hdc,intgr,10,40,30

invoke MxPop

;3 звено захвата

invoke SelectObject, hdc,bluePen

invoke MxTranslate, intgr, 0,0,0, 10,0,40

invoke MxTranslate, 1, 0,0,0 ,Offset_3,0,0

invoke Box, hdc,intgr,10,40,30

; -------------------------------------------------------------------------

invoke EndPaint,hWnd, ADDR ps ;заканчиваем рисование

.ELSEIF uMsg==WM_DESTROY                   ; обработка закрытия окна

invoke PostQuitMessage,NULL

.ELSE

Рисунок 20 - Продолжение 

invoke DefWindowProc,hWnd,uMsg,wParam,lParam  

ret

.ENDIF

xor eax,eax

ret

WndProc endp

end start

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Рисунок 20 - Продолжение 

3  Вычислительный эксперимент

 Для выполнения вычислительного эксперимента в папке запускаем скомпилированный EXE файл. Появляется окно с изображением проволочной модели манипулятора.

Движения робота осуществляются согласно  указаниям, приведенным в руководстве оператора.  Изменение положения точки наблюдения, движение звеньев, вызов справки осуществляются при помощи клавиатуры и манипулятора «мышь».

При проведении вычислительного эксперимента проверено соответствие результатов, полученных на этапе проектирования, с результатами работы программы. Вычислительные эксперименты изображены на рисунках 21, 22 и 23.

 

Рисунок 21 - Вычислительный эксперимент I

Рисунок 22 - Вычислительный эксперимент II

                               

Рисунок 23 - Вычислительный эксперимент III

                        

                                     Заключение

В ходе выполнения курсовой работы были разработаны модель робота-манипулятора, алгоритм и программа на языке Assembler  построения данной модели. Разработанная программа соответствует заданным на этапе проектирования требованиям. Движения точки наблюдения позволяют увидеть всю модель под различными углами наблюдения. Создание такой модели может быть использовано при проектировании промышленных роботов-манипуляторов, так как позволяет увидеть и рассчитать пространство, занимаемое одним роботом при осуществлении различных движений. При работе над программой были изучены принципы построения трехмерных проволочных моделей, видовое преобразование, принципы программирования расширения процессора  SSE.

Объем памяти занимаемый  программой составляет  asm-файл  58 Кб, exe-файл 28 Кб, object-файл 30 Кб.

Список литературы

1. Зубков С. В. - Assembler – для DOS, Windows и Unix. – «ДМК Пресс», 2006. – 608 с.

2. Зубков С. В. - Assembler - язык неограниченных возможностей. – «ДМК Пресс», 1999. – 640 с.

3. Юров В. И.Assembler. Практикум (2-е издание). – Питер, 2006. – 399 с.


Приложение А. Руководство оператора

В приложении представлены: назначение программы, условия выполнения программы, описание назначений клавиш.

 Данная программа предназначена для построения проволочной модели робота-манипулятора согласно с индивидуальным заданием.

Минимальные системные требования:

  1.  операционная система: Windows XP;
  2.  процессор: Pentium III.

Запускаем еxe-файл. Для вызова окна справки используется клавиша H. Манипулятор приводится в движение следующими клавишами:

’ –  движение точки наблюдения вверх;

’ –  движение точки наблюдения вниз;

’ – движение точки наблюдения влево;

’ – движение точки наблюдения вправо;

‘колесико мыши’ –  масштабирование;

‘левая кнопка мыши’ – движение точки наблюдения в зависимости от движения мыши;

Q’, ’W’ – движение 2 звена;

A’, ’S’ – движение 1 звена;

D’, ’F’ – движение 3 звена;

E’, ’R’ – движение 4 звена;

Z’, ’X’ – движение схвата.


                    Приложение Б. Руководство программиста

 В приложении представлены: назначение программы, уловия выполнения программы, описание переменных и функций, используемых в программе.

Данная программа предназначена для построения проволочной модели робота-манипулятора согласно с индивидуальным заданием.

Минимальные системные требования:

  1.  операционная система: Windows XP;
  2.  процессор: Pentium III.

Программа для построения проволочной модели робота-манипулятора использует следующие макросы:

Movm - макрос прямой записи в память. Формат: dst, src.

В него передаются параметры dst, src, где через регистр eax src передается в dst.

IncParam - макрос инкремента вещественного числа. Формат: Parametr, Step

Переменная Parametr увеличивается на переменную Step.

DecParam - макрос декремента вещественного числа. Формат: Parametr, Step.

Переменная Parametr уменьшается на переменную Step.

 Itfeax - макрос перевода целого числа в число с плавающей точкой.

Формат: Number. Число Number переводится из целого вида в дробный.

 Itfneax - макрос перевода отрицательного целого числа в число с плавающей точкой. Формат: Number. Число Number переводится из целого вида в дробный.

Также в программе для построения проволочной модели робота-манипулятора используются следующие функции/процедуры::

MxRotateX proc Typ:BOOL, Angle:DWORD– создание матриц поворота вокруг оси Х. Параметр Typ указывает целое или дробное значение (0 или 1); Angle – угол поворота. Аналогично задаются матрицы поворота вокруг оси Y и Z(MxRotateY; MxRotateZ). С  помощью матриц поворота можно поворачивать выбранное звено относительно оси координат на указанный угол при построении манипулятора.

MxTranslate proc Typ:BOOL, zX:BOOL, zY:BOOL, zZ:BOOL, TX:DWORD, TY:DWORD, TZ:DWORD – создание матриц перехода. Параметр Typ указывает целое или дробное значение (0 или 1); параметры zX, zY, zZ – знаки X,Y,Z (0 – «+», 1 – «-»); TX, TY,TZ – сами смещения по X,Y,Z, на которые мы хотим переместиться.                                                                                                      MxScale proc ScaleX:DWORD, ScaleY:DWORD, ScaleZ:DWORDсоздание матрицы масштаба. Параметр ScaleX(ScaleY, ScaleZ) – коэффициент увеличения по оси X(Y,Z).

MultiplyAll proc - перемножение всех матриц из массива MasMatrix на все точки массива MasPoints.  Необходима для возможности движения звеньев манипулятора.  

MxPush proc - процедура сохранения текущего положения локальной системы координат.

MxPop proc - процедура загрузки последнего сохраненного положения локальных координат.

Для рисования сечений балок используются следующие процедуры :

Box proc hndl:DWORD, Typ:BOOL, xL:DWORD, yH:DWORD, zW:DWORD – процедура рисования прямоугольного параллелипипеда. Параметр hndl указывает на дескриптор устройства, которым осуществляется рисование; Typ указывает целое или дробное значение (0 или 1); xL,xH,xW – ширина, длина, высота параллелипипеда, см. приложение В рисунок B1.

Cone proc hndl:DWORD,Typ:BOOL,Rh:DWORD, Rl:DWORD, H:DWORD, Pnum:DWORD – процедура рисования балки сечения круг. Параметр hndl указывает на дескриптор устройства, которым осуществляется рисование; Typ указывает целое или дробное значение (0 или 1); h – высота балки; Также смотри приложение В рисунок B2.

Ugol proc hndl:DWORD, Typ:BOOL, xL:DWORD, xM:DWORD, h:DWORD - процедура рисования балки L-сечения. Параметр hndl указывает на дескриптор устройства, которым осуществляется рисование; Typ указывает целое или дробное значение (0 или 1); h – высота балки; см. приложение В рисунок B3.

Tavr proc hndl:DWORD, Typ:BOOL, xL:DWORD, xM:DWORD, h:DWORD  - процедура рисования балки сечения тавр. Параметр hndl указывает на дескриптор устройства, которым осуществляется рисование; Typ указывает целое или дробное значение (0 или 1); h – высота балки; xL,xM – см. приложение В рисунок B4.

DvuZub proc hndl:DWORD, Typ:BOOL, xL:DWORD, xN:DWORD, xM:DWORD, xK:DWORD, xH:DWORD, xF:DWORD, h:DWORD - процедура рисования балки сечения в виде двойного зуба. См. также приложение В, рисунок B5.

ChetList proc hndl:DWORD, Typ:BOOL, xL:DWORD, xN:DWORD, xM:DWORD, xK:DWORD, h:DWORD – процедура рисования балки сечения в виде четырехлистника. Параметр hndl указывает на дескриптор устройства, которым осуществляется рисование; Typ указывает целое или дробное значение (0 или 1); h – высота балки; xL,xN,xM,xK – см. приложение В рисунок B6.

WndProc — оконная процедура, обеспечивающую обработку сообщений для основного окна программы.

WinMain — главная функция, в которой создается основное окно программы и запускается цикл обработки сообщений.

         Приложение В. Параметры сечений фигур-примитивов

В приложении представлены рисунки, изображающие сечения звеньев, с проставленными размерами в виде переменных, передающихся в функции построения фигур-примитивов.

Рисунок B1 – Параметры сечения для функции построения фигуры – примитива Box

Рисунок В2 - Параметры сечения для функции построения фигуры – примитива DvuTavr

Рисунок B3 – Параметры сечения для функции построения фигуры – примитива Ugol


 

А также другие работы, которые могут Вас заинтересовать

6624. Эпоха Великих географических открытий 57 KB
  Эпоха Великих географических открытий. С 1415-1420 до 1492г. это переходный период от позднего средневековья к эпохе Великих географических открытий. В этот период складываются социально-экономические предпосылки открытия Америки и морского пути в И...
6625. Основные тенденции в совершенствовании нормирования труда в процессе организации труда 44.5 KB
  Основные тенденции в совершенствовании нормирования труда в процессе организации труда. Совершенствование методов организации и нормирования труда призвано обеспечивать усиление мобилизующей роли норм в повышении производительности труда и наиболее...
6626. Гидросфера. Распространение воды в природе 44.5 KB
  Гидросфера. Гидросфера, является важным элементом биосферы, играет решающую роль в многих процессах, протекающих в природе и обеспечении жизни человека. Вода широко используется человечеством для его практической деятельности в промышленности, сельс...
6627. Характеристика природных вод. Сточные воды 57 KB
  Характеристика природных вод. В природе чистой воды не встречается. В 1л/м3 воды содержится 1г. волей. В морской воде значительно больше: например в водах Балтийского моря- 5г/л, Черного моря- 18 г/л, в океане 35г/л, а воды Красного моря содержат- 4...
6628. Принципы очистки сточных вод 158.5 KB
  Принципы очистки сточных вод. Методы очистки сточных вод можно условно подразделить на деструктивные и регенеративные. Деструктивные методы сводятся к разрушению загрязняющих воду веществ путем их окисления или восстановления. Образующиеся при этом...
6629. Введение в медицинскую генетику 19.74 KB
  Введение в медицинскую генетику Относительный рост доли генетически обусловленной патологии в структуре заболеваемости, смертности, синдромах социальной дезадаптации в настоящее время связан с быстрым прогрессом диагностических возможностей. Наследс...
6630. Структура ДНК, репликация, транскрипция, трансляция, структура генов и код передачи генетической информации 30.73 KB
  Структура ДНК, репликация, транскрипция, трансляция, структура генов и код передачи генетической информации. Аминокислотная последовательность и структура всех белков определяется информацией, закодированной в структуре дезоксирибонуклеиновой кислот...
6631. Организация и структура генома, генетические карты 22.94 KB
  Организация и структура генома, генетические карты. В настоящее время термин геном используется для обозначения полной генетической системы клетки, определяющей характер развития организма и наследственную передачу всех его структурных и функциона...
6632. Методы современного генетического анализа 21.01 KB
  Методы современного генетического анализа ДНК может быть изолирована из любого типа тканей или клеток, содержащих ядра. У человека ДНК обычно выделяют из лейкоцитов крови, для чего собирают от 0,5 до 2-3 мл венозной крови. В плазме, обогащенной лейк...