std::optional<int>
. Тогда в вызывающем коде можно проверить, что int нашелся. В идеале, конечно, надо бы и все ошибки обробатвать. Если число не распарсилось, то надо выдать ошибку в лог и вернуть nullopt. Circles: 1.48417ms found 369434 intersections
Squares: 1.58796ms found 429860 intersections
Нет, у меня используются координаты центра:
Убедили, это читерство. Тогда давайте предположим, что объекты могут двигаться, растягиваться и поворачиваться, - по стандарту 2D игр.
Как вы его закэшируете, если оно изменяется каждый кадр? Никак.
Хорошо, умножьте обе части неравенства на 2. Теперь остались только целые числа, как вы и хотели.
Почему неправильно? Каких ошибок?
Возможно, ваша любимая игра на телефоне тормозит, именно потому что я когда-то неправильно посчитал радиус.
Это кеш расстояния столкновения. Я закэшировал все данные, кроме позиции юнита, как вы и предлагали, чтобы избавиться от "читинга".
unit1.leftBorder <= unit2.rightBorder && unit2.leftBorder <= unit1.rightBorder && unit1.topBorder <= unit2.bottomBorder && unit2.topBorder <= unit1.bottomBorder;
закеширую?Ага, 7 - 5 = 2.5, всегда из int получаю float при сложении)
Вы, видимо, мало работали в геймдеве. Нет принципиальной разницы между координатами центра или угла. Это легко доказать, т.к. смещение системы координат не влияет на метрику (длину ветров/расстояние между точками).
A && B && C &&D
в A & B & C & D
выключит эту оптимизацию.потому что квадрат целого числа даёт целое число.
У вас 4 случая для оси Ox, т.е. 10 операций
max(x1l,x2l) <= min(x1r, x2r)
тут эквивалентно x1l <= x2r && x2l <= x1r
.x1l <= x2r && x2l <= x1r && y1l <= y2r && y2l <= y1r
. 7 самых быстрых операций. Всего 7 тактов.можно увидеть и вызовы функции, и сортировку, и промежуточные сложения, и дерево ветвлений.