Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуталась с integer, real, extented и т.д. =( [D7, XP]


Pup ©   (2009-12-24 16:06:00) 

Здравствуйте! В общем написовала треугольник полилайном с изменяемыми вершинами, вершины задала так, чтобы двигались по синусоиде, таким образом пытаюсь заставить весь треугольник лвигаться

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   T1: TTimer;
   S: TShape;
   Button1: TButton;
   procedure T1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
  X, U_Y, X_0, U_X, T, Y_0, Y_01 : Real;
 n, n1, n2, m , Y, Y1, Y2: Integer;


implementation

{$R *.dfm}

procedure TForm1.T1Timer(Sender: TObject);
begin

T := T + 0.001;  
y := Y_0 + U_Y * SIN(180* T/3.1415926 );
y1 := Y_01 + U_Y * SIN(180* T/3.1415926 );
y2:=  Y_01 + U_Y * SIN(180* T/3.1415926 );
n := n + 2;
n1 := n1+2;
n2 := n2+2;
canvas.Polyline([point(n,y), point(n1,y1),point(n2,y2)]);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
T1.Enabled := True;  
Y_0 := 200;
Y_01 := 300;      
U_Y := 100;          
T := 0;            
n := 10;
n1 :=5;
n2 :=15;          
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered := True;
end;

End.

но ничего не работает, так как в полилайне надо чтобы Y было в одном формате, а когда задаеш Y через синус, то в другом =/
Что же делать?!?!


Pup   (2009-12-27 15:01:00) [1]

Ооооо! все поняла) вот я чайник)
Спасибо ОГРОМНОЕ!
Буду как следует разбираться, если что обращусь к Вам =*


Омлет   (2009-12-26 23:06:00) [2]

И таймеру..


Омлет   (2009-12-26 23:02:00) [3]

> Pup ©   (25.12.09 19:12) [14]

Так надо же обработчики событий назничить кнопке (OnClick) и форме (OnCreate).


Anatoly Podgoretsky   (2009-12-25 19:25:00) [4]

Pup ©   (24.12.09 16:32) [5]
Integer в real преобразовывается автоматически, наоборот нет.


Pup   (2009-12-25 19:12:00) [5]

Омлет, спасибо за такое подробное описание!
Но у меня почему-то ваш код тоже не работает. Ну в плане программа запускается, но там кроме кнопки ничего нет, жми не жми не помагает =\


Ega23   (2009-12-25 08:43:00) [6]


> Я про то, что не стоит вводить в заблуждение человека нерабочим
> кодом.
>


Не говорите другим людям что делать, и другие люди не скажут Вам куда пойти.


Омлет   (2009-12-24 21:59:00) [7]

> Про приведение типов давным-давно отвечено.

Я про то, что не стоит вводить в заблуждение человека нерабочим кодом.


Омлет   (2009-12-24 21:36:00) [8]

Функцию Pi можно не заменять на 3.1415926, это никакого эффекта не даст, т.к. Pi вычисляется еще на этапе компиляции.


Джо   (2009-12-24 21:36:00) [9]


> Омлет ©   (24.12.09 21:33) [9]
> > [3] Ega23 ©> [8] KilkennyCat ©Вас спрашивали про приведение
> типов, а не про ускорение.

Про приведение типов давным-давно отвечено.
А вас спрашивали не о рабочем примере ;->


Омлет   (2009-12-24 21:33:00) [10]

> [3] Ega23 ©
> [8] KilkennyCat ©

Вас спрашивали про приведение типов, а не про ускорение.

Вот рабочий пример:

 TTriang = array [0..2] of TPoint;

 TForm1 = class(TForm)
   T1: TTimer;
   Button1: TButton;
   procedure T1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   fTriangle, fOldTriang: TTriang;
   fPosition: Integer;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.T1Timer(Sender: TObject);
const
 AMPLITUDA = 70;
 DLINA     = 1/2000;
var
 yOffset   : Integer;
 NewTriang : TTriang;
begin
 // Увеличиваем смещение по оси X
 fPosition := fPosition + 3;
 if fPosition > ClientWidth + 50 then
   fPosition := -150;

 // Считаем смещение по оси Y, на основе Sin(X)
 // Функция Round округляет значение числа с плавающей точкой до целого, которое можно прибавлять к другому целому.
 yOffset := Round( Sin((180 / Pi) * fPosition * DLINA) * AMPLITUDA );

 // Прибавляем смещение по X и Y к начальным координатам - получаем новые координаты
 NewTriang[0] := Point(fTriangle[0].X + fPosition, fTriangle[0].Y + yOffset);
 NewTriang[1] := Point(fTriangle[1].X + fPosition, fTriangle[1].Y + yOffset);
 NewTriang[2] := Point(fTriangle[2].X + fPosition, fTriangle[2].Y + yOffset);

 // Стираем старый треугольник
 Canvas.Polygon(fOldTriang);

 // Рисуем новый
 Canvas.Polygon(NewTriang);

 // Запоминаем новый как старый
 fOldTriang := NewTriang;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Repaint;
 // Начальные координаты треугольника
 fTriangle[0] := Point(50,  Height div 2 - 50);
 fTriangle[1] := Point(-50, Height div 2 + 50);
 fTriangle[2] := Point(150, Height div 2 + 50);
 fOldTriang := fTriangle;
 fPosition := 0;
 // Режим стирания при повторном рисовании
 Canvas.Pen.Mode := pmXor;
 // Изначальный треугольник, который будет стерт
 Canvas.Polygon(fOldTriang);
 T1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Width := 400;
 T1.Interval := 50;
 T1.Enabled := False;
end;


Спрашивай, что не понятно.


KilkennyCat   (2009-12-24 18:58:00) [11]


> Ega23 ©   (24.12.09 16:17) [3]

> Не оптимально


procedure TForm1.T1Timer(Sender: TObject);
var
 aSin : Extended;
begin
T := T + 0.001;  
aSin := U_Y * SIN(180* T/3.1415926 );
y1 := Y_01 + aSin;
n := n + 2;
n1 := n1+2;
n2 := n2+2;
canvas.Polyline([point(n,Y_0 + aSin), point(n1,y1),point(n2,y1)]);
end;


Игорь Шевченко   (2009-12-24 17:31:00) [12]


> один и тот же Y нужен в двух местах в разных форматах


два места - два Y


Ega23   (2009-12-24 16:38:00) [13]

Round, Trunc + F1


Pup   (2009-12-24 16:32:00) [14]

один и тот же Y нужен в двух местах в разных форматах, там где задается он через синус, нужен либо real, либо extended, а там где полилайн через него задается, нужен integer. Надо может нарисовать треугольник по другому? Нету какой-нибуть стандартной команды для этого? Можно же задать окружность через round..


Игорь Шевченко   (2009-12-24 16:22:00) [15]


> Что же делать?!?!


задавать в одном формате. вроде очевидно


Ega23   (2009-12-24 16:17:00) [16]

procedure TForm1.T1Timer(Sender: TObject);
begin

T := T + 0.001;  
y := Y_0 + U_Y * SIN(180* T/3.1415926 );
y1 := Y_01 + U_Y * SIN(180* T/3.1415926 );
y2:=  Y_01 + U_Y * SIN(180* T/3.1415926 );
n := n + 2;
n1 := n1+2;
n2 := n2+2;
canvas.Polyline([point(n,y), point(n1,y1),point(n2,y2)]);

end;


Не оптимально

procedure TForm1.T1Timer(Sender: TObject);
var
 aSin : Extended;
begin

T := T + 0.001;  
aSin := SIN(180* T/3.1415926 );
y := Y_0 + U_Y * aSin;
y1 := Y_01 + U_Y * aSin;
y2:=  Y_01 + U_Y * aSin;
n := n + 2;
n1 := n1+2;
n2 := n2+2;
canvas.Polyline([point(n,y), point(n1,y1),point(n2,y2)]);

end;


Джо   (2009-12-24 16:10:00) [17]

Последнее замечание о радианах снимаю, невнимателен :)


Джо   (2009-12-24 16:09:00) [18]

y := Round (...).
Кстати, sin ожидает, что аргумент будет в радианах, а не в градусах.


Наверх

Титульная страница Поиск, карта сайта Написать письмо