Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2015, 09:21
paraffin paraffin вне форума
Прохожий
 
Регистрация: 07.09.2015
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Вращение стрелок по законам ускорения и скорости

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

Последний раз редактировалось paraffin, 07.09.2015 в 09:29.
Ответить с цитированием
  #2  
Старый 07.09.2015, 22:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Так в чем собственно проблема?
Таймер внутри класса прикрутить?
Формулы, вроде, известны: скорость - первая производная, ускорение - вторая.
"Завернуть" все в класс?
Ответить с цитированием
  #3  
Старый 07.09.2015, 23:00
paraffin paraffin вне форума
Прохожий
 
Регистрация: 07.09.2015
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вопрос в том, что как это реализовать? Как эти стрелки должны рисоваться? По точкам? И как их движение связать с формулой?
Ответить с цитированием
  #4  
Старый 08.09.2015, 04:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, если тебе надо красивые стрелки, то надо извращаться. А если просто линией, то считаешь положение точки на окружности радиуса R в зависимости от угла поворота (который, собственно, тебе и надо изменять) и просто рисуешь линию.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
paraffin (11.09.2015)
  #5  
Старый 08.09.2015, 06:55
paraffin paraffin вне форума
Прохожий
 
Регистрация: 07.09.2015
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо буду пробовать
Ответить с цитированием
  #6  
Старый 08.09.2015, 16:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А разве стрелки часов не вращаются по закону шестерёнок ака передаточного числа от большой к малой? Можно лишь предположить что под действием СТ минутная стрелка испытывает как рычаг некоторый "провис" после прохождения 10 мин и почти до половины часа, а затем при подъёме создаёт "прогиб" до конца шкалы циферблата. Вот вам примеры, но это просто часики, с "по законам ускорение и скорости относительно друг друга" это надо с задержкой таймера играться
Вложения
Тип файла: zip component-tclock.zip (11.8 Кбайт, 6 просмотров)
Тип файла: zip clock_using_opengl.zip (210.3 Кбайт, 10 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
paraffin (11.09.2015)
  #7  
Старый 11.09.2015, 10:55
paraffin paraffin вне форума
Прохожий
 
Регистрация: 07.09.2015
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

После моих стараний получилась вот такая шляпа.
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.
Админ: пользуемся тегами! При рецедиве последуют санкции!
Вложения
Тип файла: rar 1.rar (174.5 Кбайт, 5 просмотров)

Последний раз редактировалось Admin, 11.09.2015 в 19:49.
Ответить с цитированием
  #8  
Старый 14.09.2015, 19:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тебе надо создать еще 2 переменные:
1. "скорость", т.е. на сколько меняется угол поворота. начальное значение, например, 0. Путь будет v.
2. "ускорение", т.е. на сколько меняется "скорость". Пусть будет dv.
На каждом шаге ты:
0. Стираешь старую стрелку.
1. Изменяешь скорость: v := v + dv
2. Изменяешь угол поворота: a := (a + v) mod 360 <-- для градусов, в радианы сам переведешь, если надо.
3. отрисовываешь новое положение стрелки.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
paraffin (15.09.2015)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter