Форум: "Начинающим";
Текущий архив: 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