Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование на ассемблере. Трилистник(клевер,трехле, Проблема с рисованием. 
:(
    Опции темы
vladden
Дата 30.11.2013, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



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

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

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  5.jpg 3,97 Kb
PM MAIL   Вверх
ФедосеевПавел
Дата 1.12.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Если ОС - DOS, то могу поделиться примером из книги.
Правда, я его набирал для TASM, но для MASM будут какие-то незначительные изменения в синтаксисе.
Рисование окружности выполняется по параметрическому уравнению. Но из-за вытянутости экранов получался эллипс. Я добавил коррекцию по одной из осей координат поэтому при расчётах присутствуют два разных радиуса rx и ry.

Если трудно понять как рисовать на асме, то нарисуй для начала на ЯВУ один клевер. Потом проработай подпрограмму и примени её три раза для разных координат и цветов. И тогда приводи все к асму.
Код

;Пример из книги:
;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск:
;Издательство "Принтер", 1997.-584 с., илл.

;Пример 84.1. Вычисление координат точек, расположенных на окружности
;и вывод их на экран

.386

data    segment use16

x360            dd      180.0           ;константа перевода градусы-радианы
x36             dw      360             ;число точек на окружности
forcolor        db      10              ;салатовый цвет
;Координаты центра окружности
xc              dw      320
yc              dw      175
;Значение радиуса по осям
ratiox          equ     16              ;Соотношение строн монитора: 4:3 или 16:9
ratioy          equ     9
sizex           equ     640             ;Размер экрана при режиме 10h: 640x350
sizey           equ     350
_rx             equ     100
;_ry            equ     (_rx*ratiox*sizey)/(ratioy*sizex)       ;<-- Так будет переполнение и неверный результат
_ry             equ     (((_rx*sizey)/ratioy)*ratiox)/sizex

rx              dw      _rx             ;100
ry              dw      _ry             ;70
;Переменные
x               dw      ?               ;Текущие координаты точки окружности
y               dw      ?
angl            dw      1               ;Текущее значение угла

data    ends

text    segment use16
        assume CS:text, DS:data, SS:stk
;Подпрограмма изменения цвета пиксела
point           proc

        push    CX
        mov     CX, xc
        mov     AH, 0Ch
        mov     AL, forcolor
        mov     BH, 0
;       fld     yc1                     ;Это универсальная процедура расчитана на
;       fistp   yc                      ;несколько примеров, поэтому в ней присутствуют
                                        ;"лишние" команды и ссылки на несуществующие переменные
        mov     DX, yc
;       fld     xc1
;       fistp   xc
        mov     CX, xc
        sub     CX, x
        sub     DX, y
        int     10h
        pop     CX

        ret

point           endp

;Главная процедура
main            proc

        mov     AX, data                ;Инициализация регистра DS
        mov     DS, AX

        mov     AH, 0h                  ;Установка графического режима
        mov     AL, 10h         ;Режим 10h (640x350)
        int     10h

        mov     CX, x36         ;Число шагов построения окружности

        finit                           ;Инициализация сопроцессора
        fldpi                           ;Загрузка в стек числа pi
        fld     x360                    ;Загрузка в стек числа 180
        fdiv                            ;pi/180, результат в ST
        fstp    x360                    ;Сохранение в памяти коэффициента
                                        ;перевода градусов в радианы
;Вычисление координат точек и вывод рисунка
do:
        fld     x360                    ;Коэффициент градус-радианы в стек
        fild    angl                    ;Очередное значение угла в стек
        fmul                            ;перевод в радианы

        fsincos                 ;sin(x) -> ST(1), cos(x) -> ST(0)

        fild    ry                      ;Загрузка радиуса по координате y
        fmul                            ;Вычисление координаты y
        fistp   y                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fild    rx                      ;Загрузка радиуса по координате x
        fmul                            ;Вычисление координаты x
        fistp   x                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fwait                           ;Ожидание завершения работы сопроцессора

        call    point                   ;Вывод точки на экран

        inc     angl                    ;Приращение угла

        loop    do

;Задержка до нажатия клавиши
        mov     AH, 8
        int     21h

        mov     AX, 4C00h               ;Выод в DOS с кодом ошибки 0
        int     21h

main            endp

text    ends

stk     segment stack   'stack'
        db      1024 dup(?)
stk     ends

end     main


и ещё однотипный рисунок
Код

;Пример из книги:
;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск:
;Издательство "Принтер", 1997.-584 с., илл.

;Пример 84.2. Вычисление координат точек, расположенных на спирали
;и вывод их на экран

.386

data    segment use16

x360            dd      180.0           ;константа перевода градусы-радианы
x36             dw      360             ;число точек на окружности
forcolor        db      9               ;голубой цвет
;Координаты центра окружности
xc              dw      320
yc              dw      175

;
ratiox          equ     16              ;Соотношение строн монитора: 4:3 или 16:9
ratioy          equ     9
sizex           equ     640             ;Размер экрана при режиме 10h: 640x350
sizey           equ     350
_rx             equ     100
;_ry            equ     (_rx*ratiox*sizey)/(ratioy*sizex)       ;<-- Так будет переполнение и неверный результат
_ry             equ     (((_rx*sizey)/ratioy)*ratiox)/sizex

;Значение радиуса по осям
rx              dd      100.0
ry              dd      70.0
;Переменные
x               dw      ?               ;Текущие координаты точки окружности
y               dw      ?
angl            dw      1               ;Текущее значение угла
;
xc1             dd      320.0           ;Дополнительные переменные для
yc1             dd      175.0           ;преобразования координат центра
;Параметры спирали
del             dd      0.9985          ;Коэффициент сжатия спирали
delx            dd      1.0000004       ;Коэффициент перемещения по оси x
dely            dd      0.999997        ;Коэффициент перемещения по оси y

data    ends

text    segment use16
        assume CS:text, DS:data, SS:stk

;Подпрограмма изменения координат центра и радиуса
coord           proc

        fld     rx
        fmul    del
        fstp    rx

        fld     ry
        fmul    del
        fstp    ry

        fld     xc1
        fmul    delx
        fstp    xc1

        fld     yc1
        fmul    dely
        fstp    yc1

        ret
coord           endp

;Подпрограмма изменения цвета пиксела
point           proc

        push    CX

        mov     CX, xc
        mov     AH, 0Ch
        mov     AL, forcolor
        mov     BH, 0

        fld     yc1
        fistp   yc
        mov     DX, yc

        fld     xc1
        fistp   xc
        mov     CX, xc

        sub     CX, x
        sub     DX, y

        int     10h

        pop     CX

        ret

point           endp

;Главная процедура
main            proc

        mov     AX, data                ;Инициализация регистра DS
        mov     DS, AX

        mov     AH, 0h                  ;Установка графического режима
        mov     AL, 10h         ;Режим 10h (640x350)
        int     10h

        mov     CX, x36         ;Число шагов построения окружности

        finit                           ;Инициализация сопроцессора
        fldpi                           ;Загрузка в стек числа pi
        fld     x360                    ;Загрузка в стек числа 180
        fdiv                            ;pi/180, результат в ST
        fstp    x360                    ;Сохранение в памяти коэффициента
                                        ;перевода градусов в радианы
;Вычисление координат точек и вывод рисунка
do:
        fld     x360                    ;Коэффициент градус-радианы в стек
        fild    angl                    ;Очередное значение угла в стек
        fmul                            ;перевод в радианы

        fsincos                 ;sin(x) -> ST(1), cos(x) -> ST(0)

        fld     ry                      ;Загрузка радиуса по координате y
        fmul                            ;Вычисление координаты y
        fistp   y                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fld     rx                      ;Загрузка радиуса по координате x
        fmul                            ;Вычисление координаты x
        fistp   x                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fwait                           ;Ожидание завершения работы сопроцессора

        call    point                   ;Вывод точки на экран

        inc     angl                    ;Приращение угла

        call    coord                   ;Изменение координат и радиуса

        loop    do

;Задержка до нажатия клавиши
        mov     AH, 8
        int     21h

        mov     AX, 4C00h               ;Выод в DOS с кодом ошибки 0
        int     21h

main            endp

text    ends

stk     segment stack   'stack'
        db      1024 dup(?)
stk     ends

end     main



Это сообщение отредактировал(а) ФедосеевПавел - 1.12.2013, 19:44
PM   Вверх
vladden
Дата 7.12.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 1.12.2013,  19:34)
Если ОС - DOS, то могу поделиться примером из книги.
Правда, я его набирал для TASM, но для MASM будут какие-то незначительные изменения в синтаксисе.
Рисование окружности выполняется по параметрическому уравнению. Но из-за вытянутости экранов получался эллипс. Я добавил коррекцию по одной из осей координат поэтому при расчётах присутствуют два разных радиуса rx и ry.

Если трудно понять как рисовать на асме, то нарисуй для начала на ЯВУ один клевер. Потом проработай подпрограмму и примени её три раза для разных координат и цветов. И тогда приводи все к асму.
Код

;Пример из книги:
;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск:
;Издательство "Принтер", 1997.-584 с., илл.

;Пример 84.1. Вычисление координат точек, расположенных на окружности
;и вывод их на экран

.386

data    segment use16

x360            dd      180.0           ;константа перевода градусы-радианы
x36             dw      360             ;число точек на окружности
forcolor        db      10              ;салатовый цвет
;Координаты центра окружности
xc              dw      320
yc              dw      175
;Значение радиуса по осям
ratiox          equ     16              ;Соотношение строн монитора: 4:3 или 16:9
ratioy          equ     9
sizex           equ     640             ;Размер экрана при режиме 10h: 640x350
sizey           equ     350
_rx             equ     100
;_ry            equ     (_rx*ratiox*sizey)/(ratioy*sizex)       ;<-- Так будет переполнение и неверный результат
_ry             equ     (((_rx*sizey)/ratioy)*ratiox)/sizex

rx              dw      _rx             ;100
ry              dw      _ry             ;70
;Переменные
x               dw      ?               ;Текущие координаты точки окружности
y               dw      ?
angl            dw      1               ;Текущее значение угла

data    ends

text    segment use16
        assume CS:text, DS:data, SS:stk
;Подпрограмма изменения цвета пиксела
point           proc

        push    CX
        mov     CX, xc
        mov     AH, 0Ch
        mov     AL, forcolor
        mov     BH, 0
;       fld     yc1                     ;Это универсальная процедура расчитана на
;       fistp   yc                      ;несколько примеров, поэтому в ней присутствуют
                                        ;"лишние" команды и ссылки на несуществующие переменные
        mov     DX, yc
;       fld     xc1
;       fistp   xc
        mov     CX, xc
        sub     CX, x
        sub     DX, y
        int     10h
        pop     CX

        ret

point           endp

;Главная процедура
main            proc

        mov     AX, data                ;Инициализация регистра DS
        mov     DS, AX

        mov     AH, 0h                  ;Установка графического режима
        mov     AL, 10h         ;Режим 10h (640x350)
        int     10h

        mov     CX, x36         ;Число шагов построения окружности

        finit                           ;Инициализация сопроцессора
        fldpi                           ;Загрузка в стек числа pi
        fld     x360                    ;Загрузка в стек числа 180
        fdiv                            ;pi/180, результат в ST
        fstp    x360                    ;Сохранение в памяти коэффициента
                                        ;перевода градусов в радианы
;Вычисление координат точек и вывод рисунка
do:
        fld     x360                    ;Коэффициент градус-радианы в стек
        fild    angl                    ;Очередное значение угла в стек
        fmul                            ;перевод в радианы

        fsincos                 ;sin(x) -> ST(1), cos(x) -> ST(0)

        fild    ry                      ;Загрузка радиуса по координате y
        fmul                            ;Вычисление координаты y
        fistp   y                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fild    rx                      ;Загрузка радиуса по координате x
        fmul                            ;Вычисление координаты x
        fistp   x                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fwait                           ;Ожидание завершения работы сопроцессора

        call    point                   ;Вывод точки на экран

        inc     angl                    ;Приращение угла

        loop    do

;Задержка до нажатия клавиши
        mov     AH, 8
        int     21h

        mov     AX, 4C00h               ;Выод в DOS с кодом ошибки 0
        int     21h

main            endp

text    ends

stk     segment stack   'stack'
        db      1024 dup(?)
stk     ends

end     main


и ещё однотипный рисунок
Код

;Пример из книги:
;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск:
;Издательство "Принтер", 1997.-584 с., илл.

;Пример 84.2. Вычисление координат точек, расположенных на спирали
;и вывод их на экран

.386

data    segment use16

x360            dd      180.0           ;константа перевода градусы-радианы
x36             dw      360             ;число точек на окружности
forcolor        db      9               ;голубой цвет
;Координаты центра окружности
xc              dw      320
yc              dw      175

;
ratiox          equ     16              ;Соотношение строн монитора: 4:3 или 16:9
ratioy          equ     9
sizex           equ     640             ;Размер экрана при режиме 10h: 640x350
sizey           equ     350
_rx             equ     100
;_ry            equ     (_rx*ratiox*sizey)/(ratioy*sizex)       ;<-- Так будет переполнение и неверный результат
_ry             equ     (((_rx*sizey)/ratioy)*ratiox)/sizex

;Значение радиуса по осям
rx              dd      100.0
ry              dd      70.0
;Переменные
x               dw      ?               ;Текущие координаты точки окружности
y               dw      ?
angl            dw      1               ;Текущее значение угла
;
xc1             dd      320.0           ;Дополнительные переменные для
yc1             dd      175.0           ;преобразования координат центра
;Параметры спирали
del             dd      0.9985          ;Коэффициент сжатия спирали
delx            dd      1.0000004       ;Коэффициент перемещения по оси x
dely            dd      0.999997        ;Коэффициент перемещения по оси y

data    ends

text    segment use16
        assume CS:text, DS:data, SS:stk

;Подпрограмма изменения координат центра и радиуса
coord           proc

        fld     rx
        fmul    del
        fstp    rx

        fld     ry
        fmul    del
        fstp    ry

        fld     xc1
        fmul    delx
        fstp    xc1

        fld     yc1
        fmul    dely
        fstp    yc1

        ret
coord           endp

;Подпрограмма изменения цвета пиксела
point           proc

        push    CX

        mov     CX, xc
        mov     AH, 0Ch
        mov     AL, forcolor
        mov     BH, 0

        fld     yc1
        fistp   yc
        mov     DX, yc

        fld     xc1
        fistp   xc
        mov     CX, xc

        sub     CX, x
        sub     DX, y

        int     10h

        pop     CX

        ret

point           endp

;Главная процедура
main            proc

        mov     AX, data                ;Инициализация регистра DS
        mov     DS, AX

        mov     AH, 0h                  ;Установка графического режима
        mov     AL, 10h         ;Режим 10h (640x350)
        int     10h

        mov     CX, x36         ;Число шагов построения окружности

        finit                           ;Инициализация сопроцессора
        fldpi                           ;Загрузка в стек числа pi
        fld     x360                    ;Загрузка в стек числа 180
        fdiv                            ;pi/180, результат в ST
        fstp    x360                    ;Сохранение в памяти коэффициента
                                        ;перевода градусов в радианы
;Вычисление координат точек и вывод рисунка
do:
        fld     x360                    ;Коэффициент градус-радианы в стек
        fild    angl                    ;Очередное значение угла в стек
        fmul                            ;перевод в радианы

        fsincos                 ;sin(x) -> ST(1), cos(x) -> ST(0)

        fld     ry                      ;Загрузка радиуса по координате y
        fmul                            ;Вычисление координаты y
        fistp   y                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fld     rx                      ;Загрузка радиуса по координате x
        fmul                            ;Вычисление координаты x
        fistp   x                       ;Запись её в память в формате целого
                                        ;числа с звлечением из стека
        fwait                           ;Ожидание завершения работы сопроцессора

        call    point                   ;Вывод точки на экран

        inc     angl                    ;Приращение угла

        call    coord                   ;Изменение координат и радиуса

        loop    do

;Задержка до нажатия клавиши
        mov     AH, 8
        int     21h

        mov     AX, 4C00h               ;Выод в DOS с кодом ошибки 0
        int     21h

main            endp

text    ends

stk     segment stack   'stack'
        db      1024 dup(?)
stk     ends

end     main

к сожалению ОС Windows
PM MAIL   Вверх
ФедосеевПавел
Дата 8.12.2013, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Ладно, Win - так Win.
За прошедшие 8 дней ты, наверное, изучил, как выглядит HelloWord in Assembler for Windows (Win32).
Предлагаю, к процедуре окна добавить процедуру рисования сначала одного трилистника.
Для понимания, какие API понадобятся уже при рисовании - почитай Петзольда (Петцольд Ч. Программирование для Windows 95) - легко ищется в интернете. У него пример - рисование с масштабированием графика синусоиды.
------------------------------
Если у тебя установлен пакет masm32, то он имеет пример графики "\masm32\examples\exampl02\gdibits\"

------------------------------
Если переработать чуть-чуть пример, то так


Это сообщение отредактировал(а) ФедосеевПавел - 9.12.2013, 09:03

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  clovers.zip 2,72 Kb
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.