Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2023, 16:55   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию Не могу понять как реализовать функции рисования окружности и отрезков для работы кода

По заданию надо нарисовать яхту с помощью отрезков и окружности на tasm вот что смог написать но в коде не могу понять как реализовать функции и чтоб заработал код
Код:
.model small
.stack 100h
 
.data
    msg1 db 'Author:', 0
    msg2 db 'Name: Яхта', 0
 
.code
start:
    mov ax, @data
    mov ds, ax
 
    ; Выводим название рисунка и автора
    call print_text
    call print_new_line
    call print_new_line
    call print_text
 
    ; Рисуем яхту
    call draw_line
    call draw_circle
; Функция для рисования маленькой яхты
draw_yacht:
    push ax bx cx dx si
 
    ; Рисуем корпус яхты (отрезок)
    mov ax, 10 ; начальная позиция по оси x
    mov bx, 10 ; начальная позиция по оси y
    mov cx, 40 ; конечная позиция по оси x
    mov dx, 10 ; конечная позиция по оси y
    call draw_line
 
    ; Рисуем паруса яхты (окружности)
    mov ax, 25 ; координата x центра окружности
    mov bx, 5  ; координата y центра окружности
    mov cx, 5  ; радиус окружности
    call draw_circle
 
    mov ax, 25 ; координата x центра окружности
    mov bx, 10 ; координата y центра окружности
    mov cx, 5  ; радиус окружности
    call draw_circle
 
    pop si dx cx bx ax
    ret
    mov ah, 4Ch
    int 21h
 
; Функции
 
draw_circle:
    ; Код для построения окружности
 
    ret
 
draw_line:
    ; Код для построения отрезка
 
    ret
 
print_text:
    push ax bx cx dx si
 
    mov ah, 09h ; функция вывода строки
    lea dx, [msg1] ; адрес строки
    int 21h
 
    pop si dx cx bx ax
    ret
 
print_new_line:
    push ax bx cx dx si
 
    mov ah, 02h ; функция вывода символа
    mov dl, 13 ; символ переноса строки
    int 21h
 
    mov dl, 10 ; символ возврата каретки
    int 21h
 
    pop si dx cx bx ax
    ret
 
end start
ChestIotVaga вне форума Ответить с цитированием
Старый 05.04.2023, 19:47   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Возьмите уравнения прямой на плоскости и по координатам двух точек найдите коэффициенты для уравнения:
Код:
y` = k*x` + b    y` = k*x` + b    y` = k*x` + b            y` = k*x`  + b
y1 = k*x1 + b => y1 = k*x1 + b  => y1 = k*x1 + y2 - k*x2 => k  = (y1 - y2) / (x1 - x2)
y2 = k*x2 + b    b  = y2 - k*x2    b  = y2 - k*x2           b  = y2 - k*x2
Далее надо учесть случай x1 = x2 (надо нарисовать вертикальную линию) т.к. будет деление на 0
А для всех остальных случаев можно сделать два цикла, зная коэффициенты k и b
Тогда для рисования линии надо написать два последовательных цикла.
В первом перечисляя координаты min(x1, x2) -> max(x1, x2) и вычисляя y` = k*x` + b рисуете точки по найденным координатам (x`, y`)
Во втором теперь перечисляете координаты min(y1, y2) -> max(y1, y2) и вычисляя x` = (y` - b) / k
рисуете точки по найденным координатам (x`, y`)

Зачем же нужны два цикла. Можно обойтись и одним, но тогда надо проверять угол наклона прямой. Иначе, если прямая имеет угол от -45 до 45 градусов, тогда она будет нарисована в виде отдельных точек (если оставить только первый цикл, но только второй цикл её нарисует нормально).

С окружностью все довольно просто. Достаточно посчитать координаты дуги от 0 до 45 градусов и зеркально их поменять: A(x`, y`), B(y`, x`), C(-y`, x`), D(-x`, y`), E(-x`, -y`), F(-y`, -x`), G(y`, -x`), H(x`, -y`)
Эти точки позволят зеркально нарисовать дугу 0 - 45 градусов и составить из неё окружность.
Уравнение для рисования окружности же sqr(x` - x1) + sqr(y` - y1) = sqr(r)
macomics вне форума Ответить с цитированием
Старый 05.04.2023, 22:51   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Тут, так думаю, лучше познакомиться с алгоритмами Брезенхэма для рисования линий и окружностей.
Делал это много лет назад, но и сегодня в Сети есть решения на ассемблере.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.04.2023, 23:15   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Тут, так думаю, лучше познакомиться с алгоритмами Брезенхэма для рисования линий и окружностей.
Я это и описал...
macomics вне форума Ответить с цитированием
Старый 06.04.2023, 03:21   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если я ни где не ошибся в формулах, тогда вот рисование линий
Код:
COLOR   EQU BYTE PTR [BP + 20]
END_Y   EQU WORD PTR [BP + 18]
END_X   EQU WORD PTR [BP + 16]
START_Y EQU WORD PTR [BP + 14]
START_X EQU WORD PTR [BP + 12]
DRAWLINE:
	PUSH	ES
	PUSH	BX
	PUSH	SI
	PUSH	DI
	PUSH	BP
	MOV	BP, SP
	MOV	DI, 0A000H
	MOV	AX, START_X
	MOV	BX, START_Y
	MOV	CX, END_X
	MOV	DX, END_Y
	MOV	ES, DI
	CMP	AX, CX
	JE	VERTICAL_LINE
	JL	OKX
	XCHG	AX, CX

OKX:
	CMP	BX, DX
	JE	HORIZONTAL_LINE
	JL	OKY
	XCHG	BX, DX

OKY:
	MOV	DI, AX
	SUB	CX, AX
	SUB	DX, BX
	CMP	CX, DX
	JL	LINE_AT_Y
	MOV	AX, DX
	IMUL	CONST100
	IDIV	CX
	MOV	SI, AX
	IMUL	DI
	IDIV	CONST100
	SUB	BX, AX
	CMP	DI, 0
	JGE	LPX
	XOR	DI, DI

LPX:
	CMP	DI, 320
	JGE	OUT_OF_BOUNDS
	MOV	AX, DI
	IMUL	SI
	IDIV	CONST100
	ADD	AX, BX
	MOV	DX, 320
	CMP	AX, 0
	JL	SKIPX
	CMP	AX, 200
	JGE	SKIPX
	PUSH	DI
	MUL	DX
	ADD	DI, AX
	MOV	AL, COLOR
	STOSB
	POP	DI

SKIPX:
	INC	DI
	LOOP	LPX
	JMP	OUT_OF_BOUNDS

LINE_AT_Y:
	XCHG	CX, DX
	MOV	AX, DX
	IMUL	CONST100
	IDIV	CX
	MOV	SI, AX
	IMUL	BX
	IDIV	CONST100
	SUB	DI, AX
	XCHG	BX, DI
	CMP	DI, 0
	JGE	LPY
	XOR	DI, DI

LPY:
	CMP	DI, 200
	JGE	OUT_OF_BOUNDS
	MOV	AX, DI
	IMUL	SI
	IDIV	CONST100
	ADD	AX, BX
	MOV	DX, 320
	CMP	AX, 0
	JL	SKIPY
	CMP	AX, DX
	JGE	SKIPY
	PUSH	DI
	MUL	DX
	ADD	DI, AX
	MOV	AL, COLOR
	STOSB
	POP	DI

SKIPY:
	INC	DI
	LOOP	LPY
	JMP	OUT_OF_BOUNDS

VERTICAL_LINE:
	CMP	AX, 0
	JL	OUT_OF_BOUNDS
	CMP	AX, 320
	JGE	OUT_OF_BOUNDS
	MOV	DI, AX
	CMP	BX, DX
	JE	SINGLE_POINT
	JL	OKV
	XCHG	BX, DX

OKV:
	XOR	CX, CX
	CMP	AX, CX
	JGE	OKQ
	MOV	AX, CX

OKQ:
	MOV	CX, 200
	CMP	DX, CX
	JL	OKR
	MOV	DX, CX

OKR:
	MOV	CX, DX
	SUB	CX, AX
	MOV	DX, 320
	MUL	DX
	ADD	DI, AX
	MOV	AL, COLOR

LPV:
	STOSB
	ADD	DI, 319
	LOOP	LPV
	JMP	OUT_OF_BOUNDS

HORIZONTAL_LINE:
	CMP	DX, 0
	JL	OUT_OF_BOUNDS
	CMP	DX, 200
	JGE	OUT_OF_BOUNDS

	MOV	DI, AX
	XOR	AX, AX
	CMP	DI, AX
	JGE	OKO
	MOV	DI, AX

OKO:
	MOV	AX, 320
	CMP	CX, AX
	JL	OKP
	MOV	CX, AX

OKP:
	MUL	BX
	SUB	CX, DI
	ADD	DI, AX
	MOV	AL, COLOR
	REP	STOSB
	JMP	OUT_OF_BOUNDS

SINGLE_POINT:
	CMP	BX, 0
	JL	OUT_OF_BOUNDS
	CMP	BX, 200
	JGE	OUT_OF_BOUNDS
	MOV	AX, 320
	MUL	BX
	ADD	DI, AX
	MOV	AL, COLOR
	STOSB

OUT_OF_BOUNDS:
	LEAVE
	POP	DI
	POP	SI
	POP	BX
	POP	ES
	RET	10
CONST100	DW 100
ADD: Вызывать, укладывая параметры в стек. Обратно извлекать не надо
Код:
	PUSH	1   ; COLOR_VALUE
	PUSH	100 ; END_Y_VALUE
	PUSH	100 ; END_X_VALUE
	PUSH	10  ; START_Y_VALUE
	PUSH	50  ; START_X_VALUE
	CALL	DRAWLINE

Последний раз редактировалось macomics; 06.04.2023 в 03:25.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять тему курсовой работы. Artsiom Помощь студентам 3 18.04.2017 09:12
НЕ могу понять в чем проблема моего кода paul_8 C# (си шарп) 5 13.10.2013 23:06
не могу понять пример работы с указателем Иаковъ Помощь студентам 6 04.07.2013 11:45
Void(не могу понять участок кода) Slems Visual C++ 5 03.09.2012 16:53
Функция рисования окружности в Delphi virtaanen Общие вопросы Delphi 8 31.10.2009 13:13