Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2012, 00:51   #1
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию Построить линию вызвав прерывание

Нужно нарисовать линию вызвав прерывание ассемблера. При нажатии левой кнопки мыши запомнить координату, и при нажатии правой, запомнить, между ними провести линию, вызвать прерывание только для вычисления координат, нарисовать линию, функцией LineTo. Подскажите как сделать, писал на masm, координаты вычислял, на знаю как сделать на(препод сказал не мучайся пиши на Borland c), изначально взял из гугла алгоритм брайзенхауэра(не уверен что правильно написал), пихнул его в исходник, он не работает.
sheff123 вне форума Ответить с цитированием
Старый 04.12.2012, 00:53   #2
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

Код:
.model small                                                 ;Модель программы
.stack 100h                                                 ;Размер стека фиксирован - 100 байт
.386                                                        ;Модель процессора

.data                                                        ;Данные
    Z    dw    0                                                ;int X - хранит координату X
    H    dw    0                                                ;int Y - хранит координату Y
    
    buf dw ?
    z1    dw 0
    z2    dw 0
    h1    dw 0
    h2    dw 0


.code                                                        ;Код     

;В этой функции (main) мы включаем видеорежим дисплея, после инициализируем мышь, показываем ее на экран, и ждем :
; если нажата клавиша - выходим из программы, если сдвинули мышьили нажали на кнопку мыши - переходим к функции-обработчику мыши (mouse_proc).

main proc                                                    ;Функция Main(главная функция проекта)
    mov ax,@data                                            ;Получаем адрес данных
    mov ds,ax                                                ;
    
                                                            ;Переключиться в графический режим
    mov ah,0                                                 ;установка видео режима
    mov al,12h                                                 ;номер режима (640x480pi)
    int 10h                                                 ;Естественно само прерывание смены видеорежима

                                                            ;Инициализация мыши
    xor ax,ax                                                ;помещаем в ax ноль
    int 33h                                                 ;Инициализируем мышь
            
    mov ax,1                                                ;Показываем мышь на дисплее
    int 33h                                                    ;
                                                            ;Вешаем обработчик мыши
    mov     cx,11111b                                         ;Обработчик будет ловить все события мыши(все единицы)
    mov     ax,0ch                                            ;
    push    cs                                                ;перемещаем cs в es
    pop     es                                                ;
    mov     dx,offset mouse_proc                            ;указываем имя функции - обработчика мышки
    int     33h                                                ;Вызываем прерывание чтобы это все применить

                                                            ;Выход из программы
    mov     ah, 0                                           ;Ожиданем нажатия любой клавиши
    int     16h                                                ;
    mov     ax, 000Ch                                        ;Если нажали клавишу, то:
    mov     cx, 0000h                                       ;Удаляем обработчик событий мыши
    int     33h                                                ;
    mov     ax, 3                                           ;Переходим в текстоый режим
    int     10h                                                ;
    mov ax,4c00h                                            ;
    int 21h                                                    ;Выходим из программы

main endp                                                    ;Завершение функции Main

Последний раз редактировалось Serge_Bliznykov; 04.12.2012 в 09:01.
sheff123 вне форума Ответить с цитированием
Старый 04.12.2012, 00:53   #3
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

Код:
mouse_proc proc                                                ;Функция - обработчик событий мыши
    mov     ax, 0003h                                        ;
    int     33h                                                ;Получаем информацию о мышке
    test     bx, 00000001b                                    ;Проверяем, если нажата Левая Кнопка Мыши, то на метку L1
    jnz        L1                                                ;
    test     bx, 00000010b                                    ;Проверяем, если нажата Правая Кнопка Мыши, то на метку L2
    jnz        L2                                                ;
    retf                                                    ;Иначе, выход из функции
    
    L1:                                                        ;Метка L1
    
    mov z1,cx
    mov h1,dx
   
   
               
           pusha     
                mov ah,0Ch                                          ;рисуем точку по координатам X,Y
                mov al,2                                             ;цвет точки
                mov bh,0 
                                            ;видео страница - хз зачем!
											popa
                int 10h                                                ;применяем все
         
      
     
        
    retf                                                    ;выход из функции

    L2:                                                        ;Метка L2
     mov z2,cx
     mov h2,dx 
     mov ax,z1
     mov bx,h1
     mov cx,z2
     mov dx,h2
	 pusha 

       call Line       
                                           

                                      
    retf                                                    ;Выход из функции
    
mouse_proc endp                                                ;Завершение функции-обработчика событий мышки
 sign proc
shl ax,1
jc negat
mov ax, 1
ret
negat:
mov ax, -1
ret
 sign endp
 
;--------------------------------------------
; abs absolute value return method
;--------------------------------------------
; Ввод:
; переменная аргумент в ax
; Вывод:
; ax = abs(переменная y)
; Регистры:
; ax
;--------------------------------------------
 absolute proc
cmp ax,0
jnl aboveeq
neg ax
aboveeq:
ret
 absolute endp
;-------------------------------------------
; line line drawing method
;-------------------------------------------
; Ввод:
; Координаты x1,y1,x2,y2 в
; регистрах ax,bx,cx,dx соответственно
; Вывод:
;
; Регистры:
;
;------------------------------------------
 line proc

jmp beg
x1 dw ?
x2 dw ?
y1 dw ?
y2 dw ?
_dx dw ?
_dy dw ?
i dw 0
sx dw ?
sy dw ?
check dw ?
e dw ?
x dw ?
y dw ?
beg:
 popa
mov [x1],ax
mov [y1],bx
mov [x2],cx
mov [y2],dx

mov ax, [x1] ;dx:=abs(x1-x2);
sub ax, [x2]
call absolute
mov [_dx], ax
mov ax, [y1] ;dy:=abs(y1-y2);
sub ax, [y2]
call absolute
mov [_dy], ax
mov ax, [x2] ;sx:=Sign(x2-x1);
sub ax, [x1]
call sign
mov [sx], ax
mov ax, [y2] ;sy:=Sign(y2-y1);
sub ax, [y1]
call sign
mov [sy], ax
push [x1] ;x:=x1;
pop [x]
push [y1] ;y:=y1;
pop [y]
push 0 ;check:=0;
pop [check]
mov ax,[_dy] ;if dy>dx then begin
cmp ax,[_dx]
jle next
mov ax, [_dy] ;dx:=dx+dy;
add [_dx],ax
mov ax, [_dx] ;dy:=dx-dy;
neg [_dy]
add [_dy],ax
mov ax, [_dy] ;dx:=dx-dy;
sub [_dx],ax
mov [check],1 ;check:=1;
next: ;end;
push [_dy] ;e:= 2*dy - dx;
pop [e]
sal [e],1
mov ax, [_dx]
sub [e], ax
mov cx,[_dx] ;for i:=1 to dx do begin
for:
mov al,3 ;image1.Canvas.Pixels[x,y]:=clBlack;
mov ah,0Ch
mov bh,0
push cx
mov cx, [x]
mov dx, [y]
int 10h
pop cx
cmp [e],0 ;if e>=0 then begin
jl next1
cmp [check],1 ;if check=1 then
jne _else
mov ax, [sx] ;x:=x+sx
add [x], ax
jmp next2
_else: ;else
mov ax, [sy] ;y:=y+sy;
add [y], ax
next2: ;endif
mov ax,[_dx] ;e:=e-2*dx;
sal ax,1
sub [e], ax
next1: ;end;
cmp [check],1 ;if check=1 then
jne _else1
mov ax, [sy] ;y:=y+sy
add [y], ax
jmp next3
_else1: ;else
mov ax, [sx] ;x:=x+sx;
add [x], ax
next3: ;endif
mov ax,[_dy] ;e:=e+2*dy;
sal ax,1
add [e], ax
loop for ;end;
endline:

ret
 line endp
end main                                                    ;Завершение файла


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 04.12.2012 в 09:01.
sheff123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пять в линию GamerZAV C# (си шарп) 10 12.05.2012 11:59
Картинки в линию unusually HTML и CSS 1 09.03.2012 10:24
Построить ломаную линию по заданныи вершинам. Вершины указываются с клавиатуры по «методу резиновой нити». HollywoodStar Паскаль, Turbo Pascal, PascalABC.NET 0 17.12.2011 14:36
как построить в Excel полиноминальную линию тренда 4 степени? sosed Microsoft Office Excel 4 19.01.2010 14:48
Продолжить линию 4ifir01 Мультимедиа в Delphi 1 15.12.2008 21:36