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

4 страниц V < 1 2 3 4 >  
 Ответить  Открыть новую тему 
> Моделирование движения шаров
сообщение
Сообщение #21


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 11.04.2007 0:36) *

за что отвечают переменные x1,x2,y1,y2 и Aspect,MinX (относительно чего определяется максимальные и минимальные координаты?),MinY,MaxX,MaxY,x0,y0 и ТА ?

Вот, смотри.
x1,x2,y1,y2 - это абстрактные координаты, приписанные окну (границы по Х и по У). Им можно приписать любые значения (есть только ограничения x1<x2 и y1<y2, но и они появляются не сразу, а только при рассмотрении выхода шарика за границу окна). Например, если исходить из реальных размеров на экране, то им можно дать значения в см, типа от 0 до 20 по Х и от 0 до 10 по У. Но если ты представляешь себе окно, как поле космического сражения (в игре), то можно присвоить им значения от 100 до 200 парсеков по Х и от 0 до 50 парсеков по У, например. Если (другой пример) ты используешь окно для построения графика, при этом строишь в нем график синуса, то разумно по Х сделать от -пи до +пи, а по У - от -1 до +1 (или от +1 до -1, поскольку при построении графика не нужно проверять выход за границы окна).

Эти абстрактные координаты мспользуются для осуществления движения шариков. То есть пересчет координат по скорости со времением происходит именно в них. Перевод в реальные координаты экрана (пикселы в графике или символы в тексте) производится только перед выводом (за небольшим исключением, скажу позже). Существуют формулы для перевода, они явно написаны, например, в процедурах ShowIt (ПоказатьЭто) и HideIt (СпрятатьЭто).

Aspect - это параметр, который учитывает "неквадратность" точки. Точка - это маленькое пятнышко. В идеале это квадратик (в ЖК-мониторах так и есть) поверхности, который закрашен в некоторый цвет. В современных мониторах пиксел имеет одинаковые размеры по горизонтали и вертикали (даже если это не квадратик, а пятнышко, как в ЭЛТ-мониторе). Иными словами, сместившись на 100 пикселов вправо и 100 вниз, мы пройдем (примерно) 2.5 см вправо и 2.5 см вниз. Это было не всегда - в старых мониторах типа EGA и CGA эти пути были не равны - но сейчас можно считать, что это так (хотя в некоторых модах все же бывает искажение). Совсем другое дело в текстовой моде.. Пиксел (символ) в ней совсем не квадратный, это прямоугольник. Вот это число, Aspect, как раз и учитывает эту неквадратность. Сейчас объясню, как.

Окно может быть разным - большим, маленьким. (Попробуй менять размер окна. Правда, для этого, пожалуй, нужно использовать FPC.. Кстати, какой компилятор ты используешь?) Я стараюсь сделать абстрактные координаты так, чтоб они как-то соответствовали размерам окна. Поэтому я сначала, в процедуре OpenBoard (ОткрытьПоле) выясняю его размеры (в символах):
  MinX:=1; MaxX:=WindMax and 255+1;
MinY:=1; MaxY:=WindMax shr 8+1;

Информацию о переменной WindMax смотри в описании модуля CRT.
MinX,MinY,MaxX,MaxY - это реальные координаты окна на экране, в пикселах (символах).

После этого я вычисляю абстрактные координаты по реальным, давая по 10 абстрактных единиц на одну ширину пиксела (символа) :
  x1:=0; x2:=MaxX*10;
y1:=0; y2:=Round(MaxY*10*Aspect);

Применение переменной Aspect тут должно учесть, что пиксел наш не квадратный. В моем примере я ему присвоил значение 2, поскольку высота символа примерно вдвое больше ширины (если хочешь, можешь измерить и уточнить это значение).

Что это нам дает? А вот, что.
Если скорости объекта (ну, пока скажем, пиксела) по Х и У одинаковые, то без учета Aspect'а, если пиксел смещать за один цикл на одну позицию, то реальная скорость пиксела на экране по У будет вдвое больше, чем по Х. Мы же делаем так: по формулам с учетом скоростей по Х и У мы высчитываем новое положение объекта. Допустим, по Х он смещается на расстояние 1 пкс, и скорости по Х и У равны. Тогда использование Aspect=2 даст то, что по У смещение будет 0.5 пкс, то есть реально объект по У не сместится. На следующем цикле объект сместится по Х еще на 1 пкс, а по У - еще на 0.5 пкс, что в сумме со смещением на предыдущем ходу даст 1 (0.5+0.5=1). На этот раз объект сместится по У на 1 пкс. Мы же увидим на экране ломаную траекторию, но ведущую в правильном направлении (под 45 градусов).

Этот способ - двойные координаты, абстрактные и реальные - очень эффективен в разных ситуациях. Иногда желательно иметь тройные координаты (например, пикселы - экранные_сантиметры - парсеки). Большей глубины вложения я пока не встречал, хотя возможно.

Таким образом, можно реально осуществлять движение объектов во всех направлениях и при этом скорости по Х и У будут соотноситься между собой правильно. Идея понятна? Про реализацию еще можно повыяснять.. smile.gif

Ну, а ТА, x0, y0 - это глупости... В некотором смысле лишнее smile.gif, но желательное. В эту переменную я запоминаю текущие текстовые атрибуты (цвет символа и цвет фона), чтобы вернуть их по завершении работы программы на место. Я также возвращаю на место курсор (все это в процедуре CloseBoard, ЗакрытьПоле), для запоминания которых я и использую x0 и y0. Если это не сделать, то курсор останется в том месте, где рисовался последний объект, и цвет символов будет такой же, как цвет последнего объекта. Это все тебе в графике не понадобится..

Успехов, и продолжай задавать вопросы. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Профи
****

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

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


возник такой вопрос: если теоретически я должна управлять скоростью движения шаров с клавиатуры, есть ли смысл, чтобы писать процедуру, которая бы вычисляла скорости шаров после столкновения, опираясь на ЗСИ (з-н сохранения импульса)? По-моему, смысла в этом нет... или я не права?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Профи
****

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

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


Попыталась добавить в программу движение под углом и меню (не знаю, как при выборе одного из пунктов потом снова вернутся с главное меню.....)

кроме того, проблема в function balls_hit ( на ней выдает ошибку 207)...

что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем....
он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать).

ниже программа....



Прикрепленные файлы
Прикрепленный файл  CIRCLES2.PAS ( 4.95 килобайт ) Кол-во скачиваний: 298
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 12.04.2007 14:43) *

если теоретически я должна управлять скоростью движения шаров с клавиатуры, есть ли смысл, чтобы писать процедуру, которая бы вычисляла скорости шаров после столкновения, опираясь на ЗСИ (з-н сохранения импульса)?

Вопрос не вполне понятен..
Неясня связь между твоим "если" и "то". blink.gif Управляешь с клавы - ну, управляй. А при чем тут столкновение? Вычисляй по ЗСИ или еще как-то (случайно - это, мне кажется выглядело вы дико на экране).
А может, ты спрашивала, есть ли смысл делать отдельную процедуру для этого или вычислять прямо в тексте?.. Это вопрос вкуса, но я вообще не понимаю (блин, так много стал не понимать.. smile.gif), почему ты делаешь из этого проблему.. ЗСИ - это звучит гордо, даже в сокращении, но фактически - это одна строчка несложных действий! Реши один раз на бумажке (столкновение считай абсолютно упругим), набей это в Паскаль - и забудь про физику! только не на всю жизнь.. smile.gif)))
Цитата(18192123 @ 12.04.2007 21:49) *

что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем....
он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать).

Дело твое, и в принципе я согласен - начинать нужно с самого простого. Но штука в том, что потом (если продолжишь этим заниматься) ты можешь открыть для себя совершенно неожиданно, что абстрактные координаты не усложняют, а упрощают реализацию. Потому что многие вопросы, которым нужно было придумывать специальное решение, тут решаются сами собой очень естественным образом.. smile.gif Но я согласен, что чтобы осознать это, нужно набраться немного опыта. Успехов тебе в этом - а я, если найду время вставить комменты, выложу это в FAQ, чтоб не пропадало..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Профи
****

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

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


Цитата(Lapp @ 12.04.2007 23:52) *

Управляешь с клавы - ну, управляй. А при чем тут столкновение? Вычисляй по ЗСИ или еще как-то (случайно - это, мне кажется выглядело вы дико на экране).

Спасибо , на мой вопрос ты ответил.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Профи
****

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

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


Цитата(18192123 @ 12.04.2007 21:49) *

Попыталась добавить в программу движение под углом и меню (не знаю, как при выборе одного из пунктов потом снова вернутся с главное меню.....)

кроме того, проблема в function balls_hit ( на ней выдает ошибку 207)...

что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем....
он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать).

ниже программа....

никак не получается найти ошибки....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Гость






Цитата
никак не получается найти ошибки....
Насчет #207, которая возникает в balls_hit ...

Для того, чтобы разобраться, откуда возникает эта ошибка, надо вспомнить, что же это вообще такое - RunTime Error #207:
Цитата
Invalid Floating Point Operation (Недопустимая операция с плавающей запятой)
Возможные причины возникновения:
1. Аргумент функции Trunc или Round не может быть преобразован в целое число, находящееся внутри диапазона типа LongInt.
2. Отрицательный аргумент функции Sqrt.
3. Аргумент функции Ln равен нулю, или имеет отрицательное значение.
4. Произошло переполнение стека сопроцессора


Путем небольшой модификации программы (для проверки, КАКАЯ именно из причин приводит к ошибке в твоем случае), выяснилось, что это - причина №4... Вот так программа работает без #207:

function balls_hit (const r1,r2 : integer; x1,y1,x2,y2 : integer) : boolean;
var
dist : real;
t1, t2, t3, t4, t5: real;
begin
t1 := abs(x2-x1); t2 := sqr(t1);
t3 := abs(y2-y1); t4 := sqr(t3);
t5 := t2 + t4;
dist := sqrt(t5);

balls_hit := (dist < (r1 + r2));
end;



Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Профи
****

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

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


Цитата(18192123 @ 12.04.2007 21:49) *

.... меню (не знаю, как при выборе одного из пунктов потом снова вернутся с главное меню.....)


с этим тоже проблема... как можно это реализовать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






Цитата
как можно это реализовать?

Обрамляешь все, что делается в меню Repeat / Until ... Вот так:
...
Begin
Gd := Detect;
InitGraph (Gd, Gm, '');
If GraphResult <> grOk then halt(1);

repeat
Choise := Menu ('INFO'#13'Ypravlenie'#13'Moving Balls'#13'Exit');
... { Здесь - все, что было у тебя в программе от Choise := Menu() до ReadKey }
until Choise = 3;

ReadKey;
CloseGraph;
End.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Профи
****

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

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


вот такие вопросы появились:
1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело?

2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются.....

3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!)

Сообщение отредактировано: 18192123 -


Прикрепленные файлы
Прикрепленный файл  CIRCLES2.PAS ( 5.57 килобайт ) Кол-во скачиваний: 289
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Профи
****

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

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


Цитата(18192123 @ 14.04.2007 20:54) *

вот такие вопросы появились:
1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело?

2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются.....

3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!)

помогите, пожалуйста! очень хочу разобраться!!! smile.gif

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Профи
****

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

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


Цитата(18192123 @ 14.04.2007 20:54) *

вот такие вопросы появились:
1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело?

2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются.....

3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!)

про 1 - может у меня с вызовом function balls_hit , procedure balls_hit_2, .........._3 что-то не то?

а с остальным - не получается.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Профи
****

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

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


по вопросу2:

begin
dx := -dx; dy := -dy;
x := round( x + dx*cos(ygol));
y := round( y + dy*sin(ygol));
end;




может я здесь dx и dy не к месту использую или нужно дополнительно вычислять расстояние , которое должен проходить шарик после изменения угла движения?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Профи
****

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

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


а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 17.04.2007 22:53) *

а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости?

Марина, привет.
Я скажу немного не то, что ты, возможно, ожидаешь.
Ты написала довольно большую программу - сама! что, безусловно, хорошо. Но ты пренебрегла советами.. что не всегда есть хорошо. Я посмотрел твою программу сразу после твоего поста #30, и пришел к выводу, что на разгребание того, что ты наворотила придется потратить несколько часов, а потом еще несколько часов на объяснеия, что там неправильно - и этого времени у меня нету.. Потом я честно посмотрел ее снова после поста 31 - повертел, покрутил и пришел к тому же выводу.. И т.д...

Если можно, я приведу сравнение..
Некто хочет научиться варить суп. Прежде всего он идет на кухню в общаге, хватает с плиты первую попавшуюся кастрюлю, тащит ее к шеф-повару и говорит: "Объясите мне пожалуйста, зачем тут вот эти штуки.." - и показывает на плавающие там обрывки упаковочной бумаги, куски полиэтилена (нет, волосы упоминать не буду, можете не зажмать рты.. smile.gif). Что может сказать шеф-повар? Его спросили не нужно ли это, а именно с какой целью это тут. Прямо показали пальчиком, и заинтересованно и серьезно ждут ответа.. Я думаю, он поступит как в том старом анекдоте из серии про студента кулинарного техникума (у Хазанова было такое амплуа), когда упомянутый студент пришел к врачу с обваренными гениталиями. Он скажет: "вылейте все это на ..."

После этого он прочтет бедному несчастному студенту лекцию на тему о варке супа, и проведет практическое занятие, а также подарит тарелку хорошего супа. А потом скажет, как это свойственно профессорам-шеф-поварам: если что неясно - я к Вашим услугам, милейший.

Но студент, уяснив кое-что (хоть и не много), говорит - а, не хочу я разбираться в его супе. Его суп слишком сложен для меня (и мой семинарист говорит, что мне такой суп никогда не сварить..) Сварю-ка я свой собственный суп.. И варит. Но суп получается горький, пересоленый, мясо в нем не разжевать.. Что делать? Конечно, идти к шеф-повару! И спрашивать: а зачем я сделал так? а почему я сделал этак?..

Понимаешь, если программа небольшая или речь идет о фрагменте, где локализована ошибка - это одно. Но если нужно расхлебывать весь переперченый недосоленный суп... И учесть еще неправильное форматирование текста.. Ей-Богу лучше вылить его ...
Ты бы сделала хотя бы некоторый вывод из того, что тебе никто не отвечает!

Не знаю, поняла ли ты меня.. Если что не так сказал - извини, я не хотел тебя обидеть. Но только на твой вопрос (повторю его) :
Цитата(18192123 @ 17.04.2007 22:53) *

а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости?

- на этот вопрос я ответил в самом начале темы. Если хочешь - я могу снова подключиться. Но только не для того, чтобы отвечать на вопросы типа "а как пришить пуговицу пеньковой веревкой?". Если согласна - you are welcome! smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Профи
****

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

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


Если у меня положения центров шаров будут находиться с помощью такой процедуры:

procedure move (var x, y: integer; angle : single; speed : integer);
begin
x := round(x + speed*cos(angle));
y := round(y + speed*sin(angle));
end;



то как должны выглядеть процедуры
procedure charge_on_oppositeX
procedure charge_on_oppositeY, которые я использую для изменения направления движения шариков на противоположные при столкновении с границей?

Я сделала предположение ,что так:

procedure charge_on_oppositeX (var x : integer; speed : integer; angle : single);
var dx : integer;
begin
dx := round(speed*cos(angle)); dx := -dx;
x := x + dx;
end;

результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.




Прикрепленные файлы
Прикрепленный файл  CIRCLES3.PAS ( 6.17 килобайт ) Кол-во скачиваний: 260
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 18.04.2007 23:50) *

как должны выглядеть процедуры ..., которые я использую для изменения направления движения шариков на противоположные при столкновении с границей?
Я сделала предположение ,что так:
...
результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.

Нет, не так. Эти процедуры долхны менять угол, а не положение!
Примерно так:
по Х: angle:=180-angle;
по Y: angle:=-angle;
Иначе эффект действительно будет похожим на то, что ты говоришь

PS
Если в названиях процедур ты подразумевала "изменить", то это слово пишется change. А слово charge означает нечто другое.. И предлог лучше to, а не on. Это так, к слову..

Добавлено через 15 мин.
Вообще-то правильние было бы написать не 180, а Pi .. smile.gif
Извиняюсь.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Профи
****

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

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


Цитата(Lapp @ 19.04.2007 7:29) *

Примерно так:
по Х: angle:=180-angle;
по Y: angle:=-angle;


С этим получилось , но в результате , если один из шаров сталкивается с границей, то и второй , где бы он не находился в этот момент, меняет свой угол движения.

Как я полагаю, причина в этом:

function angleX (angle : single):single;
begin
angleX := (pi - angle);
end;

function angleY (angle : single): single;
begin
angleY := -angle;
end;

Procedure border (var x, y: integer; r : integer; speed: integer{; angle : single});
begin
if (x + r >= GetMaxX-1) or (x - r <= 1) then angle := angleX(angle);
if (y + r >= GetMaxY-1) or (y - r <= 1) then angle := angleY(angle);
end;




а это вызов процедур ,описанных выше:

begin
draw (x1, y1, r1, white);
draw (x2, y2, r2, red );
delay(15100);
escape (x1, y1, r1, bgC);
escape (x2, y2, r2, bgC);
move (x1, y1, angle, speed1);
move (x2, y2, angle, speed2);
border (x1, y1, r1, speed1{,angle} );
border (x2, y2, r2, speed2{, angle});
balls_hit_2;
end;



если менять скорость обоих шариков одновременно , то , когда шарики сталкиваются, то они просто сцепливаются.... - не знаю, как это исправить?)
столкновение шаров предусмотрено в следующих процедурах:

function value(const r: integer):real;
begin
value := 4/3*pi*r*r*r;
end;

procedure after_hit (spee1, speed2 : integer; x1, y1, x2, y2 : integer; angle : single);
var m1, m2 : real;
begin
m1 := value(r1);
m2 := value(r2);
speed1 := round((2*m2*speed2 + (m1-m2)*speed1)/(m1+m2));
speed2 := round((2*m1*speed1 + (m2-m1)*speed2)/(m1+m2));
x1 := round(x1 + speed1*cos(angle));
y1 := round(y1 + speed1*sin(angle));
x2 := round(x2 + speed2*cos(angle));
y2 := round(y2 + speed2*sin(angle));
end;


function balls_hit (const r1,r2 : integer; x1,y1,x2,y2 : integer) : boolean;
var
dist : real;
t1, t2, t3, t4, t5: real;
begin
t1 := abs(x2-x1); t2 := sqr(t1);
t3 := abs(y2-y1); t4 := sqr(t3);
t5 := t2 + t4;
dist := sqrt(t5);

balls_hit := (dist < (r1 + r2));
end;

procedure balls_hit_2;
begin
if balls_hit(r1,r2,x1,y1,x2,y2) then after_hit (speed1, speed2, x1, y1,x2, y2,angle);
end;





Сообщение отредактировано: 18192123 -


Прикрепленные файлы
Прикрепленный файл  CIRCLES5.PAS ( 5.96 килобайт ) Кол-во скачиваний: 341
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 19.04.2007 14:46) *

С этим получилось , но в результате , если один из шаров сталкивается с границей, то и второй , где бы он не находился в этот момент, меняет свой угол движения.

Видимо, у тебя один угол на два шара. А надо иметь на каждый шар свой угол.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Профи
****

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

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


Цитата(Lapp @ 19.04.2007 23:47) *

Видимо, у тебя один угол на два шара. А надо иметь на каждый шар свой угол.

а как учесть два угла для разных шаров в процедуре border (может нужно и туда передавать углы?)
или это нужно учитывать в ф-ях angleX и angleY?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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