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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2010, 18:34
kukushonka kukushonka вне форума
Прохожий
 
Регистрация: 26.05.2010
Сообщения: 3
Репутация: 10
По умолчанию Движение по окружности

Всем приветик, подскажите пожалуйста, как задать движение ромба по окружности(canvas). Пол инета облазила, толком ничего не нашла =(
Ответить с цитированием
  #2  
Старый 26.05.2010, 20:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут очень интересный вопрос - а как он должен двигаться?
Это вращение или именно движение по окружности?

Если это вращение, то тебе надо сделать пересчет координат в зависимости от угла поворота вокруг некоторого центра вращения. Тут собственно именно преобразование координат.

Если это именно движение по окружности (фактически, сдвиг), то вспоминаем формулу окружности x^2 + y^2 = R^2, где x и y - точки отностительно центра. Если центр окружности находится в точке x0, y0, то формула принимает вид:

(x - x0)^2 + (y - y0)^2 = R^2.

соответсвенно, преобразовав эту формлу в вид y = F(x), ты получишь возможность считать смещение координат.

Теперь о технической части.

Тебе нужна процедура, которая принимает некоторую базовую точку (ее координаты) и рисует относительно ее ромб. Далее, во внешней части программы тебе нужен цикл по х от х0-R до x0+R, где R - расстояние от x0,y0 (центр окружности) до базовой точки ромба. Внутри цикла считаем координату y и далее с полученными значениями x и y вызываем отрисовку ромба. Рисовать лучще всего на TPaintBox.
Ответить с цитированием
  #3  
Старый 26.05.2010, 22:43
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Чучуть дополю.При каждом расщитывании координат нужно все заново прорисововать то есть отдельно фон рисовать и отдельно ромб. Помищения ТbitMap на другой ТbitMap : canvas.draw(x,y,TbitMap);
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #4  
Старый 30.05.2010, 19:31
kukushonka kukushonka вне форума
Прохожий
 
Регистрация: 26.05.2010
Сообщения: 3
Репутация: 10
По умолчанию

Нус-с-с домучали со знакомым програмку, теперь следующая проблема, может кто знает, как во время движения сделать масштабирование(уменьшение) с коэффициентом кх=ку=1

вот код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var xc,yc,x1,x2,x3,y1,y2,y3,x4,y4,f,xc1,yc1:real;     i,fi,dfi:integer;
const r=200;   

procedure risunok;
begin
form1.canvas.moveto(100,260);
form1.canvas.lineto(60,300);
form1.canvas.lineto(100,340);
form1.canvas.lineto(140,300);
form1.canvas.lineto(100,260);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.canvas.rectangle(0,0,clientwidth,clientheight-100);
risunok;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
    timer1.enabled:=true;
    xc1:=350;   fi:=0;   dfi:= 1;
    yc1:=200;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  form1.Canvas.Rectangle(0,0,clientwidth,clientheight-100);
  fi:=fi+dfi;
  xc:=xc1+round(50*cos(fi*pi/180));
  yc:=yc1-round(50*sin(fi*pi/180));
  x1:=xc;
  x2:=xc-40;
  x3:=xc;
  x4:=xc+40;
  y1:=yc-40;
  y2:=yc;
  y3:=yc+40;
  y4:=yc;
  form1.canvas.moveto(round(x1),round(y1));
  form1.canvas.lineto(round(x2),round(y2));
  form1.canvas.lineto(round(x3),round(y3));
  form1.canvas.lineto(round(x4),round(y4));
  form1.canvas.lineto(round(x1),round(y1));   
end;
 


end.
Ответить с цитированием
  #5  
Старый 31.05.2010, 08:11
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

При расчетах нужно просто умножать все велечины на дополнительный множетель (велечина зумированя ) вот код увиличения ромба в 2 раза:
PHP код:
procedure TForm1.Timer1Timer(SenderTObject);
const
z=2;
begin
  form1
.Canvas.Rectangle(0,0,clientwidth,clientheight-100);
  
fi:=fi+dfi;
  
xc:=xc1+round(50*cos(fi*pi/180));
  
yc:=yc1-round(50*sin(fi*pi/180));
  
x1:=(xc)*z;
  
x2:=(xc-40)*z;
  
x3:=xc*z;
  
x4:=(xc+40)*z;
  
y1:=(yc-40)*z;
  
y2:=yc*z;
  
y3:=(yc+40)*z;
  
y4:=yc*z;
  
form1.canvas.moveto(round(x1),round(y1));
  
form1.canvas.lineto(round(x2),round(y2));
  
form1.canvas.lineto(round(x3),round(y3));
  
form1.canvas.lineto(round(x4),round(y4));
  
form1.canvas.lineto(round(x1),round(y1));
end

Ромб здесь увеличивается но я не смог понять где тут росчитуеться радиус. думаю толчок я дал а дальше сами додумаетесь
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #6  
Старый 31.05.2010, 19:10
kukushonka kukushonka вне форума
Прохожий
 
Регистрация: 26.05.2010
Сообщения: 3
Репутация: 10
По умолчанию

Готово (:, теперь следующая проблема, нужно вращать ромбик во время движения и масштабирования, не подскажете последний раз? =) Код:

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var xc,yc,x1,x2,x3,y1,y2,y3,x4,y4,f,xc1,yc1,kx,ky,z:real;
  i,fi,dfi:integer;
const r=200;

procedure risunok;
begin
form1.canvas.moveto(100,260);
form1.canvas.lineto(60,300);
form1.canvas.lineto(100,340);
form1.canvas.lineto(140,300);
form1.canvas.lineto(100,260);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.canvas.rectangle(0,0,clientwidth,clientheight-100);
risunok;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
    timer1.enabled:=true;
    xc1:=350;   fi:=0;   dfi:= 5;
    yc1:=200;  kx:=1; ky:=1;   z:=1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  form1.Canvas.Rectangle(0,0,clientwidth,clientheight-100);
  z:=z-0.01;
  fi:=fi+dfi;
  xc:=xc1+round(50*cos(fi*pi/180));
  yc:=yc1-round(50*sin(fi*pi/180));
  x1:=xc;
  x2:=xc-40;
  x3:=xc;
  x4:=xc+40;
  y1:=yc-40;
  y2:=yc;
  y3:=yc+40;
  y4:=yc;
 { X1:=xc+round((X1-XC)*cos(fi)+(Y1-YC)*sin(fi));
  y1:=yc+round((Y1-YC)*cos(fi)-(X1-XC)*sin(fi));
  X2:=xc+round((X2-XC)*cos(fi)+(Y2-yc)*sin(fi));
  Y2:=yc+round((Y2-YC)*cos(fi)-(X2-XC)*sin(fi));
  X3:=xc+round((X3-XC)*cos(fi)+(Y3-YC)*sin(fi));
  Y3:=yc+round((Y3-YC)*cos(fi)-(X3-XC)*sin(fi));
  X4:=xc+round((X4-XC)*cos(fi)+(Y4-YC)*sin(fi));
  Y4:=yc+round((Y4-yC)*cos(fi)-(X4-XC)*sin(fi));}
  x1:=xc+Round(x1-xc)*z;
  y1:=yc+Round(y1-yc)*z;
  x2:=xc+Round(x2-xc)*z;
  y2:=yc+Round(y2-yc)*z;
  x3:=xc+Round(x3-xc)*z;
  y3:=yc+Round(y3-yc)*z;
  x4:=xc+Round(x4-xc)*z;
  y4:=yc+Round(y4-yc)*z;
  form1.canvas.moveto(round(x1),round(y1));
  form1.canvas.lineto(round(x2),round(y2));
  form1.canvas.lineto(round(x3),round(y3));
  form1.canvas.lineto(round(x4),round(y4));
  form1.canvas.lineto(round(x1),round(y1));
end;



end.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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