Графика в assemblere

Тема в разделе "WASM.BEGINNERS", создана пользователем Love1, 13 янв 2007.

  1. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Tasm.Хочу прикрепить ,но почему-то не хочет
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    Дак и я писал про то же - её код в #1 одноразовый по определению и это не баг :)
    А если крутить в цикле, то цикл должен быть охватывающий, т.е. включать определение счётчика и коррекцию Gamma, а её цикл это просто отрисовочный перебор точек.

    Love1
    А в чём собственно проблема?
    Все FPU команды в 16 разрядном режиме такие же, в твоей проге только добавляется
    fld [Gamma]
    fadd ST(0), ST(2) ; alpha + gamma
    см. приведённую в #11 формулу
    и охватывающий цикл ;)
    Или у тебя настолько туго с асмом?

    Зы: остальные изменения в алгоритме касаются только оптимизиции (я ислючил повторное вычисление того, что уже вычислено) и перехода от построения точек к заполнению массива, но это как раз переиграть назад не проблема ;) вместо моих [edi].R4Rect.X, Y возвращаешь свои обычные X, Y
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ладно, не надо. я уже на Fasm начал делать)
    если доделаю, то там уже на Tasm перевести не сложно будет.
     
  4. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Круто ;)))
    Тасм есть в инструменталке wasm, а сюда не старайся - не прикрепится ;)))

    Ух ты сумела :)))
     
  6. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Varnie,куда вы пропали?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Love1
    А сама не хочешь попробовать?
    Я же тебе даже оптимизиованный код написал - fpu комманды в 16 и 32 разрядном режиме одинаковые ;)
     
  8. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    просто я давно к асму не притрагивался, вот и в нек. местах начал спотыкаться. но, если уважаемый Y_Mur мог бы глянуть на мою поделку его идеи, то я думаю мы бы тебе таки доделали прогу под ДОС:)
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    Самый простейший вариант - два раза добавить в её код + Gamma ;) уж ты то надеюсь понял где?
    После проверки нажатия кнопки если это Пробел то FLD [Gamma]; FADD[Step_Gamma]; FSTP[Gamma]; очистить экран и вернуться в точку где задаётся cx, а если Ескейп, то выход из проги.
    Задачка элементарная, но на месте препода Love1, я бы попросил её объяснить, что делает её код, и как его можно улучшить ;)))
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Y_Mur,
    да, насчет +Gamma я догнал:) но я щас хочу применить ваш код из вашего сорца под винду, а не получается что-то. рисуется фигнотень какая-то, простите (я где-то ошибся видать). а насчет обработки нажатий клавиши - это я сделал.

    буду рад, если посмотрите что я тут в коде ошибся:

    Код (Text):
    1. finit ;инициализация сопроцессора
    2.  
    3.  ; подсчет координат и вывод точек
    4.  output:
    5.  
    6.     mov ecx, 360        ; 360 градусов
    7.     fldz        ; Alpha = 0
    8.     l1:
    9.       ; r = A*sin(B*alpha)
    10.       fld ST0 ; alpha
    11.       fmul [b]
    12.       fsin
    13.       fmul [A]  ; r готов
    14.       ;x = r*cos(alpha+gamma),  y = r*sin(alpha+gamma)
    15.       fld [Gamma]
    16.       fadd ST0, ST2  ; alpha + gamma
    17.       fsincos   ; в ST(0) cos, в ST(1) sin, в ST(2) r, в ST(3) alpha
    18.       fmul ST0, ST2  ; r*cos(alpha+gamma)
    19.       fadd [xdiv2]
    20.       fstp dword [edi+RoseStruc.X]
    21.       fmul ST0, ST1  ; r*sin(alpha+gamma)
    22.       fadd [ydiv2]
    23.       fstp dword [edi+RoseStruc.Y]
    24.  
    25.       PutPixel word [edi+RoseStruc.X], word [edi+RoseStruc.Y], 0ah   ; сама отрисовка текущей точки
    26.  
    27.       add edi, sizeof.RoseStruc      ; перейти к следующей точке
    28.       dec ecx
    29.       fstp ST0                       ; Выкинуть r из ST(0)
    30.       fadd [Step]                    ; Шаг по Alpha
    31.     jnz l1
    32.     fstp ST0                         ; Выкинуть Alpha из ST(0)
    33.  
    34.  to_wait:
    35.     mov     ah,1
    36.     int     16h            ; Проверяем нажата ли клавиша
    37.     jz      to_wait        ; если нет, то ждем пока не нажмут
    38.  
    39.     xor ah,ah              ;
    40.     int     16h            ; Читаем код нажатой клавиши
    41.  
    42.     cmp     ax,011Bh       ; Это Esc?
    43.     jz     to_exit         ; да, идем на завершение проги
    44.  
    45.     cmp al, ' '            ; это пробел?
    46.     jnz  to_wait           ; нет -- ждем нажатие клавиши
    47.  
    48. to_next:                   ;иначе увеличиваем значение гаммы и крутим цикл по подсчету и выводу точек
    49.     fld [Gamma]
    50.     fadd [Step]
    51.     fstp [Gamma]
    52.     jmp output
    53.  
    54. to_exit:
    имха, я тут с массивом точек не подумавши поступил. в этом случае он нафик не нужен ведь.
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Раз код досовый то регистры лучше использовать без е...
    Скорее всего PutPixel изменяет di, потому не рисует. Используй обычные переменные. Мне edi был нужен для заполнения массива, который потом передаётся в DrawCurve. И шаг по Альфа верни мелкий, ты же рисуешь каждую точку, а не экстраполируешь массив в кривую как GDI+ ;)
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    да, вы правы. дело в шаге, хотя я его не могу подобрать подходящий че-то. но думаю еще..
    а еще, я позабыл сделать очистку экрана после каждого вывода положения графика.
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    во! ФАКТИЧЕСКИ СДЕЛАЛ !!! :))
    ща прилеплю очистку экрана после каждого вывода очередной розочки и готово!:))

    added: вот, прикрепил сорцы и экзешник. у меня все работает! правда код я не причесывал. например, у меня после кажд. отрисовки текущего положения розочки происходит очистка всего экрана, а это нерационально. по идее, можно только точки графика затирать в черный. ну, надо будет - доведем до ума.
    а сейчас у меня в главном цикле вся графика отрисовывается (оси графика, шапка твоя, и собссно, сама розочка).
    пробел - прокрутить розочку
    эскейп - выход.
    писал все на FASM.
     
  14. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Спасибо, спасибо!Только у меня почему-то при нажатии пробела фоновый цвет меняется на зеленый и в результате цветок совсем не видно.Что это может быть?
     
  15. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    хм, проверяю, проверяю, а такого недочета не вижу..
    но буду ковыряться еще.
     
  16. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    проверь вот эту болванку, сейчас роза нормально вертится у тебя?
     
  17. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Все равно только нажимаю пробел сразу фон начинае маргать.А вы не могли бы мне Fasm прикрепить
     
  18. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Love1,
    FASM лежит здесь: http://www.wasm.ru/tools/7/fasmw.zip

    added: вот немножко переделал. проверь сейчас.
    а вообще, твои бы все макросы убрать и на вызовы процедур заменить - код бы намного короче появился. если надо - сделаем.
     
  19. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    СпасиБО!!!, теперь проблем нет. Единственное, что!!! МНЕ НУЖЕН КОД!!!
    кинь ПЛ333!!!
     
  20. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Love1,
    вот, наконец-то. надеюсь, это файнал релиз:)
    на FASMе написал. ссылка на него чуть выше.