![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||