я думаю, тут нужно поработать с матрицами и все такое. по идее, не сложно. если что найду поконкретнее - дам знать. а вообще, погугли! самое первое что в голову пришло: обрабатывай время, и через опред. интервал (нек кол-во миллисекунд), пробегайся по всем точкам своего графика и применяй к ним уравнение перемещщения по окружности. вот и будет, что твоя роза как бы вертится. или ты тО и спрашивала - как этот поворот сделать собссно? added: а вообще, откопай какую-нибудь простенькую демку с сорцами и погляди, как там вращение сделано.
вот нашел, хотя сорцы на си++, но главное, чтобы ты математич. смысл уловила, а далее уже на асме это сама реализуешь. Код (Text): const f64 GRAD_PI2 = 3.1415926535897932384626433832795 / 180.0; void rotateXZBy(f64 degrees, const vector3d<T>& center) { degrees *=GRAD_PI2; T cs = (T)cos(degrees); T sn = (T)sin(degrees); X -= center.X; Z -= center.Z; set(X*cs - Z*sn, Y, X*sn + Z*cs); X += center.X; Z += center.Z; } void rotateXYBy(f64 degrees, const vector3d<T>& center) { degrees *=GRAD_PI2; T cs = (T)cos(degrees); T sn = (T)sin(degrees); X -= center.X; Y -= center.Y; set(X*cs - Y*sn, X*sn + Y*cs, Z); X += center.X; Y += center.Y; } void rotateYZBy(f64 degrees, const vector3d<T>& center) { degrees *=GRAD_PI2; T cs = (T)cos(degrees); T sn = (T)sin(degrees); Z -= center.Z; Y -= center.Y; set(X, Y*cs - Z*sn, Y*sn + Z*cs); Z += center.Z; Y += center.Y; } где метод set() имеет следующий вид: Код (Text): void set(const T nx, const T ny, const T nz) { X=nx; Y=ny; Z=nz; } у тебя даже проще, т.к. у тебя двумерное пространство.
А мне препод сказал нужно вот эти формулы вставить, а вот куда их поместить я не знаю. Может быть вы знаете (xdiv2+divK*r*cos(alfa+угол_поворота) , ydiv2-divK*r*sin(alfa+угол_поворота)) r=10*sin(3*alpha)
ну да, это же 3 формулы по изменению положения точки в двумерном пространстве. первая формула меняет координату x, вторая -- y, а третья - радиус. тебе фактически осталось поюзать эти формулы, перенеся их в асм. ну сама посуди, тебе надо чтобы у тебя твоя вся петрушка вращалась с изменением времени. получается, что тебе нужно преобрабовывать твои все точки (изменять их положение) в процедуре, которая будет вызываться все время на каждой итерации времени, если так можно выразиться. короче, по таймеру. так что, создай процедуру, срабатывающую по таймеру (обрабатывай время, короче), и там в цикле пробегайся по всем своим точкам твоей "розочки" (т.е. по всем точкам этого графика), и к ним применяй эти 3 формулы для изменения их положения. касаемо формул: я не понял что такое divK только и еще, не забудь задать угол_поворота, и в процедуре, которая по таймеру сабатывает, не забудь увеличивать этот угол поворота. и ежели он будет >= 360, то сбрасывай его в 0 опять.
у тебя даже в твоем коде есть *уже* готовая запрограммированная формула r=10*sin(3*alpha) . осталось тебе найти нужное прерываине для обработки таймера и там эту формулу поюзать и те две других, что ты написала, и не забыть учесть угол_поворота. поищи это прерывание. ps: у меня щас почти нету времени, но я если найду, дам тебе знать pps: или вообще просто там же в цикле, где ты r=10*sin(3*alpha) реализовала сделай и те две других ф-лы. у тебя фактически все реализовано! то же наращивание альфа,судя по коду и комментам твоим!! так тоже нормально по идее будет, хотя не уверен (может получиться очень быстро)
Я вроде бы понял, у тебя главный цикл пробегается первый раз по всем точкам (пробегается 188bh), все отрисовывает. т.е. отрисовывается начальное положение твоего графика. а затем у тебя прога ждет нажатия клавиши и завершает свою работу. имха, тут баг. по идее, нужно в этом цикле и проверять, была ли нажата клавиша, и если да, то прыгать уже ЗА цикл, на выход. а если нет, то опять в cx кидать 188bh и по новой цикл крутить перепроверь этот момент.
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): ; Вычисляем массив координат mov ecx, 360 ; 360 градусов mov edi, offset Rose ; Адрес массива рисуемых точек fldz ; Alpha = 0 l1: ; r = A*sin(B*alpha) fld ST(0) ; alpha fmul [b] fsin fmul [A] ; r готов ;x = r*cos(alpha+gamma), y = r*sin(alpha+gamma) fld [Gamma] fadd ST(0), ST(2) ; alpha + gamma fsincos ; в ST(0) cos, в ST(1) sin, в ST(2) r, в ST(3) alpha fmul ST(0), ST(2) ; r*cos(alpha+gamma) fadd [X0] fstp [edi].R4Point.X fmul ST(0), ST(1) ; r*sin(alpha+gamma) fadd [Y0] fstp [edi].R4Point.Y ; Здесь можно добавить построение точки, я просто заполняю массив для последующей отрисовки add edi, sizeof R4Point ; перейти к следующей точке dec ecx fstp ST(0) ; Выкинуть r из ST(0) fadd [Step] ; Шаг по Alpha jnz l1 fstp ST(0) ; Выкинуть Alpha из ST(0) Love1 Извини, давно не собирал прог под ДОС и что-то не тянет это вспоминать, так что аттач под Винду, для вращения нажать Пробел.
Y_Mur, а мой предыдущий пост можете прокомментить? я со своими предположениями там прав или заблуждаюсь?
Есно в её варианте не баг а обычное завершение проги - она всё сделала и ждёт пока юзер налюбуется результатом Ну а если добавлять вращение, то можно либо вешать его на таймер или обработчик нажатия кнопки, либо есно добавлять охватывающий цикл, но на современных машинах боюсь вращение просто в цикле получится слишком "бешеным" и его придётся "тормозить" нажатием клавиш или синхронизацией с таймером
Y_Mur, так у нее же в исходном коде нету восстановления назад кол-ва точек в 188bh ! вот я о чем. раз цикл прогнался по всем 188bh точкам, и все, на выход. а ведь надо - пробежаться по всем 188bh точкам, затем изменить угол поворота, восстановить кол-во точек (ака cx) в 188bh, и по новой цикл крутить. и так, пока не будет клавиша нажата. вот тогда и будет "бешеный" крутящийся график, ведь так? я про этот ньюанс и имел ввиду, когда назвал это словом "баг". ps: а, ну если иметь ввиду, что ее код и планировался как код без вращения, то да, это не баг, это нормально. разок по циклу пробежались, отрисовали исходное положение всех точек, и ждем нажатия клавишы. и на выход. да, тогда я согласен, это не баг
Спасибо большое! Только мне нужно в 16-ти разрядном.Так а в моей программе нельзя сделать что-нибудь похожее на это
ну все, вы меня довели (шучу шучу) -- иду качать асм компилер и делать все по уму )). added: love1, подскажи только, ты какой компилер юзаешь, чтобы я сразу под него собирал.