Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ **** UBPFD *********** by delphibase.endimus.com **** >> "Сквозь Вселенную" с дополнительными возможностями Демонстрационный пример, динамически рисующий "движение среди звёзд" с вращением. Зависимости: Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs Автор: Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург Copyright: Dimka Maslov Дата: 1 августа 2003 г. ***************************************************** } unitStarfields; interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type
TForm1 = class
(TForm) procedure
FormCreate(Sender: TObject); procedure
FormPaint(Sender: TObject); procedure
FormResize(Sender: TObject); private
procedure
AB00(var
Message
); message
$AB00; public
{ Public declarations } end
; var
Form1: TForm1; implementation
{$R *.DFM} type
TPoint = packed
record
X, Y, Z, R, Phi: Double; end
; const
NumStars = 2000; // Количество звёзд, // управляет общей плотностью звёздного поля RangeY = 7000; // Максимальное расстояние от картинной плоскости до звезды, // управляет плотностью звёзд в центре RangeR = 7000; // Максимальное радиальное удаление от луча зрения до звезды, // управляет плотностью звёзд по краям Height = 5000; // Высота наблюдателя, // управляет положением центра изображения по вертикали Basis = 100; // Расстояние до картинной плоскости // управляет соотношением количества звёзд в центре к их // количеству по краям DeltaY = 5; // Шаг изменения координаты, управляет скоростью движения DeltaT = 0.01; // Приращение времени, управляет скоростью вращения Period1 = 0.1; // Период вращения звёзд Amplitude2 = 0.5; // Амплитуда вращательных колебаний звёзд Period2 = 1.0; // Период вращательных колебаний Period3 = 0.1; // Период изменения направления движения звёзд. Direction = 1; // Направление движения 1 - к наблюдателю, -1 - от него var
Stars: array
[1..NumStars] of
TPoint; Time: Double = 0; X0: Integer = 0; Y0: Integer = 0; procedure
InitializeStars; var
i: Integer; begin
Randomize; for
i := 1 to
NumStars do
with
Stars[i] do
begin
Y := Random(RangeY); R := RangeR - 2 * Random(RangeR); Phi := Random(628) / 100; end
; end
; procedure
Perspective(const
X, Y, Z, Height, Basis: Double; var
XP, YP: Double); var
Den: Double; begin
Den := Y + Basis; if
Abs(Den) < 1E-100 then
Den := 1E-100; XP := Basis * X / Den; YP := (Basis * Z + Height * Y) / Den; end
; function
KeyPressed(VKey: Integer): LongBool; asm
push eax call GetKeyState and
eax, 0080h shr
al, 7 end
; procedure
TForm1.AB00(var
Message
); begin
if
KeyPressed(VK_ESCAPE) then
Close else
Repaint; end
; procedure
TForm1.FormCreate(Sender: TObject); begin
InitializeStars; DoubleBuffered := True; end
; procedure
TForm1.FormPaint(Sender: TObject); var
X, Y: Double; L, T: Integer; i: Integer; D: Double; begin
for
i := 1 to
NumStars do
begin
Application.ProcessMessages; with
Stars[i] do
begin
D := Direction * sin(Period3 * Time); Y := Y - D * DeltaY; X := R * sin((Period1 * Time + Phi) + Amplitude2 * cos(Period2 * time)); Z := R * cos((Period1 * Time + Phi) + Amplitude2 * cos(Period2 * time)); if
D > 0 then
begin
if
Y < 0 then
begin
Y := RangeY; R := RangeR - 2 * Random(RangeR); // Phi := Random(628) / 100; end
; end
else
begin
if
Y > RangeY then
begin
Y := 0; R := RangeR - 2 * Random(RangeR); // Phi := Random(628) / 100; end
; end
; end
; Perspective(Stars[i].X, Stars[i].Y, Stars[i].Z, Height, Basis, X, Y); L := X0 + Round(X); T := Y0 - Round(Y); Canvas.Pen.Color := clWhite; if
Stars[i].Y < RangeY / 4 then
begin
Canvas.Rectangle(L, T, L + 2, T + 2); end
else
begin
Canvas.MoveTo(L, T); Canvas.LineTo(L + 1, T + 1); end
; end
; PostMessage(Handle, $AB00, 0, 0); Time := Time + DeltaT; end
; procedure
TForm1.FormResize(Sender: TObject); begin
X0 := ClientWidth div
2; Y0 := ClientHeight * 3 div
2; end
; end
.