Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Canvas & Механика. Построение анимации.


Автор: L0GA4 15.12.2009, 17:24
 Здравствуйте. Возникла проблема построения анимации. В аттаче рисунок того что надо сделать.

Задача: нужно сделать анимацию.  Балка OA1 растягивается, все остальные балки(A1A2, A2B ) жесткие.
Нужно сделать так, чтобы при перемещении ползунка A1 , перемещался и ползунок А2. Так, чтобы длина A1A2 не изменялась. При этом при перемещении ползунка A2  катилась окружность B.  (черная точка на окружности показывает что катится)

Вот что получилось, но изменяется длина...пните кто-нить, а то мозг не работает...

как рисовать окружность понятно - координата по х будет изменяться на длину дуги.
хелп!
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var c,cy,i,yn,xn,q1,q2,
    xb2,yb2,xbs,ybs:integer; OB,AD,alfa,angl,k:real;

begin

  {стирание}

  PaintBox1.Canvas.Pen.Color:=ClWhite;
  PaintBox1.Canvas.Rectangle(1,1,L,H);


  x1:=trunc(65+AO);
  x2:=trunc(65+2*AO);
  xc1:=trunc(65+AO*3/2);
  yc1:=trunc(H-100);

  xc2:=xc1+trunc(AO*cos(-omega*t));
  yc2:=yc1+trunc(AO*sin(-omega*t));

  xb:=trunc(xc2+sqrt(sqr(AB)-sqr(yc2-H/2)))-240;
  yb:=yc1-50;

  PaintBox1.Canvas.Pen.Color:=ClBlack;

  PaintBox1.Canvas.Ellipse(xc1-5,yc1-5,xc1+5,yc1+5);



  PaintBox1.Canvas.Rectangle(xb-15,yb-5,xb+15,yb+5);
  PaintBox1.Canvas.MoveTo(xc1,yc1);
  PaintBox1.Canvas.LineTo(xb,yb);

  xb2:=trunc(xc2+sqrt(sqr(AB)-sqr(yc2-H/2)))-240;     // Y
  yb2:=xc1;
  PaintBox1.Canvas.Rectangle(yb2-5,xb2-15,yb2+5,xb2+15);
  xbs:=xb; ybs:=yb;




  // линия от шатуна к шатуну
  PaintBox1.Canvas.MoveTo(xb,yb);
  PaintBox1.Canvas.LineTo(yb2,xb2);


  t:=t+0.01;
end;

Автор: RockClimber 15.12.2009, 17:30
Вставил твой код на форму. Компилятор выдал сообщение, что не знает, что за переменные: L, H, x1, x2, xc1, xc2, yc1, yc2 - это только то, что я запомнил... Выкладывай весь проект, что ли...

Автор: L0GA4 15.12.2009, 17:47
 Это проект который я переделываю. Для моей задачи

Автор: L0GA4 15.12.2009, 17:48
 А это самая начальная НЕ моя программа

Автор: L0GA4 15.12.2009, 17:51
 Если с первой идеи не появятся, есть 2я которую можно вместо 1й сделать

 Впринцепи она похожа на задачу 1.zip которую я выложил выше, только  здесь надо чтобы шатун двигался не вдоль оси Ох , а под углом. ( в общем все на рисунке

Автор: Демо 15.12.2009, 19:27
L0GA4, 

ничего не понятно с твоим кодом - к какой задаче он относится.
Приложи описание задачи, код, описание проблем.

Добавлено через 14 секунд
PS. А всё лишнее тут нафиг не нужно.

Автор: RockClimber 15.12.2009, 20:55
Цитата(L0GA4 @  15.12.2009,  17:24 Найти цитируемый пост)
а то мозг не работает...

Это ключевая фраза, она многое объясняет.
Потому что перед нами типичная программа моделирования, которая решается с конца. Это, я так понимаю, исходные данные:

Цитата(L0GA4 @  15.12.2009,  17:24 Найти цитируемый пост)
Балка OA1 растягивается, все остальные балки(A1A2, A2B ) жесткие. Нужно сделать так, чтобы при перемещении ползунка A1 , перемещался и ползунок А2. Так, чтобы длина A1A2 не изменялась. При этом при перемещении ползунка A2  катилась окружность B.  (черная точка на окружности показывает что катится)

Я бы сделал так. Сначала выписать уравнения, задающие движение. Точка О закреплена - хорошо, ее координаты известны. Точка А1 двигается - записываем функцию координаты от времени. Теперь ее координаты можно считать известными. Если ее координаты известны и известна длина отрезка А1А2, а также ограничения на движение точки А2 (как я понял, они есть) - то ее координаты легко рассчитываются по найденным ранее значениям. Ну и так далее. Когда все формулы будут записаны (хотя бы на бумажке), задача сама решится. А без них код ковырять можно до второго пришествия.

Автор: L0GA4 15.12.2009, 21:51
 мозг не работает т.к. уже 3е сутки этим занимаюсь.
 естественно на бумаге все решается сначала.

1)есть пара моментов. Да. на рисунке я обозначил что я знаю : координаты точки О ( откуда и строится всё остальное ) жестко прописаны, у точки А1 изменяется только X след. образом:

Код

xc2:=xc1+trunc(AO*cos(-omega*t));


где xc1 - начальная точка
AO - радиус 
-omega задает направление и скорость
t - просто увеличивается на 0.01 - ну чтобы изменять сам угол.

в общем обыкновенная параметризация функции окружности.

зачем так - чтобы ползунок двигался вперед и назад. (расстояния на которое он может передвигаться определяется радиусом)

2)Ограничения нет. у точки А2 я знаю только У(для простоты положим её равной yc1, т.е равной У начальной точки). Мне нужно узнать координаты ИКСА. Длину допустим я знаю, но как через длину узнать координаты?. В делфи ведь линии можно только по координатам строить...

вроде бы и крутиться мысль что  дельтаХ первого ползунка равняеться дельтаУ второго ползунка...т.е. изменение координат будут зависеть от этих изменений(дельта ну или "|старая коордт-новая коордт|" ) но как это в делфи записать?



Демо,  извиняюсь, сейччас попробую подробнее описать эти 2 задачи.

Автор: RockClimber 15.12.2009, 23:38
Теперь мой мозг отключается, потому что поздно и пора спать smile 

Я тут долго и много понаписал, а потом до меня дошло, и я все стер  smile 

Цитата(L0GA4 @  15.12.2009,  21:51 Найти цитируемый пост)
Мне нужно узнать координаты ИКСА. Длину допустим я знаю, но как через длину узнать координаты?. В делфи ведь линии можно только по координатам строить...

Ну как бы теорема Пифагора  smile 
длина - r, не что иное, как:
r^2=(x1-x2)^2+(y1-y2)^2
x1 и y1 - (координаты А1) известны (вычислены ранее), y2 - известно (координата А2), r - известно. Остается одна неизвестная - пишешь для нее формулу, а потом итог округляешь до целого и выводишь на экран.
Я же говорю, сначала выведи формулу, а потом делай вычисления. Delphi в этой задаче вообще непричем...

Автор: L0GA4 17.12.2009, 10:25
 Сделал, спасибо! основная ошибка - система координат, на бумаге рисовал обычную. а на компе-то другая... )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)