|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вращение стрелок по законам ускорения и скорости
Как заставить стрелки часов вращаться по законам ускорение и скорости относительно друг друга? Необходимо выделить отдельный класс законов с переменными ускорение, скорость и позиция? Как образом можно это реализовать?
Последний раз редактировалось paraffin, 07.09.2015 в 09:29. |
#2
|
|||
|
|||
Так в чем собственно проблема?
Таймер внутри класса прикрутить? Формулы, вроде, известны: скорость - первая производная, ускорение - вторая. "Завернуть" все в класс? |
#3
|
|||
|
|||
Вопрос в том, что как это реализовать? Как эти стрелки должны рисоваться? По точкам? И как их движение связать с формулой?
|
#4
|
|||
|
|||
Ну, если тебе надо красивые стрелки, то надо извращаться. А если просто линией, то считаешь положение точки на окружности радиуса R в зависимости от угла поворота (который, собственно, тебе и надо изменять) и просто рисуешь линию.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
paraffin (11.09.2015)
|
#5
|
|||
|
|||
Спасибо буду пробовать
|
#6
|
||||
|
||||
А разве стрелки часов не вращаются по закону шестерёнок ака передаточного числа от большой к малой? Можно лишь предположить что под действием СТ минутная стрелка испытывает как рычаг некоторый "провис" после прохождения 10 мин и почти до половины часа, а затем при подъёме создаёт "прогиб" до конца шкалы циферблата. Вот вам примеры, но это просто часики, с "по законам ускорение и скорости относительно друг друга" это надо с задержкой таймера играться
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
paraffin (11.09.2015)
|
#7
|
|||
|
|||
После моих стараний получилась вот такая шляпа.
1) как сделать чтоб стрелка двигалась ещё и с постоянным ускорением? 2) как добавить вторую стрелку, чтобы она двигалась относительно первой по тем же законам скорости и ускорения.(То есть должен создаться эффект что одна стрелка постоянно убегает от первой) Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Spin; type TForm1 = class(TForm) PaintBox1: TPaintBox; Timer1: TTimer; Button1: TButton; SpinEdit1: TSpinEdit; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PaintBox1: TPaintBox; s: integer; //скорость r: integer; //Радиус окружности x0: integer; // Координата х центра окружности y0: integer; // Координата у центра окружности a: integer; // угол вращения implementation {$R *.dfm} //отрисовка линии procedure Line(im:TPaintBox;x,y,x0,y0,c:integer); begin with im.Canvas do begin brush.Color:=c; pen.Color:=c; MoveTo(x0, y0); //начало линии LineTo(x, y); //координаты x,y (докуда рисуется линия) end; end; //создание формы procedure TForm1.FormCreate(Sender: TObject); begin width:=800; height:=600; end; //Запуск таймера procedure TForm1.Button1Click(Sender: TObject); begin s:=SpinEdit1.Value; Timer1.Interval:=round(60000/(s*360)); if Timer1.Enabled then begin Button1.Caption:='Пуск'; Timer1.Enabled:=false; //Выкл таймер end else begin Button1.Caption:='Стоп'; Timer1.Enabled:=true; //Вкл таймер end; x0:=PaintBox1.Left+PaintBox1.Width div 2-4; //координата х центра окружности y0:=PaintBox1.Left+PaintBox1.Height div 2-4; //координата у центра окружности r:=PaintBox1.Width div 2-20; //радиус a:=270; end; //движение стрелки procedure TForm1.Timer1Timer(Sender: TObject); var x: integer; y: integer; begin doublebuffered:=true; //уменьшает мерцание x:=Round(x0+R*cos(a*pi/180)); //параметрическое уравнение для х y:=Round(y0+R*sin(a*pi/180)); //параметрическое уравнение для у Line(PaintBox1,x0,y0,x,y,clBtnFace); a:=a+1; if a=360 then a:=0; x:=Round(x0+R*cos(a*pi/180)); //параметрическое уравнение для х y:=Round(y0+R*sin(a*pi/180)); //параметрическое уравнение для у Line(PaintBox1,x0,y0,x,y,clBlack); end; //Отрисовка квадрата procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Rectangle(8,8,225,225); end; end. Последний раз редактировалось Admin, 11.09.2015 в 19:49. |
#8
|
|||
|
|||
Тебе надо создать еще 2 переменные:
1. "скорость", т.е. на сколько меняется угол поворота. начальное значение, например, 0. Путь будет v. 2. "ускорение", т.е. на сколько меняется "скорость". Пусть будет dv. На каждом шаге ты: 0. Стираешь старую стрелку. 1. Изменяешь скорость: v := v + dv 2. Изменяешь угол поворота: a := (a + v) mod 360 <-- для градусов, в радианы сам переведешь, если надо. 3. отрисовываешь новое положение стрелки. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
paraffin (15.09.2015)
|