![]() |
![]() ![]() |
![]() |
Lapp |
![]()
Сообщение
#21
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
за что отвечают переменные 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 градусов). Этот способ - двойные координаты, абстрактные и реальные - очень эффективен в разных ситуациях. Иногда желательно иметь тройные координаты (например, пикселы - экранные_сантиметры - парсеки). Большей глубины вложения я пока не встречал, хотя возможно. Таким образом, можно реально осуществлять движение объектов во всех направлениях и при этом скорости по Х и У будут соотноситься между собой правильно. Идея понятна? Про реализацию еще можно повыяснять.. ![]() Ну, а ТА, x0, y0 - это глупости... В некотором смысле лишнее ![]() Успехов, и продолжай задавать вопросы. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
![]()
Сообщение
#22
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
возник такой вопрос: если теоретически я должна управлять скоростью движения шаров с клавиатуры, есть ли смысл, чтобы писать процедуру, которая бы вычисляла скорости шаров после столкновения, опираясь на ЗСИ (з-н сохранения импульса)? По-моему, смысла в этом нет... или я не права?
|
18192123 |
![]()
Сообщение
#23
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Попыталась добавить в программу движение под углом и меню (не знаю, как при выборе одного из пунктов потом снова вернутся с главное меню.....)
кроме того, проблема в function balls_hit ( на ней выдает ошибку 207)... что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем.... он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать). ниже программа.... Прикрепленные файлы ![]() |
Lapp |
![]()
Сообщение
#24
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
если теоретически я должна управлять скоростью движения шаров с клавиатуры, есть ли смысл, чтобы писать процедуру, которая бы вычисляла скорости шаров после столкновения, опираясь на ЗСИ (з-н сохранения импульса)? Вопрос не вполне понятен.. Неясня связь между твоим "если" и "то". ![]() А может, ты спрашивала, есть ли смысл делать отдельную процедуру для этого или вычислять прямо в тексте?.. Это вопрос вкуса, но я вообще не понимаю (блин, так много стал не понимать.. ![]() ![]() что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем.... он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать). Дело твое, и в принципе я согласен - начинать нужно с самого простого. Но штука в том, что потом (если продолжишь этим заниматься) ты можешь открыть для себя совершенно неожиданно, что абстрактные координаты не усложняют, а упрощают реализацию. Потому что многие вопросы, которым нужно было придумывать специальное решение, тут решаются сами собой очень естественным образом.. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
![]()
Сообщение
#25
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#26
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Попыталась добавить в программу движение под углом и меню (не знаю, как при выборе одного из пунктов потом снова вернутся с главное меню.....) кроме того, проблема в function balls_hit ( на ней выдает ошибку 207)... что касается реальных и абстрактных координат, то посоветовалась со своим преподавателем.... он сказал, что мне не стоит на этом заоострять внимание (но всё равно спасибо большое, мне это было полезно узнать). ниже программа.... никак не получается найти ошибки.... |
volvo |
![]()
Сообщение
#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 - 14.04.2007 15:02 |
18192123 |
![]()
Сообщение
#28
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#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.
|
18192123 |
![]()
Сообщение
#30
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
вот такие вопросы появились:
1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело? 2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются..... 3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!) Сообщение отредактировано: 18192123 - 14.04.2007 19:55 Прикрепленные файлы ![]() |
18192123 |
![]()
Сообщение
#31
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
вот такие вопросы появились: 1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело? 2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются..... 3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!) помогите, пожалуйста! очень хочу разобраться!!! ![]() Сообщение отредактировано: 18192123 - 16.04.2007 18:48 |
18192123 |
![]()
Сообщение
#32
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
вот такие вопросы появились: 1. если шарики соприкасаются, то они просто проходят сквозь друг друга, а предполагалось, что направление будет меняться... в чём же дело? 2. не понимаю, как изменить угол ( для взятия угла у меня function ygol) при столкновении со стенками и при столкновени шаров...я применяла эту функцию (это место в программе взято в комментарий), но шарики при движении только колебаются..... 3. про варьирование скоростью с помощью стрелок управления курсором.... не пойму сам механизм этого ( "привязать" к этому клавиши - это ладно..., но вот, так скажем, к чему привязывать - ну не пойму!) про 1 - может у меня с вызовом function balls_hit , procedure balls_hit_2, .........._3 что-то не то? а с остальным - не получается..... |
18192123 |
![]()
Сообщение
#33
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
по вопросу2:
begin
dx := -dx; dy := -dy;
x := round( x + dx*cos(ygol));
y := round( y + dy*sin(ygol));
end;
может я здесь dx и dy не к месту использую или нужно дополнительно вычислять расстояние , которое должен проходить шарик после изменения угла движения? Сообщение отредактировано: 18192123 - 17.04.2007 21:33 |
18192123 |
![]()
Сообщение
#34
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости?
|
Lapp |
![]()
Сообщение
#35
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости? Марина, привет. Я скажу немного не то, что ты, возможно, ожидаешь. Ты написала довольно большую программу - сама! что, безусловно, хорошо. Но ты пренебрегла советами.. что не всегда есть хорошо. Я посмотрел твою программу сразу после твоего поста #30, и пришел к выводу, что на разгребание того, что ты наворотила придется потратить несколько часов, а потом еще несколько часов на объяснеия, что там неправильно - и этого времени у меня нету.. Потом я честно посмотрел ее снова после поста 31 - повертел, покрутил и пришел к тому же выводу.. И т.д... Если можно, я приведу сравнение.. Некто хочет научиться варить суп. Прежде всего он идет на кухню в общаге, хватает с плиты первую попавшуюся кастрюлю, тащит ее к шеф-повару и говорит: "Объясите мне пожалуйста, зачем тут вот эти штуки.." - и показывает на плавающие там обрывки упаковочной бумаги, куски полиэтилена (нет, волосы упоминать не буду, можете не зажмать рты.. ![]() После этого он прочтет бедному несчастному студенту лекцию на тему о варке супа, и проведет практическое занятие, а также подарит тарелку хорошего супа. А потом скажет, как это свойственно профессорам-шеф-поварам: если что неясно - я к Вашим услугам, милейший. Но студент, уяснив кое-что (хоть и не много), говорит - а, не хочу я разбираться в его супе. Его суп слишком сложен для меня (и мой семинарист говорит, что мне такой суп никогда не сварить..) Сварю-ка я свой собственный суп.. И варит. Но суп получается горький, пересоленый, мясо в нем не разжевать.. Что делать? Конечно, идти к шеф-повару! И спрашивать: а зачем я сделал так? а почему я сделал этак?.. Понимаешь, если программа небольшая или речь идет о фрагменте, где локализована ошибка - это одно. Но если нужно расхлебывать весь переперченый недосоленный суп... И учесть еще неправильное форматирование текста.. Ей-Богу лучше вылить его ... Ты бы сделала хотя бы некоторый вывод из того, что тебе никто не отвечает! Не знаю, поняла ли ты меня.. Если что не так сказал - извини, я не хотел тебя обидеть. Но только на твой вопрос (повторю его) : а насчёт варьирования скоростями: от чего отталкиваться (какое условие задавать) ,чтобы регулировать скорости? - на этот вопрос я ответил в самом начале темы. Если хочешь - я могу снова подключиться. Но только не для того, чтобы отвечать на вопросы типа "а как пришить пуговицу пеньковой веревкой?". Если согласна - you are welcome! ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
![]()
Сообщение
#36
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Если у меня положения центров шаров будут находиться с помощью такой процедуры:
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;
результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.
Прикрепленные файлы ![]() |
Lapp |
![]()
Сообщение
#37
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
как должны выглядеть процедуры ..., которые я использую для изменения направления движения шариков на противоположные при столкновении с границей? Я сделала предположение ,что так: ... результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу. Нет, не так. Эти процедуры долхны менять угол, а не положение! Примерно так: по Х: angle:=180-angle; по Y: angle:=-angle; Иначе эффект действительно будет похожим на то, что ты говоришь PS Если в названиях процедур ты подразумевала "изменить", то это слово пишется change. А слово charge означает нечто другое.. И предлог лучше to, а не on. Это так, к слову.. Добавлено через 15 мин. Вообще-то правильние было бы написать не 180, а Pi .. ![]() Извиняюсь. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
![]()
Сообщение
#38
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Примерно так: по Х: 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 - 19.04.2007 14:09 Прикрепленные файлы ![]() |
Lapp |
![]()
Сообщение
#39
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
С этим получилось , но в результате , если один из шаров сталкивается с границей, то и второй , где бы он не находился в этот момент, меняет свой угол движения. Видимо, у тебя один угол на два шара. А надо иметь на каждый шар свой угол. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
![]()
Сообщение
#40
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 1:28 |