Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Alles
44 / 44 / 44
Регистрация: 10.05.2012
Сообщений: 76
1

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

29.01.2013, 15:12. Просмотров 2152. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 15:12
Ответы с готовыми решениями:

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

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

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

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

Рисования прямой линии
Добрый вечер. Задача: Рисование прямой линии с помощью мыши. Линия должна...

2
Муха-муха
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
27.05.2013, 17:28 2
Цитата Сообщение от Alles Посмотреть сообщение
алгоритм Брезенхема
Здравствуйте!Не могли бы мне помочь с прогой по ассемблеру,у нас задания чуть похожи...
Мне нужна программа, рисующая линии в графическом режиме (алгоритм Брезенхема, рекомендуется режим с 256 цветами).
(Рисуемые линии вводятся пользователем в виде координат)
0
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
27.05.2013, 18:24 3
А у меня есть алгоритм, написанный для 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2013, 18:24

Как поменять цвет линии
Нашел такой код, в нем есть функция вывода линий .model tiny, C .code ...

Рисование
Ребят, не большой вопрос. Как установить 5 разноцветных паралельных линий. ...

Переделать шахматную сетку в обычные линии
У меня есть код , которая реальзует вывод шахматной сетки с задающими...


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

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

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