Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
TASM

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

04.06.2011, 19:42. Показов 2888. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2011, 19:42
Ответы с готовыми решениями:

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

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

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

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

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

А вообще таки вещи исправляются отладкой. Так проще.
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
04.06.2011, 21:13
Ну да, гоню я. Поместил в ax 0ffh, увидел, что флаг не установлен, и засомневался.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
04.06.2011, 22:39
Чет не понял алгоритм, объясните подробнее пожалуйста. И вывод через int 10h и так медленный, да еще и рекурсия - выводите в видеобуфер
0
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
05.06.2011, 00:58  [ТС]
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
 Аватар для 6a6kin
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
05.06.2011, 01:26
Вам надо построить отрезок, имея две координаты - начало и конец?
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
05.06.2011, 06:40
vital792, видеорежим 12h позволяет рисовать, используя прямой вывод в видеобуфер?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
05.06.2011, 09:25
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2011, 09:25
Помогаю со студенческими работами здесь

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

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

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

Составить уравнение прямой линии, проходящей через точку и параллельной прямой
Составить уравнение прямой линии, проходящей через точку A(-4, 3, 3) и параллельной {l}:\begin{cases} & \text{x-2y+z-4}=0 \\ ...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Реалии
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. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru