Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.28;
Скачать: CL | DM;

Вниз

Запуталась с integer, real, extented и т.д. =(   Найти похожие ветки 

 
Pup ©   (2009-12-24 16:06) [0]

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

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 через синус, то в другом =/
Что же делать?!?!


 
Джо ©   (2009-12-24 16:09) [1]

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


 
Джо ©   (2009-12-24 16:10) [2]

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


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

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:22) [4]


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


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


 
Pup ©   (2009-12-24 16:32) [5]

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


 
Ega23 ©   (2009-12-24 16:38) [6]

Round, Trunc + F1


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


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


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


 
KilkennyCat ©   (2009-12-24 18:58) [8]


> 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 21:33) [9]

> [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;


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


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

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


 
Джо ©   (2009-12-24 21:36) [11]


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

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


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

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

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


 
Ega23 ©   (2009-12-25 08:43) [13]


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


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


 
Pup ©   (2009-12-25 19:12) [14]

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


 
Anatoly Podgoretsky ©   (2009-12-25 19:25) [15]

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


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

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

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


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

И таймеру..


 
Pup ©   (2009-12-27 15:01) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2010.02.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
13-1124537487
jenbond
2005-08-20 15:31
2010.02.28
Передача параметра из UserControl


2-1261650025
Делфиец
2009-12-24 13:20
2010.02.28
Как обработат исключение при вводе в DBGride


13-1124785264
Cherrex
2005-08-23 12:21
2010.02.28
CrystalReportViewer и VCL.NET


15-1260989873
Kuper7777
2009-12-16 21:57
2010.02.28
Работа с dll-библиотеками


2-1261744929
Андрей Пл
2009-12-25 15:42
2010.02.28
Вопрос по потокам, максимально грузит процессор!