пятница, 16 августа 2019 г.

Json in python

Долго не могла понять, что не так со словарем вида на экране
{"a":5}
Потом оказалось, что 5 - это не int, а int32. А этот тип библиотека json отказывается преобразовывать. А numpy, из которой данные-то и берутся, пишет либо float, либо int32.
Пришлось возле каждого посчитано значения вписывать float(counted_var). И преобразование в json больше не выбрасывает исключения.

пятница, 8 июня 2018 г.

С#/С++

Вспоминаю с#. Веду протокол изменений, разностей и вообще того, что удивило и порадовало.
Разница с с++:
Это предопределённых порядок выполнения операндов слева направо. В с++ такого сейчас нет, компилятор может оптимизировать все очень странно(про порядок вычисления операндов, вроде это так).

Разница между && и &. & не сокращают вычисления, && сокращают. С++ компилятор может действовать как хочет. Страуструп пишет, что вычисления с++ всегда сокращенные. Сейчас в статьях встречала, что порядок вычисления условий в заголовке условного оператора не определён, те зависит от компилятора, в с# всегда слева направо).

В плане математики в с# все более строго. Неявные преобразования с потерей информации запрещены .

Ну, сборщик мусора. Лафа и халява.

Жёсткие различия между struct и class. К этому нужно будет привыкнуть.

Область видимости переменной - это целый блок программы, где она описана, а не только блок, начиная с места непосредственного объявления. Тоже кажется нелогичным, но это так.

В с# мажно сделать псевдонимы для имён библиотек .

Можно импортировать не только пространство имён, но лишь отдельный тип (видимо тоже удобно для разрешения конфликтов имён).

Что такое out в списке типов аргументов функции - пока не дошла, только встретила использование.

Метод сжатый до выражения- это вещь для таких лентяев как я. Писать => проще чем кучу всего обычного. ; в конце метода нужна.

С конструкторами с параметрами по умолчанию надо быть осторожнее. Т.к. при изменении количества параметров всё нужно перекомпилировать. Если нет такой возможности нужно иметь варианты для обратной совместимости.

Короткий инициализатор свойств - круто

Разный уровень доступа к свойствам.

Интересный вариант для совместной работы - это  partial class. Особенно важно, что в каждой части могут быть объявлены свои интерфейсы для реализации и можно друг другу не мешать.

На сегодня все.

пятница, 1 июня 2018 г.

Как найти русскую запятую? Переход с винды на мак.

Переходить с винды на мак плохо. Особенно плохо делать это посреди рабочего процесса. Все горячие клавиши другие, приходится переучиваться. Каждый раз при Ctrl+c Ctrl+v ничего не срабатывает. Сначала залипаешь, тупишь. Потом вспоминаешь, что это мак, ругаешься и перенажимаешь command+c command+v. Я думала, что самое сложное это запомнить переключение раскладки: Ctrl+space. Но оказалось, что это цветочки.

Я долго не понимала, как найти нужные функции программ, которые на винде вызывались правой кнопкой. В мак-мыши кнока всего одна.  Те действия, те меню, что раньше показывались по правому щелчку - есть ли они вообще здесь? Или их нет и не будет? Или они должны включаться по-другому? А если  должны включаться, то как? Два дня работы я мучалась. При поиске в браузере не могла открыть ссылку в новой вкладке. Не могла добавить файл в проект на вижл студии. Не могла добавить пакет нугет. Думала, что студия под мак поэтому и называется страшно урезанной. На третий день случайно открыла, что аналогом правой кнопки мыши тут является комбинация Ctrl+mouseclick. Работать стало легче. Но те вещи, что раньше делались одной рукой, стали требовать участия двух (чай стало пить неудобно, а т.к. напитки спасают глаза от переутомления, это серьёзный минус).

Самой поганой вещью оказалась небольшая рокировочка клавиатуры. Гады из эппл решили усложнить жизнь всем, кто пишет вслепую не только на английском, но и на русском  языке. Они поменяли места знаков препинания в русской раскладке. Вместо привычных точки и запятой стал вопросительный знак. А точка и запятая мигрировали на цифровой ряд. А те знаки препинания, что там были, все были перемешаны и поменяны местами, по сравнению с традиционными виндоус клавиатурами. Каждый раз при написании комментариев в коде приходится смотреть под пальцы, в поисках нужной клавиши. Как буду писать документацию вообще не представляю.

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

Я много читала жалобы пользователей мак на виндоус. Что якобы все непонятно, неудобно, а на маке все просто, ясно и любой разберется. Но переходить с видны на мак не менее болезненно. Все привычные вещи не работают. Все ни капельки не интуитивно, а заморочено и сложно. А красивая анимация при запуске и выключении программ перестаёт радовать уже на второй день пользования, примерно тогда, когда под рукой в нужный момент не оказывается привычных и удобных инструментов.

понедельник, 25 апреля 2016 г.

Столкновения в Bullet Physics

Мне необходимо найти точки удара твердого(btRigidBody) и мягкого(btSoftBody) тела.
BulletPhysisc.org объясняет, каким образом в движке реализован поиск столкновений. Для
того, чтобы найти столкновения между двумя телами, необходимо просмотреть все
столкновения, происходящие внутри dynamics_world. Это должно быть сделано в течение
текущего тика моделирования, т.к. контакты столкновения должны быть добавлены и
удалены в течение нескольких подтактов одного такта моделирования. При контакте
объектов можно получить программную обратную связь с помощью группы функций Contact
Callback.


ContactAddedCallback вызывается когда контакт добавлен к просмотру(заметьте, что один и
тот же контакт может быть добавлен много раз, прежде чем будет обработан). Внутри
реализации ContactAddedCallback можно модифицировать некоторые свойства тел(например,
трение) в точке соприкосновения. Заметьте, ContactAddedCallback не появляется в работе при
использовании многопоточных вычислений. Форма определения:

typedef bool (*ContactAddedCallback)(btManifoldPoint& cp, const btCollisionObjectWrapper*
colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId0,int index1);

где cp  точки соприкосновения;
colObj0Wrap, colObj1Wrap  ссылки на взаимодействующие объекты;
partId0, partId0, index0, index1  какието индексы.


Для того, чтобы выходное значение правильно обрабатывалось, необходимо возвращать
false, если не было расчитано трение. Для использования этого обратного вызова нужно
подсоединить файл btManifoldResult.h.

ContactProcessedCallback вызывается неизменно после того, как столкновение начнет
обрабатываться.
typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp,void* body0,void* body1);
cp  точка соприкосновения;
body0,body1  указатели на объекты столкновения (можно привести к btCollisionObject*).
ContactDestroyedCallback вызывается при аннулировании точки контакта.
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
Эти вызовы требуют подключения btPersistentManifold.h


Также есть btNearCallback, который дает объект типа btCollisionDispatcher.
typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);

где btNearCallback  тип функции обратного вызова;
collisionPair  это объект класса btBroadphasePair, который содержит ссылки на
взаимодействующие объекты и на алгоритм, описывающий их взаимодействие.
dispatcher  это объект класса btCollisionDispatcher, который содерижт указатели на возможные
алгоритмы обсчета столкновений, и, самое главное, в этом классе содержаться точки
столкновения и глубина взаимного прониковения объектов.
dispatchInfo  это объект класса btDispatcherInfo, который содержит вспомогательную
информацию.

Определение вызова находится в файле btCollisionDispatcher.h, для того, чтобы переопределить этот обратный вызов необходимо подключить данный заголовок. Я переопределила у себя ContactAddedCallback, и остальные обратные вызовы этой группы, но они не вызывались при контакте твердого и мягкого тела.

Обратный вызов btNearCallback вызывался при контакте твердого и мягкого тела, но точки  контакта оставались неизвестны.

Для твердых тел и ContactAddedCallback и btNearCallback работали замечательно.
Оказалось, что в алгоритме расчета столкновений твердых и мягких тел функция расчета
точек столкновения еще нереализована.


Итак, сейчас дела обстоят так, что обратный вызов при контакте двух тел(мягкого и
твердого) есть, видимое взаимодействие есть, но точки взаимодействия не записываются в
поле btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr и время столкновения тоже не расчитывается.


Продолжение следует.

среда, 6 апреля 2016 г.

Описание классов Collision Shapes

Отсюда. Отрывки. https://www.raywenderlich.com/53077/bullet-physics-tutorial-getting-started
Масса(mass). Масса - это очевидно масса объекта, но у нее есть другое, не так очевидное обозначение. В Bullet вы можете создать три типа объектов, разница в которых определяется их массой.
1. Масса статического объекта нулевая (mass = 0). Такой объект неподвижен. В игре, например, это граница.
2. Масса кинематического объекта также нулевая, но вы можете двигать это объект в коде, просто устанавливая его позицию и поворот. Объекты мира при моделировании не смогут его сдвинуть. В игре, например, это весло и кирпич.
3. Масса динамического объекта ненулевая. Вы двигаете объект при помощи приложения к нему силы. В игре, например, это мяч. Вы устанавливаете его направление и скорость и включаете физический движок. Когда мяч ударяется о границу или о кирпич, он будет отскакивать назад, но он никогда не изменит позицию границы, кирпича или весла, т.к. они неподвижны.

Выпуклый(convex) - это флаг, описывающий является ли текущий физический объект выпуклым или вогнутым. Необходимо всегда пытаться использовать выпуклые объекты, т.к. физический движок работает намного быстрее с ними. Можно разбить вогнутый объект на несколько выпуклых объектов. С момента создания вогнутых объектов нужно ставить флаг, т.к. работа движка будет отличаться.

Вы используете тег (tag) в обнаружения столкновений, чтобы определить, какие типы объектов столкнулись.

shape описывает форму физического тела. btCollisionShape является абстрактным классом, и есть несколько разных реализаций столкновения фигур. Например, можно описать форму объекта в виде сферы, используя btSphereShape или вы можете создать сложные формы с btBvhTriangleMeshShape указанием вершин треугольников, так же как при визуализации сложных объектов в OpenGL.

Создать корпус объекта можно с помощью готовых классов создания сфер, кубов(btBoxShape), btPolyhedralConvexShape() (многогранник), а можно задать по точкам (btConvexHullShape()).

Список классов создания корпуса объекта.

Классы создания корпуса объекта. 
btBox2dShape - это примитив квадрата вокруг начала координат, его оси сторон связаны с длиной, определенной полуразмерами в локальной системе координат. Когда используется как часть btCollisionObject or btRigidBody, это будет ориентированный квадрат в пространстве. Его размеры по оси Z = 0.

btBoxShape - это примитив куба вокруг начала координат, его оси сторон связаны с длиной, определенной полуразмерами в локальной системе координат. Когда используется как часть btCollisionObject or btRigidBody, это будет ориентированный куб в пространстве.

btBvhTriangleMeshShape - является фигурой из сетки статически-треугольной(static-triangle mesh shape), она может быть использована только для стационарных/недвижущихся объектов. Если требуется перемещение вогнутой сетки, рекомендуется выполнять выпуклую декомпозицию используя HACD, смотри Bullet/Demos/ConvexDecompositionDemo. Кроме того, вы можете использовать btGimpactMeshShape для перемещения вогнутой треугольной сетки. btBvhTriangleMeshShape имеет несколько оптимизаций, таких как иерархия ограничивающих объемов(bounding volume hierarchy) и кэш-фрэндли обход для PlayStation 3 ячейки СПУ(cache friendly traversal for PlayStation 3 Cell SPU). Рекомендуется включить useQuantizedAabbCompression для лучшего использования памяти. Принимают треугольные сетки в качестве входных данных, например btTriangleMesh или btTriangleIndexVertexArray. Класс btBvhTriangleMeshShape позволяет деформации сети с помощью метода refit или partialRefit. Вместо построения (the bounding volume hierarchy acceleration structure) структуры, также можно сериализовать (сохранить) и десериализировать(загрузить) структуры с диска. См. Demos\ConcaveDemo\ConcavePhysicsDemo.cpp для примера.

btCapsuleShape - представляет собой оболочку вокруг оси Y, (существует так же btCapsuleShapeX, выровненный вокруг оси X и btCapsuleShapeZ вокруг оси Z). Общая высота фигуры это height+2*radius, поэтому height - это только расстояние между центром каждой сферы на концах оболочки.
В btCapsuleShape является выпуклой оболочкой двух шаров. А btMultiSphereShape-это более общая форма столкновения, которая принимает выпуклую оболочку множественных сфере, поэтому она также может представлять собой капсулу, если задать только две сферы.

btCompoundShape позволяет хранить несколько других btCollisionShapes. Это позволяет двигать вогнутые объекты столкновения. Это более общие, чем статическая вогнутая сеть btBvhTriangleMeshShape. Он имеет (опционально) динамическое аавв дерево, чтобы ускорить тесты раннего отказа. В настоящее время удаление дочерних фигур поддерживается только при отключении опции аавв дерева (передать значение 'false в конструкторе btCompoundShape).

Класс btConcaveShape предоставляет интерфейс для неподвижных (статических) объектов вогнутой формы. Его реализуют btStaticPlaneShape, btBvhTriangleMeshShape и btHeightfieldTerrainShape.

btConeShape реализует примитивную форму конуса с центром в начале координат и на оси Y. Класс btConeShapeX выравнивается по оси X и btConeShapeZ вокруг оси Z.

btConvex2dShape позволяет использовать произвольные выпуклые фигуры как 2D выпуклой формы, где компонент Z полагается равным 0. Рекомендуется для btBox2dShape .

btConvexHullShape реализует создание неявный выпуклой оболочки из массива вершин.
Bullet предоставляет общие и быстрый детектор столкновений для выпуклых форм на основе GJK и EPA, используя localGetSupportingVertex.

btConvexTriangleMeshShape является выпуклой оболочки на основе треугольной сетки, но производительность не так хороша, как у btConvexHullShape. Малое преимущество этого класса в том, что он использует btStridingMeshInterface, так что вы можете избежать дублирования данных триангулированной сетки. Тем не менее, большинство пользователей должны использовать гораздо более производительный btConvexHullShape.

Класс btCylinderShape реализует примитивные формы цилиндра, с центром в начале координат. Его Центральная ось совмещена с осью у. btCylinderShapeX совмещена с осью X и btCylinderShapeZ вокруг оси Z.

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

воскресенье, 14 сентября 2014 г.

Заморочки или как работать когда не работается.

Недавно я прочитала пост "Энциклопедия заморочек творческого человека", и подумала, что нужно написать, что получается делать, когда делать ничего не хочется. С рукоделием все просто: если я не хочу ничего делать, то можно ничего и не делать. Рукоделие для меня - это бонус, это отдых. Но программирование - работа. Самая большая трудность в программировании сейчас - работа на дому. В офисе среди коллег приходится держать себя в руках, а вот дома ситуация расслабляющая. И когда работать не хочется, когда в голову не идут никакие мысли, я перво- наперво вытаскиваю себя к рабочему компьютеру. Затем заставляю себя его включить и дождаться, пока он загрузится. А затем начинаю делать работу, ту, которя достаточно тупая, чтобы думать по-минимуму. Например, начинаю простой рефакторинг, после которого не нужно все заново тестировать, но который позволяет сделать код более читаемым. Или чищу папку с билдами. Или пишу комментарии. Или пересматриваю код, нахожу нестыковки, над которыми нужно будет подумать. Те вещи, которые требуют хороших раздумий я не делаю. Если нахожу что-то, то записываю, что обнаружила, и иду дальше. И так до того момента, как не найду что-то, что меня зацепит и с чем я захочу повозиться побольше. Если такое нашлось, то значит я опять в рабочем режиме и можно жить дальше.

пятница, 5 сентября 2014 г.

Qt, пока все еще qt.

Бьюсь с qt creator за правильное расположение виджетов. Бой неравный. В первом раунде, при расположении horizontal layout, я выйграла. Все отображается как надо. Но победа оказалась добыта только после такого финта ушами, что ужас просто. Чтобы компоновщик заработал, его обязательно нужно включить через меню вызова компоновщика, при выделении нескольких объектов для компоновки. При том, что в дизайнере есть объект компоновщика на панели для перетаскивания. Но если просто его перетащить, то работать почему-то не будет. Ужас. Настроить компонтвщик для своих самодельных виджетов у меня пока так и не вышло. Они выравниваются вручную. Хорошо что я догадалась их поместить на одну панель. Панель из стандартных виджетов, поэтому она компоновщику подвластна.  Еще одна непонятная вещь -как вручную править horizontal header элемента table view. Примеры из интернета не хотят компилироваться. Он редактируется только через дизайнер. Так что, вопросов к qt пока намного больше, чем ответов.