Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Графика, задача про бильярд 
:(
    Опции темы
Alex31kv
Дата 20.4.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.3.2007

Репутация: нет
Всего: нет



Нарисовать бильярдный стол (без луз) и шарик на столе, бьем по шарику кием под углом альфа, угол выбираем сами.
Показать как будет двигаться шарик сохраняя законы физики (угол падения равен углу отражения).
P.S. Должен двигаться шарик, след от него не нужен.
PM MAIL   Вверх
Alex31kv
Дата 29.4.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.3.2007

Репутация: нет
Всего: нет



подскажите как сделать что бы шарик двигался?

Код

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
main()
{
int gd=0,gm,x,y,a;
initgraph(&gd, &gm, "D:\\program\\Borland\\TC\\BGI");
  setfillstyle(1,GREEN);
  bar(40,40,600,440);
  setfillstyle(1,RED);
  fillellipse(140,240,10,10);
getch();
closegraph();
}


Это сообщение отредактировал(а) Alexeis - 29.4.2007, 12:50
PM MAIL   Вверх
dizzy1984
Дата 1.5.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



В общем и целом идея такова.
Если шарик двигается равномерно, то в каждый момент времени шарик увеличивает свои координаты на некторое постоянное значение по х и у. При соударении с бортом бильярдного стола та величина, которая не может более увеличивать или уменьшать соответствующую координату меняет свое значение на противоположное. Так шарик двигавшийся вверх столкнувшись с бортом будет двигаться вниз.
Вот псевдокод.

1. Нарисовать стол
2. Нарисовать шарик
3. Модифицировать координаты х и у.
4. Проверить наличие столкновения.
5. В случае наличия инвертировать соответствующую характеристику.
6. Подождать некоторое время
7. Перейти к шагу 1
PM MAIL   Вверх
En_t_end
Дата 1.5.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Недавно делал.
Клавиши 
'q' - выход
'w' - переместить вверх
'a' - вправо
'd' - влево
's' - вниз
'e - изм. угол
'r' - изм. угол
'+' - сила удара
'-' - сила удара
пробел - начать движение

Добавлено через 2 минуты и 21 секунду
Там есть некоторые недочёты, как то лишний параметр у функции ball_drive.
Тебе нужна именно функция ball_drive

Присоединённый файл ( Кол-во скачиваний: 147 )
Присоединённый файл  14_9_TC.ZIP 49,48 Kb
PM MAIL ICQ Skype GTalk Jabber   Вверх
Alex31kv
Дата 4.5.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.3.2007

Репутация: нет
Всего: нет



En_t_end, 
супер, сделал красиво, вот только с физикой как то не очень, не знаешь как ее доработать?
PM MAIL   Вверх
En_t_end
Дата 6.5.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Alex31kv, 
Цитата(Alex31kv @  5.5.2007,  01:13 Найти цитируемый пост)
супер, сделал красиво, вот только с физикой как то не очень, не знаешь как ее доработать?

Как раз с физикой там всё нормально smile Ко всему прочему, что там расчитывается равнозамедленное прямолинейнное движение(по гипотенузе), я использую реально измеренные коэффицент трения и средне статистическую силу удара кием, также взята совершенно реальная масса шара.

Доработать её можно и нужно.
1. разберись с расчётом углов отражений.
Я, дабы не заморачиваться разбил задачу на подзадачи. Поясняю, нам изначально неизвестно в какой борт попадёт шар, если разбить плоскость стола на четыре квадранта(относительно угла удара), то теперь мы должны выбирать в какой из двух бортов происходит удар. Чтобы это сделать нужно построить треугольник с гипотенузой от позиции шара до лузы(к этому времени у программы будет всего лишь одна луза для удара) и посмотреть угол образованный этой прямой. Т.е теперь сравнивая угол удара и угол обр. прямой построенной в лузу мы можем однозначно определить в какой борт будет удар.
Ну а дальше просто расчитывается точка пересечения двух прямых : борта и прямой удара.
Проблема: слишком много кода для решения данной подзадачи.
Проблема: ошибки расчета угла отражения при углах удара(после преобразования к углу определенного квадранта) близких к 90 градусам и 0 градусов. У меня есть предположение, что в этом виноваты реализации тригонометрических функций в старых либах, они вообще ИМХО 16 разрядные smile
2. Следующая задача - это движение шара по прямой с учётом законов физики.
а)узнаешь длину отрезка движения(по двум точкам)
б)прогоняешь цикл с итерациями(итератор i) от 0 до длины отрезка.
Расчёт текущей точки отрисовки шара выполняешь по следуюшим формулам:
x = A1.x(+-)i*cos(alfa)
y = A1.y(+-)i*sin(alfa)
alfa - угол между прямой паралельной оси 0x и прямой удара.
Т.е узнаешь абсциссу и ординату текущей точки отрисовки шара.
Далее, приращение i - есть ускорение a.
a = (F_удара - F_тр)/m.
В конце каждой итерации ускорение перерасчитывается.
Здесь проблема в том, как определить приращение итератора, как напрямую добавлять ускорение или подвергнуть ускорение ещё каким-то преобразованиям.

Это сообщение отредактировал(а) En_t_end - 6.5.2007, 16:31
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.