Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
FURIAAA
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 5
#1

Рисование линии при помощи мыши

03.03.2018, 19:41. Просмотров 357. Ответов 4
Метки нет (Все метки)

Добрый вечер. Есть код рисования линии по двум точкам (которые заданы в кач-ве переменных). Хочу эти переменные заполнять координатами курсора мыши после нажатия.
Загружается консоль с курсором, нажимаю на ЛКМ -> получаю координаты x1,y1. Перевожу дальше курсор, нажимаю -> получаю координаты x2,y2. И курсор должен исчезнуть. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2018, 19:41
Ответы с готовыми решениями:

Рисование линии при помощи мыши
Здравствуйте! Возникла следующая проблема и буду очень благодарна, если...

Рисование линий от точки до точки при помощи мыши
Нашла задачу, рисует линии, как я поняла от точки до точки. С помощью tasm и...

Рисование линии с помощью мыши
Всем привет! Я изучаю ассемблер, пока работаю в реальном режиме (использую...

Рисование прямой линии
Сразу, прошу, на алгоритмы типа "Брейзенхема" не посылать. С помощью...

Рисование линии в видеорежиме
Написать программу, которая в видережиме 13h выводит на экран лини....

4
ФедосеевПавел
Модератор
3598 / 1982 / 825
Регистрация: 01.02.2015
Сообщений: 6,599
03.03.2018, 20:55 #2
Это хорошо, что хотите.

Почитайте материалы по ссылкам в статье
Кратко о работе с мышью в DOS с помощью сервисного прерывания int 33h

Кроме того, в подразделе "DOS" есть множество примеров - попробуйте поискать или через расширенный поиск по корню слова "мыш", или просто полистав страницы.

Добавлено через 19 минут
Вам нужно реализовать следующее.
1. инициализировать мышь
2. установить графический режим
3. установить форму курсора в графическом режиме
4. показать курсор
5. в цикле опрашивать состояние кнопок мыши до нажатия ЛКМ
6. после нажатия ЛКМ уточнить координаты начала отрезка
7. в цикле опрашивать состояние кнопок мыши до нажатия ЛКМ
8. после нажатия ЛКМ уточнить координаты конца отрезка
9. спрятать курсор
10. нарисовать линию
11. ожидать нажатия любой клавиши
12. установить текстовый режим

Вот и вся программа. Каждый пункт алгоритма - это вызов прерывания int 33h
0
FURIAAA
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 5
03.03.2018, 21:25  [ТС] #3
Спасибо за ответ. 1-4 пункта сделал. а вот с циклами уже проблема... интуитивно понимаю что делать, но не выходит. есть какой-нибудь код к этому (TASM) ?
0
ФедосеевПавел
Модератор
3598 / 1982 / 825
Регистрация: 01.02.2015
Сообщений: 6,599
03.03.2018, 21:36 #4
Я уже не помню функцию опроса состояния мыши из int 33h.
Но там должно быть что-то такое
Assembler
1
2
3
4
5
WaitForLBM:
    mov ah, функция опроса
    int 33h
    test регистр с состоянием клавиш, битовая маска
    jz WaitForLBM
0
ФедосеевПавел
Модератор
3598 / 1982 / 825
Регистрация: 01.02.2015
Сообщений: 6,599
11.03.2018, 01:32 #5
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
.model small, Pascal
 
.stack 100h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgPressAnyKey  db      'Press any key to exit...', '$'
        ;Параметры курсоров мыши
        ;Курсор - перекрестие
        MouseCursor_Cross               dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh  ;screen mask (AND mask)
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      00100h, 00100h, 00100h, 00000h  ;cursor mask (XOR mask)
                                        dw      00100h, 00100h, 00000h, 0ED6Eh
                                        dw      00000h, 00100h, 00100h, 00000h
                                        dw      00100h, 00100h, 00100h, 00000h
                                        dw      7                               ;column of cursor hot spot in bitmap (-16 to 16)
                                        dw      7                               ;row of cursor hot spot (-16 to 16)
 
        MouseInitOk                     equ     0FFFFh  ;инициализация мыши - успешна
        MouseInitFault                  equ     0000h   ;инициализация мыши - мышь или драйвер мыши не установлены
 
        MouseButtons_Any                equ     0000h   ;количество кнопок у мыши - отлично от 2 и 3
        MouseButtons_2                  equ     0002h   ;количество кнопок у мыши - 2
        MouseButtons_2_                 equ     0FFFFh  ;количество кнопок у мыши - 2
        MouseButtons_3                  equ     0003h   ;количество кнопок у мыши - 3
 
        ;сообщения программы
        msgMouseFault                   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        ;
        LineColor                       dw      4
;.data?
        Xbegin                          dw      ?
        Ybegin                          dw      ?
        Xfinish                         dw      ?
        Yfinish                         dw      ?
 
.code
 
;----------------------------------------------
;вызовы функций работы с мышью оберну в макросы
;для наглядности текста
;----------------------------------------------
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   - 0000h, если мышь или драйвер мыши не установлены
;   - FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   - 0002 или FFFF - две
;   - 0003 - три
;   - 0000 - другое количество
MouseInit       macro
        mov     ax,     0000h
        int     33h
endm
 
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor macro
        push    ax
        mov     ax,     0001h
        int     33h
        pop     ax
endm
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor macro
        push    ax
        mov     ax,     0002h
        int     33h
        pop     ax
endm
 
;установить курсор мыши в графическом режиме
;Определение курсора мыши в графическом режиме
;int 33h ax=0009h:
;BX = column of cursor hot spot in bitmap (-16 to 16)
;CX = row of cursor hot spot (-16 to 16)
;ES:DX -> mask bitmap
;Format of mouse mask bitmap:
;Offset Size            Description
;00h    16 WORDs        screen mask
;10h    16 WORDs        cursor mask
;Note: Each word defines the sixteen pixels of a row, low bit rightmost
MouseSetCursor  macro   Cursor
        push    ax
        push    bx
        push    cx
        push    es
 
        mov     bx,     word ptr [Cursor+64]
        mov     cx,     word ptr [Cursor+66]
        mov     ax,     seg Cursor
        mov     es,     ax
        mov     dx,     offset [Cursor]
        mov     ax,     0009h
        int     33h
 
        pop     es
        pop     cx
        pop     bx
        pop     ax
endm
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;установка графического режима
        mov     ax,     0013h
        int     10h
        ;установка формы курсора в графическом режиме
        MouseSetCursor  MouseCursor_Cross
        ;показать курсор
        MouseShowCursor
@@WaitForStartPoint:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jz      @@WaitForStartPoint
        ;для графического видеорежима 13h нужно
        ;разделить на 2 координату X курсора
        shr     cx,     1
        mov     [Xbegin],       cx
        mov     [Ybegin],       dx
 
        MouseHideCursor
        mov     ah,     0Ch
        mov     al,     byte ptr [LineColor]
        mov     bh,     0
        mov     cx,     [Xbegin]
        mov     dx,     [Ybegin]
        int     10h
        MouseShowCursor
 
@@WaitForReleaseButton:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jnz     @@WaitForReleaseButton
 
@@WaitForFinishPoint:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jz      @@WaitForFinishPoint
        ;для графического видеорежима 13h нужно
        ;разделить на 2 координату X курсора
        shr     cx,     1
        mov     [Xfinish],      cx
        mov     [Yfinish],      dx
 
        ;спрятать курсор
        MouseHideCursor
 
        ;нарисовать линию
        push    word ptr [Xbegin]
        push    word ptr [Ybegin]
        push    word ptr [Xfinish]
        push    word ptr [Yfinish]
        push    word ptr [LineColor]
        call    DrawLine
        ;Завершение программы
@@Exit:
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
DrawLine        proc
        arg xStart:WORD, yStart:WORD, xEnd:WORD, yEnd:WORD, Color:WORD
        ;начало отрезка
        ;конец отрезка
        ;цвет отрезка
 
        ;LOCAL  a, b:WORD       ;  // displacements in x and y
        ;di LOCAL       d:WORD          ;  // decision variable
        LOCAL   diag_inc:WORD   ;  // d's increment for diagonal steps
        LOCAL   dx_diag:WORD    ;  // diagonal x step for next pixel
        LOCAL   dx_nondiag:WORD ;  // nondiagonal x step for next pixel
        LOCAL   dy_diag:WORD    ;  // diagonal y step for next pixel
        LOCAL   dy_nondiag:WORD ;  // nondiagonal y step for next pixel
        ;LOCAL  i:WORD          ;  // loop index
        LOCAL   nondiag_inc:WORD;  // d's increment for nondiagonal steps
        ;swap       :  integer;  // temporary variable for swap
        ;si, dx x,y        :  integer;  // current x and y coordinates
        ;// line starting point
        mov     si,     [xStart]        ;x := xStart;
        mov     dx,     [yStart]        ;y := yStart;
        ;// Determine drawing direction and step to the next pixel.
        ;// difference in x dimension
        mov     ax,     [xEnd]          ;a := xEnd - xStart;
        sub     ax,     [xStart]
        ;// Determine whether end point lies to right or left of start point.
        mov     [dx_diag],      1
        jns     @@StoreA                ;if a < 0 then // drawing towards smaller x values?
                                        ;begin
                neg     ax              ;   a := -a;   // make 'a' positive
                                        ;   dx_diag := -1
                mov     [dx_diag],      -1
                                        ;end
                                        ;else
                                        ;   dx_diag := 1;
        @@StoreA:
        ;// difference in y dimension
        mov     bx,     [yEnd]          ;b := yEnd - yStart;
        sub     bx,     [yStart]
        ;// Determine whether end point lies above or below start point.
        mov     [dy_diag],      1
        jns     @@StoreB                ;if b < 0 then // drawing towards smaller y values?
                                        ;begin
                neg     bx              ;   b := -b;   // make 'b' positive
                                        ;   dy_diag := -1
                mov     [dy_diag],      -1
                                        ;end
                                        ;else
                                        ;   dy_diag := 1;
        @@StoreB:
                                        ;// Identify octant containing end point.
        cmp     ax,     bx              ;if a < b then
        jae     @@A_ge_B                ;begin
                mov     cx,     ax      ;   swap := a;
                mov     ax,     bx      ;   a := b;
                mov     bx,     cx      ;   b := swap;
                mov     [dx_nondiag],0  ;   dx_nondiag := 0;
                mov     cx,[dy_diag]    ;   dy_nondiag := dy_diag
                mov     [dy_nondiag],cx
                jmp     @@Init          ;end
        @@A_ge_B:                       ;else
                                        ;begin
                mov     cx,[dx_diag]    ;   dx_nondiag := dx_diag;
                mov     [dx_nondiag],cx
                mov     [dy_nondiag],0  ;   dy_nondiag := 0
                                        ;end;
        @@Init:
                add     bx,bx
                mov     [nondiag_inc],bx;nondiag_inc := b + b;     // set initial d increment values
                sub     bx,     ax
                mov     di,     bx      ;d := b + b - a;           // initial value for d is 2*b - a
                sub     bx,     ax      ;diag_inc    := b + b - a - a;
                mov     [diag_inc],     bx
        mov     cx,     ax              ;for i := 0 to a do
        inc     cx
        @@ForI:                         ;begin   /// draw the a+1 pixels
                push    cx
                mov     ah,     0Ch     ;   drawPixel (bitmap, x, y, color);
                mov     al,     byte ptr [Color]
                mov     bh,     0
                mov     cx,     si
                ;mov     dx,     dx
                int     10h
                cmp     di,     0       ;   if d < 0 then            // is midpoint above the line?
                jge     @@ByDiagonal    ;   begin                 // step nondiagonally
                        add     si,[dx_nondiag] ;      x := x + dx_nondiag;
                        add     dx,[dy_nondiag] ;      y := y + dy_nondiag;
                        add     di,[nondiag_inc];      d := d + nondiag_inc  // update decision variable
                        jmp     @@NextP ;   end
                @@ByDiagonal:           ;   else
                                        ;   begin                 // midpoint is above the line; step diagonally}
                        add     si,[dx_diag]    ;      x := x + dx_diag;
                        add     dx,[dy_diag]    ;      y := y + dy_diag;
                        add     di,[diag_inc]   ;      d := d + diag_inc
                @@NextP:                        ;   end;
                pop     cx
        loop    @@ForI                  ;end;
        ret
DrawLine        endp
 
end     main
Добавлено через 32 минуты
Рисование линии по алгоритму Брезенхэма.
Чем отличаются алгоритмы построения отрезка (ru.wikipedia)
Алгоритм Брезенхэма (ru.wikipedia)
Bresenham's line algorithm (en.wikipedia)
Bresenham's_line_algorithm (rosettacode)

В английской Wiki для повышения скорости предлагается реализация 6-х случаев (подпрограмм) в зависимости от направления отрезка. Что-то подобное и реализовано на ассемблере rosettacode.

Меня же заинтересовал обобщённый вариант от той же rosettacode с реализацией на Delphi. Сразу скажу - не идеал (присутствуют ошибки в комментариях, которые я исправил в ассемблерной реализации), но опираться на примеры всё же лучше.

Немного раздражает ограничение на инструкции i86 - чтобы работало на emu8086 - приходится придумывать названия меткам, там где можно обойтись без переходов (movcc). А также не нравится отсутствие в tasm разделения переменных на локальные и глобальные при отключённом режиме Ideal - приходится для переменных в процедуре придумывать новые имена, а также следить за отсутствием совпадения локальных переменных из процедуры в строках основной программы.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
.model small, Pascal
 
.stack 100h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgPressAnyKey  db      'Press any key to exit...', '$'
        ;Параметры курсоров мыши
        ;Курсор - перекрестие
        MouseCursor_Cross               dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh  ;screen mask (AND mask)
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      00100h, 00100h, 00100h, 00000h  ;cursor mask (XOR mask)
                                        dw      00100h, 00100h, 00000h, 0ED6Eh
                                        dw      00000h, 00100h, 00100h, 00000h
                                        dw      00100h, 00100h, 00100h, 00000h
                                        dw      7                               ;column of cursor hot spot in bitmap (-16 to 16)
                                        dw      7                               ;row of cursor hot spot (-16 to 16)
 
        MouseInitOk                     equ     0FFFFh  ;инициализация мыши - успешна
        MouseInitFault                  equ     0000h   ;инициализация мыши - мышь или драйвер мыши не установлены
 
        MouseButtons_Any                equ     0000h   ;количество кнопок у мыши - отлично от 2 и 3
        MouseButtons_2                  equ     0002h   ;количество кнопок у мыши - 2
        MouseButtons_2_                 equ     0FFFFh  ;количество кнопок у мыши - 2
        MouseButtons_3                  equ     0003h   ;количество кнопок у мыши - 3
 
        ;сообщения программы
        msgMouseFault                   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        ;
        LineColor                       dw      4
;.data?
        Xbegin                          dw      ?
        Ybegin                          dw      ?
        Xfinish                         dw      ?
        Yfinish                         dw      ?
 
.code
 
;----------------------------------------------
;вызовы функций работы с мышью оберну в макросы
;для наглядности текста
;----------------------------------------------
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   - 0000h, если мышь или драйвер мыши не установлены
;   - FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   - 0002 или FFFF - две
;   - 0003 - три
;   - 0000 - другое количество
MouseInit       macro
        mov     ax,     0000h
        int     33h
endm
 
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor macro
        push    ax
        mov     ax,     0001h
        int     33h
        pop     ax
endm
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor macro
        push    ax
        mov     ax,     0002h
        int     33h
        pop     ax
endm
 
;установить курсор мыши в графическом режиме
;Определение курсора мыши в графическом режиме
;int 33h ax=0009h:
;BX = column of cursor hot spot in bitmap (-16 to 16)
;CX = row of cursor hot spot (-16 to 16)
;ES:DX -> mask bitmap
;Format of mouse mask bitmap:
;Offset Size            Description
;00h    16 WORDs        screen mask
;10h    16 WORDs        cursor mask
;Note: Each word defines the sixteen pixels of a row, low bit rightmost
MouseSetCursor  macro   Cursor
        push    ax
        push    bx
        push    cx
        push    es
 
        mov     bx,     word ptr [Cursor+64]
        mov     cx,     word ptr [Cursor+66]
        mov     ax,     seg Cursor
        mov     es,     ax
        mov     dx,     offset [Cursor]
        mov     ax,     0009h
        int     33h
 
        pop     es
        pop     cx
        pop     bx
        pop     ax
endm
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;установка графического режима
        mov     ax,     0013h
        int     10h
        ;установка формы курсора в графическом режиме
        MouseSetCursor  MouseCursor_Cross
        ;показать курсор
        MouseShowCursor
@@WaitForStartPoint:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jz      @@WaitForStartPoint
        ;для графического видеорежима 13h нужно
        ;разделить на 2 координату X курсора
        shr     cx,     1
        mov     [Xbegin],       cx
        mov     [Ybegin],       dx
 
        MouseHideCursor
        mov     ah,     0Ch
        mov     al,     byte ptr [LineColor]
        mov     bh,     0
        mov     cx,     [Xbegin]
        mov     dx,     [Ybegin]
        int     10h
        MouseShowCursor
 
@@WaitForReleaseButton:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jnz     @@WaitForReleaseButton
 
@@WaitForFinishPoint:
        mov     ax,     0003h   ;RETURN POSITION AND BUTTON STATUS
        int     33h
        and     bx,     0001h   ;проверка нажатия ЛКМ
        jz      @@WaitForFinishPoint
        ;для графического видеорежима 13h нужно
        ;разделить на 2 координату X курсора
        shr     cx,     1
        mov     [Xfinish],      cx
        mov     [Yfinish],      dx
 
        ;спрятать курсор
        MouseHideCursor
 
        ;нарисовать линию
        push    word ptr [Xbegin]
        push    word ptr [Ybegin]
        push    word ptr [Xfinish]
        push    word ptr [Yfinish]
        push    word ptr [LineColor]
        call    DrawLine
        ;Завершение программы
@@Exit:
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
DrawLine        proc
        arg xStart:WORD, yStart:WORD, xEnd:WORD, yEnd:WORD, Color:WORD
        ;начало отрезка
        ;конец отрезка
        ;цвет отрезка
 
        ;LOCAL  a, b:WORD       ;  // displacements in x and y
        ;di LOCAL       d:WORD          ;  // decision variable
        LOCAL   diag_inc:WORD   ;  // d's increment for diagonal steps
        LOCAL   dx_diag:WORD    ;  // diagonal x step for next pixel
        LOCAL   dx_nondiag:WORD ;  // nondiagonal x step for next pixel
        LOCAL   dy_diag:WORD    ;  // diagonal y step for next pixel
        LOCAL   dy_nondiag:WORD ;  // nondiagonal y step for next pixel
        ;LOCAL  i:WORD          ;  // loop index
        LOCAL   nondiag_inc:WORD;  // d's increment for nondiagonal steps
        ;swap       :  integer;  // temporary variable for swap
        ;si, dx x,y        :  integer;  // current x and y coordinates
        ;// line starting point
        mov     si,     [xStart]        ;x := xStart;
        mov     dx,     [yStart]        ;y := yStart;
        ;// Determine drawing direction and step to the next pixel.
        ;// difference in x dimension
        mov     ax,     [xEnd]          ;a := xEnd - xStart;
        sub     ax,     [xStart]
        ;// Determine whether end point lies to right or left of start point.
        mov     [dx_diag],      1
        jns     @@StoreA                ;if a < 0 then // drawing towards smaller x values?
                                        ;begin
                neg     ax              ;   a := -a;   // make 'a' positive
                                        ;   dx_diag := -1
                mov     [dx_diag],      -1
                                        ;end
                                        ;else
                                        ;   dx_diag := 1;
        @@StoreA:
        ;// difference in y dimension
        mov     bx,     [yEnd]          ;b := yEnd - yStart;
        sub     bx,     [yStart]
        ;// Determine whether end point lies above or below start point.
        mov     [dy_diag],      1
        jns     @@StoreB                ;if b < 0 then // drawing towards smaller y values?
                                        ;begin
                neg     bx              ;   b := -b;   // make 'b' positive
                                        ;   dy_diag := -1
                mov     [dy_diag],      -1
                                        ;end
                                        ;else
                                        ;   dy_diag := 1;
        @@StoreB:
                                        ;// Identify octant containing end point.
        cmp     ax,     bx              ;if a < b then
        jae     @@A_ge_B                ;begin
                mov     cx,     ax      ;   swap := a;
                mov     ax,     bx      ;   a := b;
                mov     bx,     cx      ;   b := swap;
                mov     [dx_nondiag],0  ;   dx_nondiag := 0;
                mov     cx,[dy_diag]    ;   dy_nondiag := dy_diag
                mov     [dy_nondiag],cx
                jmp     @@Init          ;end
        @@A_ge_B:                       ;else
                                        ;begin
                mov     cx,[dx_diag]    ;   dx_nondiag := dx_diag;
                mov     [dx_nondiag],cx
                mov     [dy_nondiag],0  ;   dy_nondiag := 0
                                        ;end;
        @@Init:
                add     bx,bx
                mov     [nondiag_inc],bx;nondiag_inc := b + b;     // set initial d increment values
                sub     bx,     ax
                mov     di,     bx      ;d := b + b - a;           // initial value for d is 2*b - a
                sub     bx,     ax      ;diag_inc    := b + b - a - a;
                mov     [diag_inc],     bx
        mov     cx,     ax              ;for i := 0 to a do
        inc     cx
        @@ForI:                         ;begin   /// draw the a+1 pixels
                push    cx
                mov     ah,     0Ch     ;   drawPixel (bitmap, x, y, color);
                mov     al,     byte ptr [Color]
                mov     bh,     0
                mov     cx,     si
                ;mov     dx,     dx
                int     10h
                cmp     di,     0       ;   if d < 0 then            // is midpoint above the line?
                jge     @@ByDiagonal    ;   begin                 // step nondiagonally
                        add     si,[dx_nondiag] ;      x := x + dx_nondiag;
                        add     dx,[dy_nondiag] ;      y := y + dy_nondiag;
                        add     di,[nondiag_inc];      d := d + nondiag_inc  // update decision variable
                        jmp     @@NextP ;   end
                @@ByDiagonal:           ;   else
                                        ;   begin                 // midpoint is above the line; step diagonally}
                        add     si,[dx_diag]    ;      x := x + dx_diag;
                        add     dx,[dy_diag]    ;      y := y + dy_diag;
                        add     di,[diag_inc]   ;      d := d + diag_inc
                @@NextP:                        ;   end;
                pop     cx
        loop    @@ForI                  ;end;
        ret
DrawLine        endp
 
end     main
0
11.03.2018, 01:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2018, 01:32

Рисование по алгоритму DDA-линии
пытаюсь написать программу, которая выводит прямую у=кх+b по алгоритму...

Рисование линии по двут точкам (ЦВЕТ!!!)
Люди подскажите как в этой программе поменять цвет линий. Программа работает по...

Рисование прямоугольника с помощью мыши - прерывание
Вот цель работы: Рисование прямоугольника с помощью мыши. Координаты левой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru