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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2009, 10:05   #1
GaLiof
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 52
По умолчанию Движение по эллипсу в delphi7

Здравствуйте.Интересует следующий вопрос: Как заставить картинку(компонент image) вращаться по эллипсу?(эммитация орбиты планеты). И ещё:как сделать, чтоб движение было более плавным? При маленьком значении таймера планета вращается слишком быстро, при большом как-бы кадрами...
Заранее спасибо

Последний раз редактировалось GaLiof; 14.11.2009 в 10:10. Причина: неточности в описании
GaLiof вне форума Ответить с цитированием
Старый 14.11.2009, 11:10   #2
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Чтобы сделать движение более плавным уменш шаг с которым ты перерисовываеш картинку
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 14.11.2009, 11:21   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

x:=x0+cos(angle*pi/180)*r *kx;
y:=y0+sin(angle*pi/180)*r *ky;
Levsha100 вне форума Ответить с цитированием
Старый 14.11.2009, 16:20   #4
GaLiof
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 52
По умолчанию

for levsha100: что есть r и kx в уравнениях?
вот мой код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, jpeg;

type
  Tform1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const centerx=500;
      centery=500;
      rad=600;

var
  form1: Tform1;
  angle:real;

implementation

{$R *.dfm}

procedure Tform1.FormCreate(Sender: TObject);
begin
form1.Color:=clblack;
angle:=0;
end;

procedure Tform1.Timer1Timer(Sender: TObject);
begin
image1.Left:=centerx+Round(rad*cos(angle));
image1.Top:=centery+Round(rad*sin(angle));
angle:=angle+pi/18;   //изменение угла. чем меньше, тем точнее
end;
procedure Tform1.Image1Click(Sender: TObject);
begin
ShowMessage('Земля - наш дом');
end;

end.
что надо изменить?
и по поводу уменьшения шага прорисовки: где его менять?
GaLiof вне форума Ответить с цитированием
Старый 14.11.2009, 18:37   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну у Вас же всё написано!
Цитата:
Код:
angle:=angle+pi/18;   //изменение угла. чем меньше, тем точнее
end;
замените на
Код:
angle:=angle+pi/180;   //изменение угла. чем меньше, тем точнее
end;
А у таймера интервал сделайте, например, 10
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2009, 19:36   #6
GaLiof
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 52
По умолчанию

Я изменил, но почему-то планеты всёравно двигаются по кругу
Ещё вопрос: а возможно ли сделать орбиту планеты видимой? т.е. чтобы например по ходу своего движения, планета рисовала за собой линию...?
И по поводу интервала: а можно ли без потери планости движения заставить фигуры двигаться медленнее? а то при интервале=10 они прям ооочень быстро летят...
GaLiof вне форума Ответить с цитированием
Старый 14.11.2009, 19:38   #7
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Вы математику учили?
r- радиус окружности
kx/ky-[0;1]- коэф. сжатия по осям.
можно еще поиграться с разностью углов в аргументах синуса/косинуса.
Levsha100 вне форума Ответить с цитированием
Старый 14.11.2009, 21:44   #8
GaLiof
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 52
По умолчанию

т.е. r я задаю как константу. а kx и ky как задаются? я прописал:
const
r=100;
x0=600;//как я понимаю, эти константы определяют центр
y0=600;
var
angle:real;
begin
angle:=0;
и затем в таймере вписал:
image1.left:=x0+cos(angle*pi/180)*r *kx;
image1.top:=y0+sin(angle*pi/180)*r *ky;
при интервате 10.
Куда вписываются kx и ky? И вообще, так ли это делается? Просто по формуле круга, я всё сделал довольно быстро...а вот с эллиптической орбитой чёто завис...
GaLiof вне форума Ответить с цитированием
Старый 14.11.2009, 21:52   #9
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Код:
var
  Form2: TForm2;
   angle:real;
implementation

{$R *.dfm}

procedure TForm2.Timer1Timer(Sender: TObject);
var
x,y:integer;
begin
   angle:=angle+1;
   if angle>360 then  angle:=angle-360;
   {x:=Round(200+cos(angle*Pi/180)*150);
   y:=Round(200+sin(angle*Pi/180)*35);}
   x:=Round(200+cos(angle*Pi/180)*150);
   y:=Round(200+cos((angle+120)*Pi/180)*150);
   {Image1.Canvas.FillRect(Rect(0,0,400,400));}
   Image1.Canvas.Ellipse(x+10,y+10,x-10,y-10);
end;
Levsha100 вне форума Ответить с цитированием
Старый 15.11.2009, 00:13   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

GaLiof
так пойдёт?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   // вычисляем координаты следа...
   x:=Round(200+cos((angle-12)*Pi/180)*150);
   y:=Round(200+cos((angle-12+120)*Pi/180)*150);
   Form1.Canvas.Ellipse(x+1,y+1,x-1,y-1);

   angle:=angle+1;
   if angle>360 then  angle:=angle-360;
   x:=Round(200+cos(angle*Pi/180)*150);
   y:=Round(200+cos((angle+120)*Pi/180)*150);
   {Image1.Canvas.FillRect(Rect(0,0,400,400)100
   Image1.Canvas.Ellipse(x+10,y+10,x-10,y-10);}
   Image1.Left := x-(Image1.Width div 2);
   Image1.Top := y-(Image1.Height div 2);
end;
p.s. а скоростью можно рулить через интервал таймера. поставьте 200 или 300 - будет медленно, поставьте 10 - будет быстро...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение dampirik Общие вопросы C/C++ 15 10.10.2009 18:47
движение alex(21) Паскаль, Turbo Pascal, PascalABC.NET 9 20.08.2009 00:08
коэффициент уравнения, описывающий касательную к эллипсу CrossDeLena Помощь студентам 2 26.09.2008 20:31
движение по эллипсу Оля Помощь студентам 2 08.05.2007 00:50
Движение Mickle Общие вопросы Delphi 5 19.04.2007 23:24