MiThEoN
453 / 315 / 37
Регистрация: 31.10.2009
Сообщений: 518
Записей в блоге: 2
1
TASM

Рисование прямой линии (рекурсивный алгоритм)

04.06.2011, 19:42. Показов 2341. Ответов 10

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

С помощью рекурсии, пытаюсь то что хочу , но не могу понять в чем же дело.

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
CSEG segment
assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
.586
org 100h
Begin:
    mov  ax,  0B800h
    mov  es,  ax
 
    mov  ah,  0h
    mov  al,  03h
    int  10h
 
    mov       ax, 12h ;X 12h+80h X ;включение видеорежима
    int       10h   
 
    mov ax, x1
    mov bx, y1
    mov cx, x2
    mov dx, y2
 
    call line
 
    mov       ax,83h
    int       10h
 
    int 20h
 
    x1 dw 200
x2 dw 100
y1 dw 200
y2 dw 100
 
line    proc    ;рисование линии
    pusha
        sub ax,cx
        test ax,ax
        jns a1
        neg ax
    a1: cmp ax,1
        jna asd2
        sub bx, dx
        test bx,bx
        jns a2
        neg bx
    a2: cmp bx, 1
        jna asd2
    popa
    pusha
        mov si, cx
        add cx,ax
        mov di, dx
        add dx,bx
        shr cx,1
        shr dx,1        
        mov ah, 0ch
        mov al, 9d
        mov bh, 0
        int 10h
        call line
asd1:   mov ax, si
        mov bx, di
        call line
asd2:   popa
        ret
line    endp
 
CSEG ends
end Begin
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2011, 19:42
Ответы с готовыми решениями:

Рисование прямой линии по таймеру
Требуется нарисовать по сути вот такую штуку http://savepic.org/3468491.gif . только почаще линии...

Рисование непрерывной прямой линии
Хочу нарисовать прямую линию из пикселей, есть функция putpixel() ставить пиксель по координатам,...

Рисование прямой линии, как в Paint
Доброго всем времени суток. Нужно в PictureBox нарисовать прямую линию. Рисовать надо как в...

Графический редактор - рисование прямой линии и заливка.
Есть графический редактор. Вcё рисуется на image1. Есть глобальная переменная а. Есть кнопки...

10
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
04.06.2011, 19:54 2
VASSUV, 0b800h - это начало видеопамяти для текстовых режимов. Для графических она начинается с адреса 0a000h
0
MiThEoN
453 / 315 / 37
Регистрация: 31.10.2009
Сообщений: 518
Записей в блоге: 2
04.06.2011, 20:22  [ТС] 3
Цитата Сообщение от Vadimych Посмотреть сообщение
Для графических она начинается с адреса 0a000h
Спасибо, хлтя бы уже что-то рисуется,

а из-за чего так коряво выводит эти точки? не могли бы подсказать?
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
04.06.2011, 20:50 4
Да кто его знает, одно ещё смущает:
Assembler
1
2
test ax,ax
jns a1
Установится ли здесь флаг знака? Лучше cmp ax,0, по-моему.
0
2534 / 830 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
04.06.2011, 21:01 5
Установится ли здесь флаг знака? Лучше cmp ax,0, по-моему.
установится

А вообще таки вещи исправляются отладкой. Так проще.
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
04.06.2011, 21:13 6
Ну да, гоню я. Поместил в ax 0ffh, увидел, что флаг не установлен, и засомневался.
0
2013 / 1285 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
04.06.2011, 22:39 7
Чет не понял алгоритм, объясните подробнее пожалуйста. И вывод через int 10h и так медленный, да еще и рекурсия - выводите в видеобуфер
0
MiThEoN
453 / 315 / 37
Регистрация: 31.10.2009
Сообщений: 518
Записей в блоге: 2
05.06.2011, 00:58  [ТС] 8
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
CSEG segment
assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
.586
org 100h
Begin:
    mov  ax,  0a000h
    mov  es,  ax
 
    mov  ah,  0h
    mov  al,  03h
    int  10h
 
    mov       ax, 12h ;X 12h+80h X ;включение видеорежима
    int       10h   
 
    mov ax, x1
    mov bx, y1
    mov cx, x2
    mov dx, y2
 
    call line
 
    mov       ax,83h
    int       10h
 
    int 20h
 
    x1 dw 200
     x2 dw 50
     y1 dw 30
     y2 dw 250
 
line    proc    ;рисование линии
    pusha
        sub ax,cx
        test ax,ax
        jns a1
        neg ax
    a1: cmp ax,1
        jna asd2
        sub bx, dx
        test bx,bx
        jns a2
        neg bx
    a2: cmp bx, 1
        jna asd2
    popa
    pusha
        mov si, cx
        add cx,ax
        mov di, dx
        add dx,bx
        shr cx,1
        shr dx,1    
            pusha
        mov ah, 0ch
        mov al, 9d
        mov bh, 0
        int 10h
        popa
        call line
asd1:   mov ax, si
        mov bx, di
        call line
asd2:   popa
        ret
line    endp
 
CSEG ends
end Begin
Разобрался в строчках (55-60) нужно было сохранить флаги

Алгоритм такой:

1. делю отрезок пополам
2. ставлю точку в центре
3. Вызываю эту же процедуру для полученных двух отрезков

... таким образом выходит рекурсия

Цитата Сообщение от vital792 Посмотреть сообщение
И вывод через int 10h и так медленный, да еще и рекурсия - выводите в видеобуфер
Может быть, решение и не совсем правильное, долгое, и прямая немного кривая,
но к примеру 150 строчек алгоритма Брейзенхема, и здесь почти 30(по выводам можно сравнить)

к томуже , препод сказал что его код вышел в 28 строк, и использовал он pusha и popa по одному разу

Может кто сможет оптимизировать???

Добавлено через 1 час 28 минут
?????
0
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
05.06.2011, 01:26 9
Вам надо построить отрезок, имея две координаты - начало и конец?
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
05.06.2011, 06:40 10
vital792, видеорежим 12h позволяет рисовать, используя прямой вывод в видеобуфер?
0
2013 / 1285 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
05.06.2011, 09:25 11
Vadimych, разумеется, как и любой другой режим. Только сначала надо настроить палитру через регистры crt. Как то так:
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
pixel proc
push    di
push    si
push    bx
mov     si, cx
mov     di, dx
push    ax
and     cx, 0007h
mov     ah, 80h
shr     ah, cl
mov     dx, 3CEh
mov     al, 8
out     dx, ax
mov     bx, si
shr     bx, 3
mov     ax, di
xor     dx, dx
mov     cx, 80
mul     cx
add     bx, ax
mov     al, es:[bx]
mov     dx, 3C4h
mov     ax, 0F02h
out     dx, ax
mov     byte ptr es:[bx],0
inc     dx
pop     ax
out     dx, al
mov     byte ptr es:[bx],0FFh
mov     cx, si
mov     dx, di
pop bx
pop si
pop di
ret
pixel endp
Используется точно так же как функция 0ch, только в es должен быть сегментный адрес видеобуфера:
Assembler
1
2
3
4
5
6
7
8
9
10
mov ax, 12h
int 10h
 
mov ax, 0a000h
mov es, ax
 
mov ax, 1
mov cx, 100
mov dx, 100
call pixel
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2011, 09:25

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

Алгоритм Брезенхейма построения прямой линии
Напишите программу, реализующую алгоритм Брезенхейма построения прямой линии,

Составить уравнение прямой линии, проходящей через точку и параллельной прямой
Составить уравнение прямой линии, проходящей через точку A(-4, 3, 3) и параллельной ...

Рисование дополнительной линии под углом к основной линии
Доброго времени суток, всем. Помогите решить вопрос. Есть макрос рисующий линию между двумя...

Рисование линии
ребят помогите пожалуйста, Нужно рисовать линии (прямые) на Image. Вот код который написал, но он...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru