Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2011, 11:50   #11
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

да мне не надо реальный фуко моделировать), а всего лишь имитировать его движение(именно эту ромашку, как на картинке). Неужели всё-таки надо использовать график cos(4phi) ? Вернее нет! Сам маятник я то сделал. Точка вращается вокруг оси на опр угол с опр. скоростью. Получ матем. маятник. Потом я вращаю всю сцену в плоскости zx получается, что вращается сам маятник и он рисует эту ромашку. Теперь мне надо нарисовать след от песка. Проблема в том, что я не могу определить координаты шарика маятника относительно вращающейся сцены. В итоге получается линия как в матем маятнике

Последний раз редактировалось NiCola999; 03.01.2011 в 12:04.
NiCola999 вне форума Ответить с цитированием
Старый 03.01.2011, 12:08   #12
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

> Неужели всё-таки надо использовать график cos(4phi) ?
В gif'ках, где важен эффект, а не точность, так, конечно, и делают. Только коэффициентом при угле играются для вящего эффекту
http://en.wikipedia.org/wiki/Rose_curve
Vago вне форума Ответить с цитированием
Старый 03.01.2011, 12:32   #13
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

тогда встает проблема синхронизации шарика с графиком...
NiCola999 вне форума Ответить с цитированием
Старый 03.01.2011, 12:46   #14
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

А что там "синхронизировать"-то?! (x,y) шарика и его проекции (точки на розетке)- всегда одинаковы.
Vago вне форума Ответить с цитированием
Старый 03.01.2011, 12:50   #15
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Вы меня до сих пор не поняли =)) Шарик вращается только в плоскости yz. Затем вращается вся сцена. Координаты xy я то знаю. Но он будет рисовать прямую линию, так как он не вращается по xz, а вращается вся сцена. Просто если вращать шарик еще и в плоскости xz получается фигня какая-то, а не ромашка. Может я не так преобразования делаю?

Последний раз редактировалось NiCola999; 03.01.2011 в 12:53.
NiCola999 вне форума Ответить с цитированием
Старый 03.01.2011, 19:10   #16
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Да что тут можно "не понять" (хотя, конечно, механики и "триДэшники" обычно по-разному ориентируют координатную систему), кроме того, что (уж не обижайтесь, пожалуйста) человек запутался в преобразованиях координат...
...
ТАКОЕ
110103.jpg
Вам надо?..
Vago вне форума Ответить с цитированием
Старый 03.01.2011, 19:14   #17
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

угу), а можно глянуть на вашу программу?

Последний раз редактировалось NiCola999; 03.01.2011 в 19:26.
NiCola999 вне форума Ответить с цитированием
Старый 03.01.2011, 19:53   #18
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
// Декларации:

GLfloat     ballPos[3] ;	// Координаты шарика в пространстве
GLfloat     y0 ;      		// Высота крепления подвеса над плоскостью XOZ 
double      a,          	// К-т при "амплитуде" (при r)
            k,          	// К-т при theta (к-во лепестков "розы")
            lThread,		// Длина подвеса
//            PI ,      // сорри, ниже она - константой.
            r ,         	// "Амплитуда колебаний" шарика от оси OY
            t, 			// Текущее время
            deT ,    		// Шаг вычислений по времени
            theta ,     	// Угол, на который повернулась Земля
            w ;         	// Круговая скорость вращения Земли
vector<wxRealPoint>      trace ;	// Координаты следа будут втупую накапливаться; wxRealPoint - predefined-структурка из двух double (.x и .y)


// Инициализация (всеми константами можно смело играться, в зависимости от параметров окна):

   const double PI = 4.*atan( 1. );
   y0 = 2.5 ;   		// Высота точки подвеса над плоскостью XOZ
   a = 0.75 ;
   lThread = 0.95 * y0 ;   	// Длина подвеса
   k = 11.667 ;             
   theta = 0. ;
   t   = 0. ;
   deT = 0.05 ;
   w = 2. * PI / 64. ;		// Здесь можно поиграться знаменателем. Чем он меньше - тем быстрее вращается "Земля"
   ballPos[0] = 0. ; ballPos[1] = y0 - lThread; ballPos[2] = 0. ;
   trace.clear() ;


// Вычисления на очередном шаге анимации
   ...
   t += deT ;
   theta = w * t ;
   r = a * cos( k * theta ) ;
   ballPos[0] = r * cos( theta ) ;
   ballPos[2] = r * sin( theta ) ;
   // Координаты следа тупо накапливаются...
   trace.push_back( wxRealPoint( ballPos[0], ballPos[2] ) ) ;
   ...

// Где-то в "отрисовщике":
// ==================================================
// DrawBall
// ==================================================
void TestGLCanvas::DrawBall() {

   glColor3ub( 211, 199, 15 ) ;
   glPushMatrix() ;
   glTranslatef( ballPos[0], ballPos[1], ballPos[2] ) ;
   glutSolidSphere( 0.05, 20, 16) ;
   glPopMatrix() ;

   if ( isLight )
      glDisable( GL_LIGHTING ) ; 
   
   glColor3ub( 169, 169, 169 ) ;
   glBegin( GL_LINES ) ;
   glVertex3f( 0.0, y0, 0.0 ) ; 
   glVertex3f( ballPos[0], ballPos[1], ballPos[2] ) ; 
   glEnd() ;

   if ( isLight )
      glEnable( GL_LIGHTING ) ; 

}


// ==================================================
// DrawAxes
// ==================================================
void TestGLCanvas::DrawTrace() {

   int i ;

   if ( isLight ) glDisable( GL_LIGHTING ) ; 

   glColor3ub( 176, 169, 109 ) ;
   if ( trace.size() >= 2 ) {
      glBegin(GL_LINES);       
      glLineWidth( 2 ) ; 
     // ...и след переисовывается каждый раз полностью
      for ( i = 1; i < trace.size(); i++ ) {
         glVertex3f( trace[i-1].x, 0.0, trace[i-1].y ) ; 
         glVertex3f( trace[i].x, 0.0, trace[i].y ) ; 
      }
      glEnd() ;   
   }

   if ( isLight ) glEnable( GL_LIGHTING ) ; 

}

// Вызовы
...
glGetBooleanv( GL_LIGHTING, &isLight ) ;
DrawBall() ;
DrawTrace() ;
...
На картинке из пред. поста:
зелёная ось = OX (ballPos[0]);
красная - OY (ballPos[1])
синяя - OZ (ballPos[2])

> а можно глянуть на вашу программу?
C++ + OpenGL, обёрнутые в wxWidgets. На 40K исходников - на 1.7MB ехе-шник )) (статика). Надо?

Последний раз редактировалось Vago; 03.01.2011 в 20:00.
Vago вне форума Ответить с цитированием
Старый 03.01.2011, 20:07   #19
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

спасибо мне этого вполне достаточно!
NiCola999 вне форума Ответить с цитированием
Старый 03.01.2011, 20:39   #20
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Да, кстати, у меня там шарик над плоскостью XOZ летает на постоянной высоте Конечно, чем длиннее нить - тем это незаметнее, но, по-хорошему, в вычислениях должна быть ещё такая строчка:
Код:
m_ballPos[1] = y0 - sqrt( lThread * lThread - r * r ) ;
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметрический маятник Talker6 Помощь студентам 13 03.05.2010 18:18
Моделирование (маятник) alexmikt Общие вопросы C/C++ 0 21.04.2010 23:01
маятник manuk Общие вопросы C/C++ 3 20.04.2010 21:32
Математический маятник StudeHt Помощь студентам 0 15.03.2010 16:48
Маятник SuperEgo Помощь студентам 3 15.06.2007 10:03