Рисование на ассемблере. Трилистник(клевер,трехлепе стковая роза)

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
vladden
Сообщения: 5
Зарегистрирован: 30 ноя 2013, 18:22

30 ноя 2013, 18:33

Всем доброго времени суток!Прежде всего не сильно понимаю,зачем рисовать на ассемблере?
Никогда на ассемблере не рисовал,но вот теперь столкнулся.(пишу на ассемблере MASM)
Надо нарисовать поляну из 3-x разных по цвету треххлистников(их еще называют клевер,трехлепестковая роза)
Почитав в интернете про это я понял что надо использовать для этого математические формулы.
Формулы я нашел
r = a cos 3θ (радиус липестка,как я понял)
нашел формулу площади( ( [ATTACH]1840[/ATTACH] )

Помогите,нарисуте один трилистник,что бы я разобрался как их вообще рисовать.Пожалуйста,помогите,раньше не сталкивался с таким
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 ноя 2013, 21:15

Формула, конечно, жесть)) Ох уж эти математики, вечно их тянет с виду простую интерпретацию превратить в трехэтажное унылое Г. Вообще, в полярных координатах, трехлистник выражается зависимостью R = sin(3A), где А - текущий угол в полярных координатах, а R - получаемый радиус. Теперь то понятно как рисовать?

во-вторых не указан микропроцессор, операционная система
It's a long way to the top if you wanna rock'n'roll
vladden
Сообщения: 5
Зарегистрирован: 30 ноя 2013, 18:22

30 ноя 2013, 21:27

somewhere писал(а):Формула, конечно, жесть)) Ох уж эти математики, вечно их тянет с виду простую интерпретацию превратить в трехэтажное унылое Г. Вообще, в полярных координатах, трехлистник выражается зависимостью R = sin(3A), где А - текущий угол в полярных координатах, а R - получаемый радиус. Теперь то понятно как рисовать?

во-вторых не указан микропроцессор, операционная система
.686()
если вы об этом.
ОС Windows

Искал в интернете инфу по поводу рисования.
Сделал по примеру,вывод спирали.Вот код (MASM)
[ASM]
.686 ; директива визначення типу мікропроцесора
.model flat,stdcall ; завдання лінійної моделі пам’яті
; та угоди ОС Windows

option casemap:none ; відмінність малих та великих літер
option casemap:none ; отличие строчных и прописных букв
include C:\masm32\include\windows.inc ; файлы структур, констант
include C:\masm32\include\kernel32.inc ; системные функции приложений
include C:\masm32\include\user32.inc ; файлы интерфейса
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto :D WORD ; прототип процедури
OperDigs proto :D WORD, :D WORD, :D WORD ; прототип процедури

.data ; директива визначення даних
delta dd 0.001 ;шаг
const3 dd 3.0
const200 dd 200.0
x dw 0 ;координаты точки
y dw 0



.code ; директива початку програми
start: mov ax,12h ;инициализация графического режима 640х480
int 10h
mov si,0C45h/2 ;количество итераций =Pi/0.001
mov ax,0C03h
finit ;инициализация сопроцессора
fldz ;alpha = 0
l1: fld st ;st(0)=alpha st(1)=alpha
fmul const3 ;st(0)=alpha*3 st(1)=alpha
fsin ;st(0)=sin(alpha*3) st(1)=alpha
fmul const200 ;st(0)=200*sin(alpha*3) st(1)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3)
fld st ;st(0)=st(1)=alpha st(2)=200*sin(alpha*3)
fxch st(2) ;st(0)=200*sin(alpha*3) st(1)=alpha st(2)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3) st(2)=alpha
fsincos ;st(0)=cos(alpha) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fmul st,st(2) ;st(0)=200*cos(alpha)*sin(alpha*3) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fistp x ;X=200*cos(alpha)*sin(alpha*3) st(0)=sin(alpha) st(1)=200*sin(alpha*3) st(2)=alpha
fmul ;st(0)=200*sin(alpha)*sin(alpha*3) st(1)=alpha
fistp y ;Y=200*sin(alpha)*sin(alpha*3) st(0)=alpha
mov cx,x
mov di,cx
neg di
add cx,320 ;координаты точки относительно центра экрана
mov dx,y
add dx,200
int 10h ;выводим зеленую точку
lea cx,[di+320]
int 10h ;выводим зеленую точку
fadd delta ;вычисляем новое значение alpha
dec si
jnz l1 ;цикл пока SI не равно нулю
mov ah,0 ;ожидание нажатия клавиши
int 16h
mov ax,3;перевод обратно в TextMode
int 10h
exit: int 20h ;стандартный выход

END start
[/ASM]
Но и тут не без греха,ошибка
"cannot use 16-bit register with a 32-bit address"
Не могу ее решить....
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 ноя 2013, 21:34

Причем здесь Windows и int 10h, int 20h ? Вроде в ОС Windows видеорежимы не переключаются и создается и используется хендл окна для рисования. Или это просто копипаста?
"cannot use 16-bit register with a 32-bit address"
Где именно это пишет?
It's a long way to the top if you wanna rock'n'roll
vladden
Сообщения: 5
Зарегистрирован: 30 ноя 2013, 18:22

30 ноя 2013, 23:02

somewhere писал(а):Причем здесь Windows и int 10h, int 20h ? Вроде в ОС Windows видеорежимы не переключаются и создается и используется хендл окна для рисования. Или это просто копипаста?

Где именно это пишет?
Пишет это в MASM32

Скрин прилагается)
[ATTACH]1841[/ATTACH]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

01 дек 2013, 00:11

Понятно что в MASM - надо было сказать, что в 52-ой строке. Только по моим подсчетам там инструкция "int 10h" и такой ошибки генерится не может. Может у вас в файле по-другому?
It's a long way to the top if you wanna rock'n'roll
vladden
Сообщения: 5
Зарегистрирован: 30 ноя 2013, 18:22

01 дек 2013, 04:14

Нет в файле все так.
Не пойму.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 дек 2013, 10:20

Ну что, лень посмотреть какая инструкция в 52-ой строке?
It's a long way to the top if you wanna rock'n'roll
Ответить