Помощь - Поиск - Пользователи - Календарь
Полная версия: Графика Delphi
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
status
Помогитепожалусия с ришением данной задачи:

В PaintBox из случайно выбранных точек под случайно выбранными углами вылетают 2 точки, соединенные прямой линией. При ударе о край PaintBox точки ведут себя в соответствии с обычными физическими законами (угол падения равен углу отражения).
volvo
Найди в поиске программу "Бильярд" или программу "CrazyBox" (по-моему, так она называлась, я уже точно не помню) - это программы под TP, перенести в Дельфи будет несложно ...
status
Игру "Бильярд" я нашел но к сожелению лично я ничего не смог переделать для решения моей задачи! unsure.gif
Sergy
Всё более чем просто.
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
так получаются просто 2 точки соединённые прямой.. unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.