varnie Дак и я писал про то же - её код в #1 одноразовый по определению и это не баг А если крутить в цикле, то цикл должен быть охватывающий, т.е. включать определение счётчика и коррекцию Gamma, а её цикл это просто отрисовочный перебор точек. Love1 А в чём собственно проблема? Все FPU команды в 16 разрядном режиме такие же, в твоей проге только добавляется fld [Gamma] fadd ST(0), ST(2) ; alpha + gamma см. приведённую в #11 формулу и охватывающий цикл Или у тебя настолько туго с асмом? Зы: остальные изменения в алгоритме касаются только оптимизиции (я ислючил повторное вычисление того, что уже вычислено) и перехода от построения точек к заполнению массива, но это как раз переиграть назад не проблема вместо моих [edi].R4Rect.X, Y возвращаешь свои обычные X, Y
ладно, не надо. я уже на Fasm начал делать) если доделаю, то там уже на Tasm перевести не сложно будет.
Love1 А сама не хочешь попробовать? Я же тебе даже оптимизиованный код написал - fpu комманды в 16 и 32 разрядном режиме одинаковые
просто я давно к асму не притрагивался, вот и в нек. местах начал спотыкаться. но, если уважаемый Y_Mur мог бы глянуть на мою поделку его идеи, то я думаю мы бы тебе таки доделали прогу под ДОС
varnie Самый простейший вариант - два раза добавить в её код + Gamma уж ты то надеюсь понял где? После проверки нажатия кнопки если это Пробел то FLD [Gamma]; FADD[Step_Gamma]; FSTP[Gamma]; очистить экран и вернуться в точку где задаётся cx, а если Ескейп, то выход из проги. Задачка элементарная, но на месте препода Love1, я бы попросил её объяснить, что делает её код, и как его можно улучшить ))
Y_Mur, да, насчет +Gamma я догнал но я щас хочу применить ваш код из вашего сорца под винду, а не получается что-то. рисуется фигнотень какая-то, простите (я где-то ошибся видать). а насчет обработки нажатий клавиши - это я сделал. буду рад, если посмотрите что я тут в коде ошибся: Код (Text): finit ;инициализация сопроцессора ; подсчет координат и вывод точек output: mov ecx, 360 ; 360 градусов fldz ; Alpha = 0 l1: ; r = A*sin(B*alpha) fld ST0 ; alpha fmul [b] fsin fmul [A] ; r готов ;x = r*cos(alpha+gamma), y = r*sin(alpha+gamma) fld [Gamma] fadd ST0, ST2 ; alpha + gamma fsincos ; в ST(0) cos, в ST(1) sin, в ST(2) r, в ST(3) alpha fmul ST0, ST2 ; r*cos(alpha+gamma) fadd [xdiv2] fstp dword [edi+RoseStruc.X] fmul ST0, ST1 ; r*sin(alpha+gamma) fadd [ydiv2] fstp dword [edi+RoseStruc.Y] PutPixel word [edi+RoseStruc.X], word [edi+RoseStruc.Y], 0ah ; сама отрисовка текущей точки add edi, sizeof.RoseStruc ; перейти к следующей точке dec ecx fstp ST0 ; Выкинуть r из ST(0) fadd [Step] ; Шаг по Alpha jnz l1 fstp ST0 ; Выкинуть Alpha из ST(0) to_wait: mov ah,1 int 16h ; Проверяем нажата ли клавиша jz to_wait ; если нет, то ждем пока не нажмут xor ah,ah ; int 16h ; Читаем код нажатой клавиши cmp ax,011Bh ; Это Esc? jz to_exit ; да, идем на завершение проги cmp al, ' ' ; это пробел? jnz to_wait ; нет -- ждем нажатие клавиши to_next: ;иначе увеличиваем значение гаммы и крутим цикл по подсчету и выводу точек fld [Gamma] fadd [Step] fstp [Gamma] jmp output to_exit: имха, я тут с массивом точек не подумавши поступил. в этом случае он нафик не нужен ведь.
Раз код досовый то регистры лучше использовать без е... Скорее всего PutPixel изменяет di, потому не рисует. Используй обычные переменные. Мне edi был нужен для заполнения массива, который потом передаётся в DrawCurve. И шаг по Альфа верни мелкий, ты же рисуешь каждую точку, а не экстраполируешь массив в кривую как GDI+
да, вы правы. дело в шаге, хотя я его не могу подобрать подходящий че-то. но думаю еще.. а еще, я позабыл сделать очистку экрана после каждого вывода положения графика.
во! ФАКТИЧЕСКИ СДЕЛАЛ !!! ) ща прилеплю очистку экрана после каждого вывода очередной розочки и готово!) added: вот, прикрепил сорцы и экзешник. у меня все работает! правда код я не причесывал. например, у меня после кажд. отрисовки текущего положения розочки происходит очистка всего экрана, а это нерационально. по идее, можно только точки графика затирать в черный. ну, надо будет - доведем до ума. а сейчас у меня в главном цикле вся графика отрисовывается (оси графика, шапка твоя, и собссно, сама розочка). пробел - прокрутить розочку эскейп - выход. писал все на FASM.
Спасибо, спасибо!Только у меня почему-то при нажатии пробела фоновый цвет меняется на зеленый и в результате цветок совсем не видно.Что это может быть?
Love1, FASM лежит здесь: http://www.wasm.ru/tools/7/fasmw.zip added: вот немножко переделал. проверь сейчас. а вообще, твои бы все макросы убрать и на вызовы процедур заменить - код бы намного короче появился. если надо - сделаем.