Графика в assemblere

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

  1. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Ребята ,подскажите как сделать чтобы цветок вращался?
    Помогите пожалуйста
     
  2. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Это замечательная идея.А если серьезно.Мне очень нужна помощь.
     
  3. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Помогите Пожалуйста ,а то я пропала
     
  4. varnie

    varnie New Member

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

    самое первое что в голову пришло: обрабатывай время, и через опред. интервал (нек кол-во миллисекунд), пробегайся по всем точкам своего графика и применяй к ним уравнение перемещщения по окружности. вот и будет, что твоя роза как бы вертится.
    или ты тО и спрашивала - как этот поворот сделать собссно?

    added: а вообще, откопай какую-нибудь простенькую демку с сорцами и погляди, как там вращение сделано.
     
  5. varnie

    varnie New Member

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

    Код (Text):
    1.        
    2.                  const f64 GRAD_PI2              = 3.1415926535897932384626433832795 / 180.0;
    3.  
    4.                  void rotateXZBy(f64 degrees, const vector3d<T>& center)
    5.                  {
    6.                          degrees *=GRAD_PI2;
    7.                          T cs = (T)cos(degrees);
    8.                          T sn = (T)sin(degrees);
    9.                          X -= center.X;
    10.                          Z -= center.Z;
    11.                          set(X*cs - Z*sn, Y, X*sn + Z*cs);
    12.                          X += center.X;
    13.                          Z += center.Z;
    14.                  }
    15.  
    16.                  void rotateXYBy(f64 degrees, const vector3d<T>& center)
    17.                  {
    18.                          degrees *=GRAD_PI2;
    19.                          T cs = (T)cos(degrees);
    20.                          T sn = (T)sin(degrees);
    21.                          X -= center.X;
    22.                          Y -= center.Y;
    23.                          set(X*cs - Y*sn, X*sn + Y*cs, Z);
    24.                          X += center.X;
    25.                          Y += center.Y;
    26.                  }
    27.  
    28.                  void rotateYZBy(f64 degrees, const vector3d<T>& center)
    29.                  {
    30.                          degrees *=GRAD_PI2;
    31.                          T cs = (T)cos(degrees);
    32.                          T sn = (T)sin(degrees);
    33.                          Z -= center.Z;
    34.                          Y -= center.Y;
    35.                          set(X, Y*cs - Z*sn, Y*sn + Z*cs);
    36.                          Z += center.Z;
    37.                          Y += center.Y;
    38.                 }
    где метод set() имеет следующий вид:
    Код (Text):
    1.  void set(const T nx, const T ny, const T nz)
    2.  {
    3.     X=nx; Y=ny; Z=nz;
    4.  }
    у тебя даже проще, т.к. у тебя двумерное пространство.
     
  6. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    А мне препод сказал нужно вот эти формулы вставить, а вот куда их поместить я не знаю. Может быть вы знаете

    (xdiv2+divK*r*cos(alfa+угол_поворота) , ydiv2-divK*r*sin(alfa+угол_поворота))
    r=10*sin(3*alpha)
     
  7. varnie

    varnie New Member

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

    касаемо формул: я не понял что такое divK только:)
    и еще, не забудь задать угол_поворота, и в процедуре, которая по таймеру сабатывает, не забудь увеличивать этот угол поворота. и ежели он будет >= 360, то сбрасывай его в 0 опять.
     
  8. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Я конечно все это поняла только на asme не могу это реализовать.Моя проблема только в этом.
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    у тебя даже в твоем коде есть *уже* готовая запрограммированная формула
    r=10*sin(3*alpha) . осталось тебе найти нужное прерываине для обработки таймера и там эту формулу поюзать и те две других, что ты написала, и не забыть учесть угол_поворота.
    поищи это прерывание.
    ps: у меня щас почти нету времени, но я если найду, дам тебе знать
    pps: или вообще просто там же в цикле, где ты r=10*sin(3*alpha) реализовала сделай и те две других ф-лы. у тебя фактически все реализовано! то же наращивание альфа,судя по коду и комментам твоим!!
    так тоже нормально по идее будет, хотя не уверен (может получиться очень быстро)
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Я вроде бы понял, у тебя главный цикл пробегается первый раз по всем точкам (пробегается 188bh), все отрисовывает. т.е. отрисовывается начальное положение твоего графика. а затем у тебя прога ждет нажатия клавиши и завершает свою работу.
    имха, тут баг.
    по идее, нужно в этом цикле и проверять, была ли нажата клавиша, и если да, то прыгать уже ЗА цикл, на выход. а если нет, то опять в cx кидать 188bh и по новой цикл крутить:)
    перепроверь этот момент.
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    Не угадал ;)
    Чтобы вращалось, нужно добавить угол поворота, т.е. из исходных формул:
    r = A*sin(B*alpha), x = r*cos(alpha), y = r*sin(alpha)
    сделать:
    r = A*sin(B*alpha), x = r*cos(alpha+gamma), y = r*sin(alpha+gamma)
    где Гамма, а не Альфа угол поворта.
    Код:
    Код (Text):
    1.     ; Вычисляем массив координат
    2.     mov ecx, 360    ; 360 градусов
    3.     mov edi, offset Rose    ; Адрес массива рисуемых точек
    4.     fldz    ; Alpha = 0
    5.     l1:
    6.       ; r = A*sin(B*alpha)
    7.       fld ST(0) ; alpha
    8.       fmul [b]
    9.       fsin
    10.       fmul [A]  ; r готов
    11.       ;x = r*cos(alpha+gamma),  y = r*sin(alpha+gamma)
    12.       fld [Gamma]
    13.       fadd ST(0), ST(2)  ; alpha + gamma
    14.       fsincos   ; в ST(0) cos, в ST(1) sin, в ST(2) r, в ST(3) alpha
    15.       fmul ST(0), ST(2)  ; r*cos(alpha+gamma)
    16.       fadd [X0]
    17.       fstp [edi].R4Point.X
    18.       fmul ST(0), ST(1)  ; r*sin(alpha+gamma)
    19.       fadd [Y0]
    20.       fstp [edi].R4Point.Y
    21.       ; Здесь можно добавить построение точки, я просто заполняю массив для последующей отрисовки
    22.       add edi, sizeof R4Point ; перейти к следующей точке
    23.       dec ecx
    24.       fstp ST(0)    ; Выкинуть r из ST(0)
    25.       fadd [Step]   ; Шаг по Alpha
    26.     jnz l1
    27.     fstp ST(0)      ; Выкинуть Alpha из ST(0)
    Love1
    Извини, давно не собирал прог под ДОС и что-то не тянет это вспоминать, так что аттач под Винду, для вращения нажать Пробел.
     
  12. varnie

    varnie New Member

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Есно в её варианте не баг а обычное завершение проги - она всё сделала и ждёт пока юзер налюбуется результатом ;)
    Ну а если добавлять вращение, то можно либо вешать его на таймер или обработчик нажатия кнопки, либо есно добавлять охватывающий цикл, но на современных машинах боюсь вращение просто в цикле получится слишком "бешеным" и его придётся "тормозить" нажатием клавиш или синхронизацией с таймером ;)
     
  14. varnie

    varnie New Member

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

    ps: а, ну если иметь ввиду, что ее код и планировался как код без вращения, то да, это не баг, это нормально. разок по циклу пробежались, отрисовали исходное положение всех точек, и ждем нажатия клавишы. и на выход. да, тогда я согласен, это не баг:)
     
  15. Love1

    Love1 New Member

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

    varnie New Member

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

    added: love1, подскажи только, ты какой компилер юзаешь, чтобы я сразу под него собирал.
     
  17. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Если вам удасться довести это до ума я вам буду очень благодарна.Зарание спасибо.
     
  18. Love1

    Love1 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    39
    Пожалуйста юзайте!
     
  19. Love1

    Love1 New Member

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

    Love1 New Member

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