Хотел сначала разместить тему в "Физике", но решил, что здесь уместнее.
Предлагаю немного посоревноваться в искусстве управления роботом.
Краткое описание:
Робот представляет собой три массивных колеса (изображение в 2D), соединённых невесомыми пружинами, внизу расположена земля, имеется сила тяжести, трение. Столкновения колёс между собой и с землёй абсолютно неупругие.
Радиус колеса - 32 (в пикселях), длина ненагруженных пружин - 150, земля находится на уровне -32, то есть колесо, касающееся земли, находится на уровне 0.
ЭТО ВСЁ УЖЕ НАПИСАНО! Ваша задача - написать robot.dll.
Программа, визуализирующая робота, обращается к robot.dll, которая экспортирует единственную ф-цию RTICK. Единственный параметр ф-ции - указатель на структуру, содержащую текущее значения координат и скоростей колёс, а так же усилия, приложенные к пружинам.
Задача - заставить робота двигаться вправо, цель - за минуту уйти как можно дальше.
Ф-ция RTICK вызывается 60 раз в секунду.
Тут уже готовая программа и исходник robot.dll на C++:
RoboControl
Можно этот исходник брать за основу.
Текущий рекорд от Mikle - Robot53053
Надо было написать что dll нужно собирать в MSVS 2008 и выше.
Собрал в 2005, не зафурычило.
nes
Я писал в VS2008, просто создай в 2005-й новый проект-dll, скопируй туда код, и не забудь .def файл подключить.
Вообще я приветствую написание dll на любых языках, которые это позволяют.
Если сделать так, то выдает типо RTICK точка входа не найдена.
Если избавиться от __stdcall, то программа просто падает при запуске.
Чуть больше инфы нужно о параметрах.
Pos/Spd не константные, но менять бессмысленно, правильно? В каких пределах можно менять Frc, и как эти силы прикладываются к пружинам?
Что-то надо сделать, чтобы dll можно было скомпилировать с помощью gcc и удачно подключить к проге. Последнее пока не получается. Вы же не хотите показать, что С++ лажает уже на вызове одной функции из dll. Предполагаю, что поместить определения структур внутрь extern "C" (в программе тоже) не помешает, хотя и непонятно, что изменится, но других способов я больше не нахожу.
nes
> Если сделать так, то выдает типо RTICK точка входа не найдена.
Это потому, что def файл не подключен - Project\Configuration Properties\Linker\Input\Module Definition File, значение "robot.def".
RPGman
> Чуть больше инфы нужно о параметрах.
Единицы все условные:
Масса колеса - 1.
Время - 1 "тик", то есть примерно 1/60 сек.
Расстояние - пиксели.
Соответственно скорость - пиксели за тик.
Единица силы - та величина, при которой за 1 тик тело массой в 1 ускоряется на 1.
Ускорение св. падения - 0.1.
Трение об воздух - каждый тик скорость каждого шара умножается на 0.997.
К-т жёсткости пружины - 6/150 (по Гуку).
Сила трения покоя и движения - 3 * сила_сжатия_тел.
Могу, при необходимости, дать исходник физики, но вряд ли это нужно. Мне кажется, что будет и проще, и интереснее сделать так, чтобы робот сам динамически принимал решение.
RPGman
> Pos/Spd не константные, но менять бессмысленно, правильно?
Верно, менять можно, но программа восстановит правильные значения.
RPGman
> В каких пределах можно менять Frc, и как эти силы прикладываются к пружинам?
Забыл сразу написать - можно только влиять на три пружины, сила от -3 до 3, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает. Пружина с индексом №0 соединяет колёса №0 и №1, пружина с индексом №1 соединяет колёса №1 и №2, пружина с индексом №2 соединяет колёса №2 и №0.
Zefick
> Что-то надо сделать, чтобы dll можно было скомпилировать с помощью gcc и удачно
> подключить к проге.
Я с gcc не знаком. Как вообще на нём пишут нативные stdcall dll?
>>Что-то надо сделать, чтобы dll можно было скомпилировать с помощью gcc и удачно подключить к проге
У меня все нормально компилится и работает (чему там не работать-то:)), GCC 4.4.1 (MinGW), собирал в Code::Blocks
Просто компилятору надо указать чтобы он сам не генерил def файл, а юзал тот который в аттаче
дело в декорировании имени "@4", которого не должно быть для проги. По стандарту этот постфикс для stdcall функций, странно что прога ожидает имя без него.
Mikle
> Я с gcc не знаком. Как вообще на нём пишут нативные stdcall dll?
Я тоже только сегодня за долгое время скомпилировал. В общем-то там всё в десять раз проще - на надо ни windows.h, ни stdafx, а просто компилируется один файл командой gcc -shared -o robot.dll robot.c. Получается какая-то dll и когда я смотрю инфу по ней с помощью objdump, то там показывается, что RTICK экспортируется. В общем-то наверное дело даже не в структурах, потому что если с ними в функции ничего не делать, то всё равно валится. А если оставить __stdcall, то вообще при запуске пишет, что функции такой нет. В чём может быть дело сам не знаю.
Zefick
> А если оставить __stdcall, то вообще при запуске пишет, что функции такой нет.
> В чём может быть дело сам не знаю.
__stdcall нужно обязательно, а дело, возможно, в том же, в чём и у nes. C++ искажает имена ф-ций в dll, в студии это можно исправить def файлом, либо с помощью "pragma comment", не помню дальше, сам всегда def файлами пользуюсь.
>Текущий результат, который пока можно считать рекордом - 3688.
Доработал немного 3830. :)
robot.dll
lol, перевернулся таки. 4220
robot
Adler
Обновил рекорд в п.0.
Хочу сейчас сделать, чтобы роботу можно было переворачиваться, и он сам менял индексы, отталкивался нужным колесом.
не хватает масштабирования скорости симуляции в виде параметра для запуска приложению.
С def-файлом всё заработало. Странно, что студия и gcc дают разные имена экспортируемым функциям, даже если они сишные.
Тема в архиве.