Snusmumriken
Перебор зависимостей.
Egor
Перебор зависимостей.
перебор смысле - слишком много или перебор - имеется в виду перебирать?
Snusmumriken
Первое.
Egor
ну как бы, это такие вот функции, которые нужны на многих местах, как вариант можно просто копипастить... но не тру же
Snusmumriken
Библиотека это набор функций определённой категории. В наборе от luapower есть "вспомогательная" либа glue: https://luapower.com/glue, правда тут намешано всё подряд.
Snusmumriken
А так — local str = require'strhelper' local tbl = require'tblhepler' local t = str.split('mama mia', ' ') -- условно сортируем по длине строк tbl.strsort(t, '#')
Snusmumriken
Делать библиотеку на одну функцию — плодить вот такое: https://habr.com/ru/post/280099/ Так что категоризируем, ребята, категоризируем. И ручками объединяем в нормальные библиотеки.
Anonymous
Для сишки есть амальгаматоры конечно
Anonymous
Но не для библиотек
Anonymous
По крайней мере я только с прикладным кодом такое видел
Egor
А в луа действительно нету round? и каждый реализует как может?
Egor
А для чего он нужен ?
округление с определенной точностью.. короче у меня простол проблема с луа. в цикле либо суммирую либо вычитаю с нуля 0.2 и когда число доходит до 0.4 и делаю вычитание, и выходит какое-то несуразное число в виде 0.09и_овердофига_чисел. Почему не 0.2? И подумал что смогу себе помочь округлением
Mark ☢️
Ну дофига 9к и чо
Mark ☢️
Может тебе надо работать с целыми числами а когда надо делить на 10 ?
Egor
А проблема то в чем ?
Мне нужно, чтобы было 0.4 02. 0.0 и тд
Mark ☢️
Мне нужно, чтобы было 0.4 02. 0.0 и тд
Флоатинг поинт он такой. Не все числа можно в нем хранить точно
Mark ☢️
деление целого может помочь?
С накоплением погрешности точно поможет
Serezha
Забей это во всех языках одинаково стандарт IEEE 754
Serezha
Форматировать при печати или передаче в JSON нужно а не округлять
Egor
Форматировать при печати или передаче в JSON нужно а не округлять
как форматировать? Я просто всегда кидал роунд и не парился
Egor
или принтф делал.
Serezha
string.format("%.2f",123.2375)
Serezha
Он не может 0.1999999999999 округлить до точно 0.2
Serezha
Просто при печати на экран автоматически обычно форматится с некотрым округлением и ты не знаешь что в памяти не 0.2 а 0.19999..999
Ivan
https://0.30000000000000004.com/
Ivan
Забей это во всех языках одинаково стандарт IEEE 754
не во всех — https://docs.perl6.org/language/numerics#Rat
🐅🤦‍♂️
А для чего он нужен ?
Отбрасывает дробную часть вроде.
Serezha
https://0.30000000000000004.com/
Вооооу! Ваще тема
Maxim
Вооооу! Ваще тема
Для решения вашей задачки есть один подход, в определенных условиях этот подход возможен к применению для достижения необходимого результата. Представьте что у вас нет функции округления, ну или условия задачи запрещают использовать эту функцию, представили? А теперь решение, готовы?
Maxim
Превратите float в integer, проведите необходимые вычисления, превратите integer в float
Snusmumriken
https://0.30000000000000004.com/
У меня из-за этого пиление многоугольников не получалось. Пришлось округлять до интов.
Snusmumriken
(типа, реакция на самописный ивент пеоесечения грани полигона, можно заметить что время от времени ивент не срабатывает)
Snusmumriken
Ну, то есть оно далеко не каждый раз нормально определяло выход точки за границы полигона из-за ошибок округления. То как оно должно работать, с округлениями — вот тут (а ещё тут автоуменьшение сложности полигонов).
Egor
Помогите, я чет ппц туплю. Есть кораблик, знаю его скорость - speed, знаю время за которое он достигнет какой-то точки - td, знаю через сколько торможение остановит мой кораблик - tb и могу давать тягу Делаю так if td<=tb+30 then -- +30 это чтоб наверняка осталось времени на торможение brakeStart() stopEngine() else startEngine() -- даю тягу, чтобы долетел быстрее brakeStop() end Но проблема, когда до места назначения остаются считанные километры, то я тащусь кое-как до точки, иногда с скоростью менее 1км. Как сделать так, чтобы торможение отключались, если скорость меньше определенного значения?
Egor
PS: спал три часа и кофе кончилось (
🐅🤦‍♂️
Если не сложно, то собери и выложи минимальный рабочий пример. Мне непонятно, как ты можешь знать время, за которое кораблик достигнет определенной точки. Ты надеюсь не высчитывал это временя деля расстояние между кораблем и точкой назначения на скорость движение? Ведь если ты начинаешь менять скорость, то и время прибытия меняется.
Egor
Во-первых, что с форматированием? Ты прямо копипастил из кода? Почему всё настолько криво? ))
if alignToObject:timeToArrival(self.distance, self.speed) <= (brakeTime(150000):getTime() + 30) then Nav.thrustManager:resetThrottle() Nav.brake[1] = 1 else Nav.thrustManager:updateCommand(0.05) Nav.brake[1] = 0 end Вот код
Egor
точнее кусочек кода.
Egor
какой ужас -_-
Snusmumriken
Ну типа в таком виде оно влезет в т.ч. в экраны телефонов, чтобы даже телефоноюзеры могли примерно прикинуть что не так (тут есть мелкие правки от снуса, чтобы кодить было проще) -- +30 это чтоб наверняка -- осталось время на торможение local td = self:timeToArrival(object) if td <= tb + 30 then self:stopEngine() self:brakeStart() else -- даю тягу, чтобы долетел быстрее self:startEngine() self:brakeStop() end Во-вторых, псевдокод выглядит лучше чем код, можно было бы код сделать таким же.
Egor
Ну типа в таком виде оно влезет в т.ч. в экраны телефонов, чтобы даже телефоноюзеры могли примерно прикинуть что не так (тут есть мелкие правки от снуса, чтобы кодить было проще) -- +30 это чтоб наверняка -- осталось время на торможение local td = self:timeToArrival(object) if td <= tb + 30 then self:stopEngine() self:brakeStart() else -- даю тягу, чтобы долетел быстрее self:startEngine() self:brakeStop() end Во-вторых, псевдокод выглядит лучше чем код, можно было бы код сделать таким же.
Спасибо, я понял о каком форматировании ты говорил. А код, он будет еще рефакториться, сейчас просто разбил на несколько модулей, которые будут универсально подходить на любые типы транспорта. И да, напоминаю, я не пишу игру. Я просто пишу "мод" (сама игра дает автоматизировать с помощью луа многие вещи).
🐅🤦‍♂️
А, если ты моддишь, то другое дело. Я думал ты сам физику движения писал.
Snusmumriken
Уууу, а я уже начал расписывать архитектуру. Что за игрушка-то?
Egor
А, если ты моддишь, то другое дело. Я думал ты сам физику движения писал.
не, работаю с уже готовыми данными, но они для меня, нематематика, что сырые данные.
Egor
eve online + спейс инженеры
Snusmumriken
Так, тут нормальная космическая физика? Разгоняться можно до неограниченных скоростей?
Mark ☢️
Отбрасывает дробную часть вроде.
А вот и нет. Именно что округляет по правилам округления
Egor
Сейчас написал "автопилот", который бы доставил меня на другую планету, все работает, кроме этого, что до самой точки назначения, слишком медленно лечу. Т.е. разгон/торможение отрабатывает, но на последних милях слишком маленькая скорость
Snusmumriken
А вот и нет. Именно что округляет по правилам округления
Ага, round(1.4) --> 0; round(1.5) --> 2 Отбросить — это floor, например. Или num % 1
Egor
Так, тут нормальная космическая физика? Разгоняться можно до неограниченных скоростей?
есть инерция, т.е. разогнался и если нет гравитации то летишь прямо и без двигателя, но верхняя планка ограничена в 30000км/ч
Egor
но это в вакууме (космосе), на планете есть как гравитация и сопротивление атмосферы, ( но это другая тема)
Snusmumriken
А тормозит оно с какой скоростью? С такой же как разгоняется?
🐅🤦‍♂️
А вот и нет. Именно что округляет по правилам округления
Путаю постоянно. Приходится записывать
Egor
А тормозит оно с какой скоростью? С такой же как разгоняется?
нет, тормозные двигатели, они другие, т.е. они даю другую тягу, конечно можно развернуться и маршевыми движками тормозить + тормозными, но для меня такую логику сложно описать.
Snusmumriken
Потому что в нормальной космической физике, самое эффективное — пол пути разгоняться маршевыми двигателями, а потом развернуться двиглами вперёд, и оставшиеся пол пути теми же маршевыми тормозить ))
Egor
так, кто может толкнуть в правильную мысль? )
Snusmumriken
А во-вторых, у тебя погрешность вот в этом "+30", то есть точно вычисли время на торможение.
Egor
с учетом массы корабля и тяги, которая дает тормозной движок
Snusmumriken
brakeTime(150000):getTime() Что тут за 150000?
Egor
brakeTime(150000):getTime() Что тут за 150000?
Это сила в ньютонах , который дает тормозной движок.
Egor
function brakeTime:getTime() local shipMass = core.getConstructMass() local speed = vec3(core.getWorldVelocity()):len() local c = 8333 --F = 150000 -- brake newtons return shipMass * c / self.F * math.asin(speed / c) end
Egor
c = это магическая скорость, как "скорость света"
Egor
т.е. максимальная скорость в м/с в игре
Snusmumriken
Жуть. В общем, как ни странно, оно примерно корректно, так что попробуй убрать +30 и проверить константы.
Egor
А что если сделать еще и так: -- +30 это чтоб наверняка -- осталось время на торможение local td = self:timeToArrival(object) if td <= tb + 30 then self:stopEngine() if speed <= 15000 then self:brakeStart() end else -- даю тягу, чтобы долетел быстрее self:startEngine() self:brakeStop() end
Egor
сделал так и так, буду пробовать