![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
status |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: andrey Репутация: ![]() ![]() ![]() |
Помогитепожалусия с ришением данной задачи:
В PaintBox из случайно выбранных точек под случайно выбранными углами вылетают 2 точки, соединенные прямой линией. При ударе о край PaintBox точки ведут себя в соответствии с обычными физическими законами (угол падения равен углу отражения). |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Найди в поиске программу "Бильярд" или программу "CrazyBox" (по-моему, так она называлась, я уже точно не помню) - это программы под TP, перенести в Дельфи будет несложно ...
|
status |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: andrey Репутация: ![]() ![]() ![]() |
Игру "Бильярд" я нашел но к сожелению лично я ничего не смог переделать для решения моей задачи!
![]() |
Sergy |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Всё более чем просто.
1. Делаем пустое приложение с формой. 2. Помещаем на форму TPaintBox, TTimer и TButton 3. В свойствах таймера ставим enabled=false и interval=20 вот код Код unit Unit1; interface uses Windows, SysUtils, Graphics, Forms, Classes, StdCtrls, ExtCtrls, Controls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Timer1: TTimer; Button1: TButton; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private p1, p2: TPoint; a1, a2: real; v: real; public procedure MovePoint(var APoint: TPoint; var AAngle: real; AFrame: TRect); procedure Draw; end; var Form1: TForm1; implementation uses Types; //uses math; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin PaintBox1.Canvas.Brush.Color := clWhite; // Устанавливаем цвет фона PaintBox1.Canvas.Pen.Color := clBlack; // Цвет пера PaintBox1.Canvas.Pen.Mode := pmNot; // Режим рисования при котором дважды нарисованное стирается PaintBox1.Canvas.FillRect(PaintBox1.ClientRect); // Закрашиваем пэинтбокс целиком Randomize; // Сбрасываем рандомайзер p1.X := random(PaintBox1.ClientWidth); // Выбираем случайные координаты p1.Y := random(PaintBox1.ClientHeight); p2.X := random(PaintBox1.ClientWidth); p2.Y := random(PaintBox1.ClientHeight); a1 := random * 2 * Pi; // и случайные углы a2 := random * 2 * pi; v := 3; // и какую-нибудь скорость Timer1.Enabled := true; // запускаем таймер Draw; // рисуем в первый раз end; procedure TForm1.Draw; // рисование двух окружностей и линии begin PaintBox1.Canvas.Ellipse(p1.X - 2, p1.y - 2, p1.X + 2, p1.y + 2); PaintBox1.Canvas.Ellipse(p2.X - 2, p2.y - 2, p2.X + 2, p2.y + 2); PaintBox1.Canvas.MoveTo(p1.X, p1.Y); PaintBox1.Canvas.LineTo(p2.X, p2.Y); end; procedure TForm1.MovePoint(var APoint: TPoint; var AAngle: real; AFrame: TRect); // Вычисление новой позиции точки и нового её направления движения begin APoint.X := round(APoint.X + v * cos(AAngle)); APoint.Y := round(APoint.Y + v * sin(AAngle)); // Проверка,е сли точка вышла за пределы прямоугольника, то поворачиваем её направление if APoint.Y < AFrame.Top then begin AAngle := - AAngle; APoint.Y := AFrame.Top; end; if APoint.Y > AFrame.Bottom then begin AAngle := - AAngle; APoint.Y := AFrame.Bottom; end; if APoint.X < AFrame.Left then begin AAngle := pi - AAngle; APoint.X := AFrame.Left; end; if APoint.X > AFrame.Right then begin AAngle := pi - AAngle; APoint.X := AFrame.Right; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Draw; // Стираем прежнее опложение точек и прямой MovePoint(p1, a1, PaintBox1.ClientRect); // двигаем точки MovePoint(p2, a2, PaintBox1.ClientRect); Draw; // рисуем в новом положении end; end. |
status |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: andrey Репутация: ![]() ![]() ![]() |
так получаются просто 2 точки соединённые прямой..
![]() |
![]() ![]() |
![]() |
Текстовая версия | 10.07.2025 14:10 |