На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Движение по прямой, мне кто-нибудь поможет?
    Всем добрый день!
    У меня есть проблема, которая уже звучала(на этом форуме тоже), но нормального ответа я никак не могу найти!
    Есть объект с координатами x,y. Тыкаем на форму получаем точку X,Y. Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y. Видел советы по поводу уравнения прямой и прочее и прочее...., но все приведенные примеры какието глючные! Самому не додумать т.к. незнаю в какую сторону надо думать. То двигает не в ту стророну, то неплавно, то вааще не двигает. :wall: :wall: :wall: Очень прошу дельного совета(или нормально РАБОРТАЮЩЕГО исходного кода).
    Заранее спасибо!
      Цитата ben1992 @
      Уважаемые знатоки, внимание вопрос КАК? мне плавно передвинуть объект из точки x,y в точку X,Y.

      Алгоритм Брезенхейма рисования прямой?
        Есть две точки, задающие отрезок, есть некоторое количество кадров, за которые необходимо попасть из одной точки в другую. Вычисляем приращения для одного кадра по каждой из осей. Прибавляем в каждом кадре вычисленные приращения к текущим координатам.
          ОГО оперативно :D . Кстати на форуме часы на час отстают

          Добавлено

          to Вуйко з полонини
          Цитата Вуйко з полонини @
          Алгоритм Брезенхейма рисования прямой

          Ща будем копать.

          to nOrd
          Цитата n0rd @
          Вычисляем приращения
          , а можно пример.
          Сообщение отредактировано: ben1992 -
            Цитата ben1992 @
            Кстати на форуме часы на час отстают

            Не отстают.


            Цитата ben1992 @
            а можно пример

            Если у вас возникают трудности с этим, может вам стоить начать с чего попроще? Например, с прямолинейного движения вдоль одной оси?
              to nOrd
              Во разобрался(не совсепм тупой как могло показатся)
              Получилось так:
              ExpandedWrap disabled
                if(X2>X1 && Y2>Y1)
                {
                 x=x+(X2-X1)/10;
                 y=y+(Y2-Y1)/10;
                   if(X2<X1 && Y2<Y1)
                   {
                   Timer2->Enabled=false;
                   }
                }
                 
                 
                 
                 
                if(X2<X1 && Y2<Y1)
                {
                 x=x-(X1-X2)/10;
                 y=y-(Y1-Y2)/10;
                     if(X2>X1 && Y2>Y1)
                     {
                     Timer2->Enabled=false;
                     }
                }

              Тока что бы взять за магическое число 10, а то не совсем красиво получается?
                ben1992, смотри, ежели всё совсем просто, то надо делать так. Ксть у тебя точки (x1 y1) (x2 y2)

                Общее уравнение прямой y=kx+b можно вывести из (y-y1)/(y2-y1)=(x-x1)/(x2-x1), в частности

                k=(y2-y1)/(x2-x1)
                  Цитата ben1992 @
                  ExpandedWrap disabled
                    if(X2>X1 && Y2>Y1)
                    //....
                    if(X2<X1 && Y2<Y1)

                  Гы. А если (X2>X1 && Y2<Y1) или наоборот? :) Напишете еще два if'а?


                  Цитата ben1992 @
                  Тока что бы взять за магическое число 10, а то не совсем красиво получается?

                  Зависит от того, чего вы хотите добиться. Если достижение цели за 10 кадров, то так и оставьте; если перемещения с постоянной скоростью, то надо вычислить длину отрезка и поделить на желаемую скорость.
                    Все всем спасибо за внимание разобрался. Вот код, авось пригодится
                    ExpandedWrap disabled
                       nn=10;
                      if(X2>X1 && Y2>Y1)
                      {
                       
                       x=x+(X2-X1)/nn;
                       y=y+(Y2-Y1)/nn;
                         if(X2<X1 && Y2<Y1)
                         {
                         Timer2->Enabled=false;
                         }
                      }
                      if(X2<X1 && Y2<Y1)
                      {
                       x=x-(X1-X2)/nn;
                       y=y-(Y1-Y2)/nn;
                           if(X2>X1 && Y2>Y1)
                           {
                           Timer2->Enabled=false;
                           }
                      }
                      if(X2<X1 && Y2>Y1)
                      {
                       x=x-(X1-X2)/nn;
                       y=y+(Y2-Y1)/nn;
                           if(X2>X1 && Y2<Y1)
                           {
                           Timer2->Enabled=false;
                           }
                       
                      }
                      if(X2>X1 && Y2<Y1)
                      {
                       x=x+(X2-X1)/nn;
                       y=y-(Y1-Y2)/nn;
                           if(X2<X1 && Y2>Y1)
                           {
                           Timer2->Enabled=false;
                           }
                      }


                    Добавлено
                    Цитата n0rd @
                    Напишете еще два if'а?
                    А почему бы и нет? Два не двадцать два :D :D :D .
                      Оканчивать анимацию имеет смысл когда были воспроизведены все кадры, а не по вашим странным условиям :) В общем случае ее надо заканчивать когда мы перестаем приближаться к целевой точке.



                      Цитата ben1992 @
                      А почему бы и нет? Два не двадцать два

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

                        Добавлено
                        ExpandedWrap disabled
                          if(i<nn) {
                           x=x+dx;
                           y=k*x+b;
                           i++;
                          }

                        x,y - текущие координаты
                        dx = X2-X1/nn - виличина приращения
                        nn - количество приращений
                        k,b - коэффициенты, вычисляемые по формулам заранее которые выводяться из системы
                        Y1=k*X1+b
                        Y2=k*X2+b

                        i - иттерационная переменная

                        :rolleyes: Правда проще получиться ?

                        Добавлено
                        А еще я умею равномерно двигать объекты по окружности :rolleyes:
                          Цитата n0rd @
                          а не по вашим странным условиям
                          Согласен условия странные, выведенные при помощи бумажки с ручкой и системы координат, но факт остаётся фактом, все замечательнол работает, а мне это и надо.


                          Цитата Serex @
                          вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле
                          +задержка по времени :blink: , помоему мой тупой вариант с кучей условий будет проще. :)

                          Цитата Serex @
                          А еще я умею равномерно двигать объекты по окружности
                          ну чтож молодец ;) .

                          Ладно, главное что все получилось и работает ;) . Serex, nOrd ,Вуйко з полонини, всем спасибо за помощь.
                            Цитата ben1992 @
                            Цитата (Serex @ Вчера, 17:51)
                            вычислять количество итераций или перемещений или кадров, и сделать одно условие, на проверку этого числа итераций или в цикле
                            +задержка по времени , помоему мой тупой вариант с кучей условий будет проще.

                            Ну ну, а если у тебя допустим 100 или 1000 итераций, вычислить один раз параметры или проверять кучу условий 100 или 1000 раз?
                            А потом в твоем коде не доработка, объект переместиться в другую точку а не ту которую хотел. Могу объянить почему....
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,1574 ]   [ 16 queries used ]   [ Generated: 15.06.21, 20:07 GMT ]