Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Вниз

Запуталась с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.004 c
15-1260999021
Юрий
2009-12-17 00:30
2010.02.28
С днем рождения ! 17 декабря 2009 четверг


1-1238665266
salexn
2009-04-02 13:41
2010.02.28
Проблема с динамической загрузкой пакета


2-1261660012
Pup
2009-12-24 16:06
2010.02.28
Запуталась с integer, real, extented и т.д. =(


13-1124615958
Darklight
2005-08-21 13:19
2010.02.28
Экземпляр класса ещё не создан как проверить его на null referenc


2-1261750036
Андрей Пл
2009-12-25 17:07
2010.02.28
как программно прервать процесс до наступления опред. события?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский