![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Всем приветик, подскажите пожалуйста, как задать движение ромба по окружности(canvas). Пол инета облазила, толком ничего не нашла =(
|
#2
|
|||
|
|||
![]() Тут очень интересный вопрос - а как он должен двигаться?
Это вращение или именно движение по окружности? Если это вращение, то тебе надо сделать пересчет координат в зависимости от угла поворота вокруг некоторого центра вращения. Тут собственно именно преобразование координат. Если это именно движение по окружности (фактически, сдвиг), то вспоминаем формулу окружности 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
|
||||
|
||||
![]() Чучуть дополю.При каждом расщитывании координат нужно все заново прорисововать то есть отдельно фон рисовать и отдельно ромб. Помищения ТbitMap на другой ТbitMap : canvas.draw(x,y,TbitMap);
Не твори зла, и жизнь повернется к тебе передом ![]() |
#4
|
|||
|
|||
![]() Нус-с-с домучали со знакомым програмку, теперь следующая проблема, может кто знает, как во время движения сделать масштабирование(уменьшение) с коэффициентом кх=ку=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
|
||||
|
||||
![]() При расчетах нужно просто умножать все велечины на дополнительный множетель (велечина зумированя
![]() PHP код:
Ромб здесь увеличивается но я не смог понять где тут росчитуеться радиус. думаю толчок я дал а дальше сами додумаетесь ![]() Не твори зла, и жизнь повернется к тебе передом ![]() |
#6
|
|||
|
|||
![]() Готово (:, теперь следующая проблема, нужно вращать ромбик во время движения и масштабирования, не подскажете последний раз? =) Код:
Код:
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. |