IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Графика Delphi
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: andrey

Репутация: -  0  +


Помогитепожалусия с ришением данной задачи:

В PaintBox из случайно выбранных точек под случайно выбранными углами вылетают 2 точки, соединенные прямой линией. При ударе о край PaintBox точки ведут себя в соответствии с обычными физическими законами (угол падения равен углу отражения).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Найди в поиске программу "Бильярд" или программу "CrazyBox" (по-моему, так она называлась, я уже точно не помню) - это программы под TP, перенести в Дельфи будет несложно ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: andrey

Репутация: -  0  +


Игру "Бильярд" я нашел но к сожелению лично я ничего не смог переделать для решения моей задачи! unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Всё более чем просто.
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: andrey

Репутация: -  0  +


так получаются просто 2 точки соединённые прямой.. unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.03.2024 11:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name