Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28

Помогите разобраться с функцией IntersectRect !

09.05.2014, 18:09. Показов 1146. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот код :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if IntersectRect(overlay,Shape1.BoundsRect,Shape2.BoundsRect) then
     begin
          if Shape1.Left<Shape2.Left then
          begin
               vx1:=Round(vx*0.8);
               vx:=Round(vx*0.2);
          end;
          if Shape1.Left>Shape2.Left then
          begin
               vx1:=-Round(vx*0.8);
               vx:=Round(vx*0.2);
          end;
          if Shape1.Left = Shape2.Left then
          vx1:=0;
          if Shape1.Top<Shape2.Top then
          begin
               vy1:=Round(vy*0.8);
               vy:=Round(vy*0.2);
          end;
          if Shape1.Top>Shape2.Top then
          begin
               vy1:=-Round(vy*0.8);
               vy:=Round(vy*0.2);
          end;
          if Shape1.Top = Shape2.Top then
          vy1:=0;
          vx:=-vx;
     end;
где vx,vx1-скорости шара 1 и 2.Но при столкновении они не расходятся а на месте стоят.
И ещё когда сталкиваются по по диагонали видно что их границы(шаров) друг от друга на небольшом расстоянии,а не вместе как надо.Использую Shape1 и Shape2.Прошу помочь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2014, 18:09
Ответы с готовыми решениями:

Помогите разобраться с функцией IntersectRect и исправить программу
Помогите исправить, почему не работает? пожалуйстааа unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Как пользоваться функцией IntersectRect()
я недавно в мире программирования и в принципе в лазарус максимум что я могу создать в нем, это тамагочи, так вот хочу создать игру...

Помогите разобраться с функцией
Здравствуйте! Я пытаюсь осилить бесплатный курс http://www.nlp-class.org/ Вот тут надо придумать регулярные выражения для поиска...

12
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
09.05.2014, 18:14
Цитата Сообщение от ДмитрийПО Посмотреть сообщение
Использую Shape1 и Shape2
Так это прямоугольные компоненты, даже если устанавливаешь круглую форму. Нужно рисовать шары и следить за расстоянием между центрами и радиусами.
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
09.05.2014, 19:26  [ТС]
а шары рисовать при помощи canvas? Если да то подскажите команду.

Добавлено через 6 минут
а шары рисовать при помощи canvas? Если да то подскажите команду.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
09.05.2014, 19:33
Если Вы такое спрашиваете, то разобраться с упругим столкновением шаров Вам вряд ли удастся разобраться...
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
09.05.2014, 19:36  [ТС]
я так спросил так как знаю что шар можно нарисовать с помощью form1.canvas.arc(*),но ведь в этой команде тоже указываются начальные точки обозначающие угол прямоугольника (в котором будет шар),а не центр шара,вот и поинтересовался есть ли такая команда где указывается центр шара.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
09.05.2014, 19:40
Рисовать круг этой функцией можно, но только обкурившись.
В нормальном состоянии рисуют Canvas.Ellipse(x1,y1,x2,y2);

Добавлено через 1 минуту
Центр определяется так
Delphi
1
2
xc:=(x2+x1) div 2;
yc:=(y2+y1) div 2;
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
11.05.2014, 16:21  [ТС]
а как определить радиус?А то я что-то запутался?Если x1=100,y1=100,x2=130,y2=130;
То центр шара равен х=115,у=115.А радиус 15?
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
11.05.2014, 16:30
Именно так, а в чем сомнения?
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
11.05.2014, 16:32  [ТС]
хотел проверить через if столкновение шаров ,таким образов что бы проверять расстояние между центрами abs(cx1-cx2)=30,т.е.(15+15=30),но шары ведут себя неадекватно и не отталкиваются как надо.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
11.05.2014, 16:36
Цитата Сообщение от ДмитрийПО Посмотреть сообщение
проверять расстояние между центрами
Его считают так
Delphi
1
s:=sqrt(sqr(x1-x2)+sqr(y1-y2));
А проверка примерно так
Delphi
1
if sqrt(sqr(x1-x2)+sqr(y1-y2))<=2*r then...;
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
11.05.2014, 16:38  [ТС]
Спасибо,попробую.
А как лучше переключаться между шарами в бильярде?
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
11.05.2014, 16:40
Но для расчета правильного направления отскока еще немного геометрии нужно, всяких там синусов-косинусов..

Добавлено через 1 минуту
А в общем я в этом деле не помощник. Почитайте что-то по упругое столкновение шаров и про написание билиарда...
0
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 28
11.05.2014, 16:58  [ТС]
я нашёл в интернете что при столкновении шаров направление покоющегося шара(или шара с меньшей скорость),будет напраленно через два центра.Короче вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if sqrt(sqr(cx1-cx2)+sqr(cy1-cy2))<=2*r then
     begin
          if cx1<cx2 then
          vx2:=vx1;
          if cx1>cx2 then
          vx2:=-vx1;
          if cx1=cx2 then
          vx2:=0;
          if cy1<cy2 then
          vy2:=vy1;
          if cy1>cy2 then
          vy2:=-vy1;
          if cy1=cy2 then
          vy2:=0;
          vx1:=-vx1;
     end;
только их отскок больше похож на "спаривание".

Добавлено через 4 минуты
вот весь код(это только отскок шаров от бортов и друг от друга):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  sh1x1,sh1x2,sh1y1,sh1y2,sh2x1,sh2y1,sh2x2,sh2y2:integer;
  vx1,vy1,vx2,vy2:integer;
  cx1,cy1,cx2,cy2,r:integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
     sh1x1:=100;
     sh1y1:=100;
     sh1x2:=130;
     sh1y2:=130;
     sh2x1:=600;
     sh2y1:=200;
     sh2x2:=630;
     sh2y2:=230;
     vx1:=7;
     vy1:=-5;
     vx2:=0;
     vy2:=0;
     r:=15;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     Form1.Repaint;
 
     sh1x1:=sh1x1+vx1;
     sh1x2:=sh1x2+vx1;
     sh1y1:=sh1y1+vy1;
     sh1y2:=sh1y2+vy1;
     cx1:=(sh1x1+sh1x2) div 2;
     cy1:=(sh1y1+sh1y2) div 2;
 
     sh2x1:=sh2x1+vx2;
     sh2x2:=sh2x2+vx2;
     sh2y1:=sh2y1+vy2;
     sh2y2:=sh2y2+vy2;
     cx2:=(sh2x1+sh2x2) div 2;
     cy2:=(sh2y1+sh2y2) div 2;
 
     if sqrt(sqr(cx1-cx2)+sqr(cy1-cy2))<=2*r then
     begin
          if cx1<cx2 then
          vx2:=vx1;
          if cx1>cx2 then
          vx2:=-vx1;
          if cx1=cx2 then
          vx2:=0;
          if cy1<cy2 then
          vy2:=vy1;
          if cy1>cy2 then
          vy2:=-vy1;
          if cy1=cy2 then
          vy2:=0;
          vx1:=-vx1;
     end;
 
     if (cx1+r)>ClientWidth then
     vx1:=-vx1;
     if (cx1-r)<0 then
     vx1:=-vx1;
     if (cy1+r)>ClientHeight then
     vy1:=-vy1;
     if (cy1-r)<0 then
     vy1:=-vy1;
 
     if (cx2+r)>ClientWidth then
     vx2:=-vx2;
     if (cx2-r)<0 then
     vx2:=-vx2;
     if (cy2+r)>ClientHeight then
     vy2:=-vy2;
     if (cy2-r)<0 then
     vy2:=-vy2;
 
     Form1.Canvas.Ellipse(sh1x1,sh1y1,sh1x2,sh1y2);
     Form1.Canvas.Ellipse(sh2x1,sh2y1,sh2x2,sh2y2);
end;
 
 
end.
Добавлено через 7 минут
разобрался!У меня со знаком в скорости кое-что надо было поправить!А так отскакивают!

Добавлено через 1 минуту
А не знаете как между шарами переключаться,с первого шара на второй и т.д.+ когда шар в лузу попадёт как переключаться между шарами если один из них исчезнет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2014, 16:58
Помогаю со студенческими работами здесь

Помогите разобраться с функцией SystemParametersInfo
Как сделать, чтобы функция выводила параметры, а как, чтобы сохраняла? И где можно найти описания констант, обозначающих параметры?

Помогите разобраться с функцией load
суть вопроса такова: есть вертикальное меню, которое находится в блоке div с id=menu. Идея состоит в том чтобы при нажатии на определенный...

Помогите разобраться с функцией ПОИСКПОЗ
Всем привет, помогите разобраться с функцией ПОИСКПОЗ, в прикрепленном файле задание, не могу сделать так, чтобы корректно выводило(

Помогите разобраться с функцией mvnrnd
Здравствуйте. Нужна помощь с функцией mvnrnd. В описании сказано, что MU это математическое ожидание, то есть среднее. Это значит,...

разобраться с функцией
Помогите разобраться с функцией fopen (); Если я создам документ допустим market.php и напишу туда код &lt;?php $des =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru