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

Delphi Sources



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

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

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Timer1: TTimer;
    procedure BitBtn1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
procedure procABC(x1,x2,x3,y1,y2,y3:integer;var a,b,c:Real);
    { Public declarations }
  end;

var
  Form1: TForm1;
  a,b,c:Real;
x,y,r,x1,x2,x3,y1,y2,y3,i,Ypar:Integer;


implementation

{$R *.dfm}

procedure Tform1.procABC(x1,x2,x3,y1,y2,y3:integer;var a,b,c:Real);
begin
 a:=( y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1) )/(x3*(x3-x1-x2)+x1*x2 );
label7.caption:='a = '+floattostr((a));
  b:=(y2-y1)/(x2-x1)-a*(x1+x2);
label8.caption:='b = '+floattostr((b));
 c:=(x2*y1-x1*y2)/(x2-x1)+a*x1*x2;
label9.caption:='c = '+floattostr((c));
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
randomize;
r:=random(50)+1;
x1:=image1.left+32;
y1:=image1.Top+r;
x2:=image2.left+32;
y2:=image2.Top+r;
x3:=image3.left+32;
y3:=image3.Top;


label1.Caption:='Left x1:= '+inttostr(x1);
label2.Caption:='Top y1:= '+inttostr(y1);
label3.Caption:='Left x2:= '+inttostr(x2);
label4.Caption:='Top y2:= '+inttostr(y2);
label5.Caption:='Left x3:= '+inttostr(x3);
label6.Caption:='Top y3:= '+inttostr(y3);


procABC(x1,x2,x3,y1,y2,y3,a,b,c);
for i:=x3 to x1 do Canvas.Pixels[i,Round(a*i*i+b*i+c)]:=clRed;
Timer1.Enabled:=True;
x:=x3;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var y:Integer;
begin
   DoubleBuffered := True;


 if x>x1 then Exit;
 Canvas.Brush.Color:=Color;
 //Canvas.FillRect(Canvas.ClipRect);
 y:=Round(a*x*x+b*x+c);
 Canvas.Ellipse(x,y,x+5,y+5);
 x:=x+10;

end;

end.
Админ: Используем теги по назначению!

Нужно изменить место полета эллипса . Тоесть эллипс начинает своё движение с левой точки в правую , нужно сделать наоборот , чтобы справа налево он двигался
Ответить с цитированием
  #2  
Старый 15.09.2014, 01:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В таймере измени приращение X на уменьшение и в процедуре нажатия кнопки, измени начальные координаты.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 15.09.2014, 22:37
Nelo Nelo вне форума
Прохожий
 
Регистрация: 14.09.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да вы правы
Кнопа1
Цитата:
procABC(x1,x2,x3,y1,y2,y3,a,b,c);
for i:=x1 downto x2 do Canvas.Pixels[i,Round(a*i*i+b*i+c)]:=clRed;
Timer1.Enabled:=True;
x:=x1;
Возможно теперь парабола нарисовалась с права налево (если верить теории );
Таймер1
Цитата:
procedure TForm1.Timer1Timer(Sender: TObject);
var y:Integer;
begin
if x<x2 then Exit;
y:=Round(a*x*x+b*x+c);
Canvas.Brush.Color:=Color;
Canvas.Ellipse(x,y,x+5,y+5);
//Canvas.FillRect(Canvas.ClipRect); - это пока , что болванка , потом все будет норм.
;

x:=x+10;
По логике таймера , уменьшать до тех пор ( двигаться до тех пор ) пока х1 (680) не станут меньше х2(60).
-----------
Эллипс отправился в ад
Ответить с цитированием
  #4  
Старый 15.09.2014, 23:35
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Достаточно изменить в процедуре BitBtn1Click последнюю строку с x := x3; на x := x1; и в процедуре таймера x := x + 10; на x := x - 10;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 16.09.2014, 10:48
Nelo Nelo вне форума
Прохожий
 
Регистрация: 14.09.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Достаточно изменить в процедуре BitBtn1Click последнюю строку с x := x3; на x := x1; и в процедуре таймера x := x + 10; на x := x - 10;
ЁЛы !!!! Человек ты волшебник !!! я думал ошибка в уравнении параболы а это Огромное спасибо !!!!!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter