Главная страница
    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.005 c
2-1261893127
Lyonux
2009-12-27 08:52
2010.02.28
Создание процедуры "копирование"


15-1261161523
Washington
2009-12-18 21:38
2010.02.28
Алгоритмы работы с видео


15-1261043501
wHammer
2009-12-17 12:51
2010.02.28
Не заходил на данный форум уже лет 7, а может и больше :)


4-1229369994
DenisArd
2008-12-15 22:39
2010.02.28
Загрузка иконок


1-1238629573
Opilki_Inside
2009-04-02 03:46
2010.02.28
Непонятное поведение accelerator character





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский