Я хочу разработать формулу, которую можно будет использовать в базовом коде для следующих сценариев.
d = distance
bw = block width
mw = mortar width
b = number of blocks
сколько блоков b (или его части) находится в d, если между каждым блоком есть раствор, но в конце последнего блока может быть раствор, а может и не быть.
сценарии по формуле b = d/(bw + mw)
d = 480
bw = 230
mw = 10
b будет равно 2, это правильно.
d = 470
bw = 230
mw = 10
b будет равно 1,958, это неверно, оно все равно должно равняться 2, поскольку мне нужно знать только количество блоков.
d = 595
bw = 230
mw = 10
b будет равно 2,479, это неверно, оно должно равняться 2,5, так как мне нужно знать только количество блоков, не считая дробной части раствора.
Я использую ArchiCAD gdl (я добавлю тег), но немногие его используют. Рад за Visual Basic, так как я могу конвертировать.
Как оно может быть равно 2,5, если нужно знать количество блоков? Означает ли 0,5 половину квартала? Если да, то почему не 0,479 блока?
Я в порядке, если в ответе есть десятичная дробь. Это не обязательно должны быть целые блоки. Но 230 + 10 + 230 + 10 + 115 = 595 и имело ровно 2,5 блока, а не 2,479, как дает моя формула.
Я проголосовал за повторное открытие, потому что речь определенно идет о программировании - ОП использует язык программирования GDL, который отмечен тегами, и сказал, что решение на языке программирования Basic также будет приемлемым. Существует алгоритм, участвующий в вычислении решения, и, очевидно, речь идет о программировании.
Поскольку он закрыт, я не могу опубликовать ответ, но здесь вы можете найти решение на языке Basic: jdoodle.com/ia/1fxf. Нажмите кнопку «Выполнить», чтобы увидеть доказательство.
На что вы хотите, чтобы был ответ d = 235
? Это один кирпич плюс 5 мм раствора (так b = 1
), или всегда должно быть по кирпичику с каждого конца? В последнем случае это будет 10 мм раствора посередине и 112,5 мм кирпича с каждой стороны (итак b = 0.978
).
спасибо @k314159. если d=235, я бы хотел, чтобы оно было равно 1.
@ k314159, пропустил твой jdoodle раньше. Да, ваш код подходит для нужного мне решения, спасибо.
Используйте следующую измененную формулу: b = int ((d + bw) / (bw + mw))
.
.
В int(X)
функция int
округляет до наибольшего целого числа, меньшего или равного X.
С д = 480; чб = 230; мв = 10
Before INT() After INT()
( 0 + 230) / (230 + 10) = 0
( 10 + 230) / (230 + 10) = 1 \
( 20 + 230) / (230 + 10) = 1.042 |
( 30 + 230) / (230 + 10) = 1.083 |
... | 1 brick for d = [10,240]
(220 + 230) / (230 + 10) = 1.875 |
(230 + 230) / (230 + 10) = 1.917 |
(240 + 230) / (230 + 10) = 1.958 /
(250 + 230) / (230 + 10) = 2 \
(260 + 230) / (230 + 10) = 2.042 |
(270 + 230) / (230 + 10) = 2.083 |
... | 2 bricks for d = [250,480]
(460 + 230) / (230 + 10) = 2.875 |
(470 + 230) / (230 + 10) = 2.917 |
(480 + 230) / (230 + 10) = 2.958 /
(490 + 230) / (230 + 10) = 3 \
(500 + 230) / (230 + 10) = 3.042 |
(510 + 230) / (230 + 10) = 3.083 |
... |
(595 + 230) / (230 + 10) = 3.438 | 3 bricks for d = [490,720]
... |
(700 + 230) / (230 + 10) = 3.875 |
(710 + 230) / (230 + 10) = 3.917 |
(720 + 230) / (230 + 10) = 3.958 /
Чтобы определить длину последнего частичного кирпича:
PartialBrick = d - ((b - 1) * (bw + mw))
например. Для расстояния 595 (b=3) получаем 595 - ((3 - 1) * (230 + 10))
, что составляет всего 115 или полкирпича. Таким образом, потратив 3 кирпича, вы фактически израсходуете 2,5 кирпича.
Оператору нужны доли блока. Просто хотят исключить воздействие миномета на финальный блок. Таким образом, d=7 b=2 m=1 должно давать 2,5, но сейчас они получают 2,333.
Спасибо @Сеп Роланд. Наставил меня на правильный путь. Я заменил code PartialBrick = d - ((b - 1) * (bw + mw))
на code if d - (b * (bw + mw)) > 0 then final_bricks = b + (d - (b * (bw + mw))) / bw' else final_bricks = b
# integer division to calculate whole blocks
whole_blocks = d // (bw + mw)
# deduct whole blocks from distance
remaining_space = d - whole_blocks * (bw + mw)
# divide remaining space by block width to get partial blocks
# if greater than 1, reset to 1 (the rest will be mortar)
# then add to whole blocks
final_blocks = whole_blocks + min(remaining_space / bw, 1)
Я не думаю, что d - whole_blocks * (bw + mw)
может быть отрицательным, поэтому вам следует упростить свой код.
@ k314159 Согласен, это пережиток предыдущего (неправильного) кода. Когда я изменил это, мне следовало изменить и это.
Спасибо @MatBailie. Однако если d=235, bw=230 и mw=10. Ответ будет 1,022, поскольку он вычисляет десятичную дробь миномета, что мне не нужно. Это должно быть = 1.
@mark Вы используете целочисленное деление на первом этапе? Этот ответ должен давать 0 для целых блоков, 235 для оставшегося места и 1 для последних блоков.
@Марк, я протестировал код Мэта, и кажется, он работает так, как ты хочешь. В этом ответе используется синтаксис Python, который вы можете перевести на GDL. //
— это целочисленное деление, т. е. оно округляет результат до ближайшего целого числа. Посмотрите, как он работает: onecompiler.com/python/42qyjagty
@ k314159, моя вина, я понял, что это целочисленное деление, но оно было неправильно рассчитано вручную, я думаю, что это хорошее решение, спасибо вам обоим.
Мне кажется, вам нужно целочисленное деление и, возможно, оператор модуля, но вам нужно пометить язык, поскольку синтаксис может различаться.