Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
 Аватар для Alles
45 / 45 / 44
Регистрация: 10.05.2012
Сообщений: 76

Рисование линии

29.01.2013, 15:12. Показов 4936. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу оказать помощь в выполнении задания. Требуется нарисовать линию: первая точка имеет координаты нажатия левой кнопки мыши, а вторая – правой. Нашел два кода для рисования линии, любой из них переделать бы (добавить вторую координату при нажатии правой кнопки мыши):
1) Здесь используется алгоритм Брезенхема, но здесь координата второй точки служит началом следующей линии.
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
.model tiny
.code
org 100h
.186
start:
      mov       ax, 12h ;X 12h+80h X ;включение видеорежима
      int       10h
      mov       ax, 0 ; проверка драйверов мыши
      int       33h
      mov       ax, 1 ;вывод курсора
      int       33h
 
      mov       ax, 000Ch ; создание обработчика события
      mov       cx, 0002h ; нажатие на левую кнопку мыши
      mov       dx, offset handler
      int       33h
 
      mov       ah, 0
      int       16h
      mov       ax, 000Ch ;удаляем 
      mov       cx, 0000h ;обработчик
      int       33h       ; событий
      mov       ax, 83h
      int       10h
      ret
; Обработчик событий от мыши
handler:
      push      0A000h
      pop       es
      push      cs
      pop       ds
      push      cx
      push      dx
 
      mov       ax, 2
      int       33h
 
      cmp       word ptr previous_X, -1
      je        first_point
 
      call      line_bresenham
exit_handler:
      pop    dx
      pop    cx
      mov    previous_X, cx
      mov    previous_Y, dx
 
      mov    ax, 1
      int    33h
 
      retf
 
first_point:
      call   putpixel1b
      jmp    short exit_handler
 
;Процедура рисования прямой линии
line_bresenham:
      mov      ax, cx
      sub      ax, previous_X
      jns      dx_pos
      neg      ax
      mov      word ptr X_increment, 1
      jmp      short dx_neg
dx_pos:
      mov      word ptr X_increment, -1
 
dx_neg:
      mov       bx, dx
      sub       bx, previous_Y
      jns       dy_pos
      neg       bx
      mov       word ptr Y_increment, 1
      jmp       short dy_neg
dy_pos:
      mov       word ptr Y_increment, -1
dy_neg:
      shl       ax, 1
      shl       bx, 1
 
      call      putpixel1b
 
      cmp       ax, bx
      jna       dx_le_dy
      mov       di, ax
      shr       di, 1
      neg       di
      add       di, bx
cycle:
      cmp       cx, word ptr previous_X
      je        exit_bres
      cmp       di, 0
      jl        fractlt0
      add       dx, word ptr Y_increment
      sub       di, ax
fractlt0:
      add       cx, word ptr X_increment
      add       di, bx
      call      putpixel1b
      jmp       short     cycle
 
dx_le_dy:
      mov       di, bx
      shr       di, 1
      neg       di
      add       di, ax
cycle2:
      cmp       dx, word ptr previous_Y
      je        exit_bres
      cmp       di, 0
      jl        fractlt02
      add       cx, word ptr X_increment
      sub       di, bx
fractlt02:
      add       dx, word ptr Y_increment
      add       di, ax
      call      putpixel1b
      jmp       short cycle2
exit_bres:
      ret
; Процедура вывода точки на экран
putpixel1b:
      pusha
      xor       bx, bx
      mov       ax, dx
      imul      ax, ax, 80
      push      cx
      shr       cx, 3
      add       ax, cx
      mov       di, ax
      mov       si, di
 
      pop       cx
      mov       bx, 0080h
      and       cx, 07h
 
      shr       bx, cl
      lods      es:byte ptr some_label
      or        ax, bx
      stosb
      popa
      ret
 
previous_X      dw      -1
previous_Y      dw      -1
Y_increment     dw      -1
X_increment     dw      -1
 
some_label:
 
           end  start
2) А здесь все линии начинаются с центра.
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
.model tiny
.486
.code
org 100h
start:
mov ax,13h
int 10h
 
xor ax,ax
int 33h
mov ax,1
int 33h
 
mov ax,12
mov cx,2
mov dx,offset handler
int 33h
 
xor ax,ax
int 16h
ret
 
handler:
  mov  ax,2
  int  33h
  push dx
  shr  cx,1
  push cx
  push 100
  push 160
  call line
  mov  ax,1
  int  33h
retf
 
 
line:
  push bp
  mov  bp,sp
  imul di,ss:[bp+6],320
  add  di,ss:[bp+4]
 
  mov  ax,ss:[bp+8]
  sub  ax,ss:[bp+4]
  sbb  bx,bx
  mov  dx,ss:[bp+10]
  sub  dx,ss:[bp+6]
  sbb  cx,cx
 
  mov  si,ax
  or   si,dx
  je   quit
 
  xor  ax,bx
  sub  ax,bx
  xor  dx,cx
  sub  dx,cx
 
  or   bx,1
  mov  si,cx
  xor  cx,320
  sub  cx,si
 
  cmp  ax,dx
  ja a
      xchg ax,dx
      xchg bx,cx
  a:
 
  push 0A000h
  pop  es
 
  mov  si,ax
  mov  bp,ax
  b:mov byte ptr es:[di],2
    sub si,dx
    jnl next
      add si,ax
      add di,cx
    next:
    add di,bx
    dec bp
  jne b
 
  quit:
  mov byte ptr es:[di],2
  pop bp
ret 8
 
end start
Добавлено через 16 часов 29 минут
Не актуально.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2013, 15:12
Ответы с готовыми решениями:

Рисование линии в видеорежиме
Написать программу, которая в видережиме 13h выводит на экран лини. произвольной длины и единичной толщины под углом 45 к горизоту. Выход...

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

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

2
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
27.05.2013, 17:28
Цитата Сообщение от Alles Посмотреть сообщение
алгоритм Брезенхема
Здравствуйте!Не могли бы мне помочь с прогой по ассемблеру,у нас задания чуть похожи...
Мне нужна программа, рисующая линии в графическом режиме (алгоритм Брезенхема, рекомендуется режим с 256 цветами).
(Рисуемые линии вводятся пользователем в виде координат)
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
27.05.2013, 18:24
А у меня есть алгоритм, написанный для 32-битного защищенного режима. Алгоритм был нагуглен ночью(или вечером, не помню точно) и переписан на асм. В общем, если руки из того места растут, то рисовать можно при помощи написанной мною процедурки в любом режиме работы экрана. Процедура принимает две координаты(начало и конец), а также цвет линии. Процедура писалась с целью научить код рисовать линии на экране. Об оптимизациях не думал, т.к. код и без них сложный вышел. Принимает координаты через стек, а цвет должен лежать в переменной "draw.color". Адрес буфера для хранения выводимого изображения должен храниться в переменной "draw.buff". Для реализации используется только целочисленная арифметика, а также, если мне память не изменяет, тут нет ни одной операции деления. Синтаксис: FASM. Если очень надо, перепишешь под свои нужды.

Вот код:
Кликните здесь для просмотра всего текста
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
    draw.line:
        ;рисование точки
        ;stdcall draw.add_op (x1:DWORD, y1:DWORD, x2:DWORD, y2:DWORD)
        draw.line.x1 equ [ebp+4*4-4] 
        draw.line.y1 equ [ebp+4*4-8]
        draw.line.x2 equ [ebp+4*4-12] 
        draw.line.y2 equ [ebp+4*4-16]
        
        push ebp
        lea ebp,[esp+8]
        pusha
        
        mov eax,draw.line.x2
        cmp eax,draw.line.x1
        ;прямые, параллельные Ox или Oy
        jne draw.line.not_vert
            ;рисуем вертикальную линию
            mov edx,draw.XRes
            shl edx,2
            
            mov eax,draw.line.y1
            cmp eax,draw.line.y2
            jc @f
                xchg eax,draw.line.y2
                mov draw.line.y1,eax
            @@:
            mov edi,draw.XRes
            imul edi,draw.line.y1
            add edi,draw.line.x1
            shl edi,2
            add edi,[draw.buff]
            
            mov eax,[draw.color]
            mov ecx,draw.line.y2
            sub ecx,draw.line.y1
            test ecx,80000000h
            jz @f
                neg ecx
            @@:
                mov [edi],eax
                add edi,edx
                dec ecx
                jnz @b
            jmp draw.line.exit
        draw.line.not_vert:
        mov eax,draw.line.y2
        cmp eax,draw.line.y1
        jne draw.line.not_hor
            ;рисуем горизонтальную линию   
            mov eax,draw.line.x1
            cmp eax,draw.line.x2
            jc @f
                xchg eax,draw.line.x2
                mov draw.line.x1,eax
            @@:
            
            mov edi,draw.XRes
            imul edi,draw.line.y1
            add edi,draw.line.x1
            shl edi,2
            add edi,[draw.buff]
            
            mov eax,[draw.color]
            mov ecx,draw.line.x2
            sub ecx,draw.line.x1
            rep stosd
            jmp draw.line.exit
        draw.line.not_hor:  
        ;с наклоном 45 градусов
        sub eax,draw.line.y1
        test eax,80000000h
        jz @f
            neg eax
        @@:
        mov ebx,draw.line.x2
        sub ebx,draw.line.x1
        test ebx,80000000h
        jz @f
            neg ebx
        @@:
        cmp ebx,eax
        jne draw.line.not_45    
            mov eax,draw.line.x1
            cmp eax,draw.line.x2
            jc @f
                xchg eax,draw.line.x2
                mov draw.line.x1,eax
            @@:
            mov ecx,ebx
            mov eax,draw.line.y2
            sub eax,draw.line.y1
            mov edx,01h
            test eax,80000000h
            jz @f
                neg edx
            @@:
            imul edx,draw.XRes
            inc edx
            shl edx,2
            
            mov edi,draw.XRes
            imul edi,draw.line.y1
            add edi,draw.line.x1
            shl edi,2
            add edi,[draw.buff]
            mov eax,[draw.color]
            @@:
                mov [edi],eax
                add edi,edx
                dec ecx
                jnz @b
            
            jmp draw.line.exit      
        draw.line.not_45:
        ;все остальные      
        mov edi,draw.line.y1
        mov edx,draw.XRes*4
        mov ebx,draw.line.y2
        sub ebx,draw.line.y1
        jnc @f
            mov edx,-draw.XRes*4
            neg ebx
        @@: 
        imul edi,draw.XRes
        add edi,draw.line.x1
        shl edi,2
        add edi,[draw.buff]
        
        mov eax,draw.line.x2
        sub eax,draw.line.x1
        mov ebp,4
        jnc @f
            mov ebp,-4
            neg eax
        @@:     
        
        mov esi,[draw.color]
        
        mov [draw.line.counter],00h
        cmp eax,ebx
        jc draw.line.Y
        draw.line.X:
            mov ecx,eax
            draw.line.X.loop:
                mov [edi],esi
                add edi,ebp
                add [draw.line.counter],ebx
                cmp [draw.line.counter],eax
                jc @f
                    add edi,edx
                    sub [draw.line.counter],eax
                @@:
                dec ecx
                jnz draw.line.X.loop
            jmp draw.line.exit
        draw.line.Y:
            mov ecx,ebx
            draw.line.Y.loop:
                mov [edi],esi
                add edi,edx
                add [draw.line.counter],eax
                cmp [draw.line.counter],ebx
                jc @f
                    add edi,ebp
                    sub [draw.line.counter],ebx
                @@:
                dec ecx
                jnz draw.line.Y.loop
            jmp draw.line.exit
        draw.line.dx dd 0
        draw.line.dy dd 0
        draw.line.counter dd 0
        
        draw.line.exit:
        
        popa
        ;возват из процедуры
        pop ebp
        pop eax
        add esp,4*4 ;общий размер передаваемых операндов
        push eax
        mov eax,00h
        ret
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2013, 18:24
Помогаю со студенческими работами здесь

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

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

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

Рисование линии при помощи мыши
Добрый вечер. Есть код рисования линии по двум точкам (которые заданы в кач-ве переменных). Хочу эти переменные заполнять координатами...

Рисование кривой линии при нажатой ЛКМ
Сабж. Нужно отрисовывать кривую линию при нажатой ЛКМ. Видеорежим: 320х200 (13h). Беру координаты курсора с помощью функции 3h...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru