Форум сайта python.su
0
Здравствуйте.
Есть 3 числа (x, y, z) и три максимальных значения (например: 20, 15, 10). Естественно, надо соблюдать пропорции при уменьшении чисел.
Нужно, чтобы x y z не выходили за пределы максимума. Все, казалось бы, легко. Только есть 3 но:
0) массив x y z может быть не сортированным (51, 22, 33)
1) сортировать его нельзя
2) числа могут быть одинаковыми.
Помогите, а то над алгоритмом уже всю голову сломал. Спасибо
Отредактировано boltayka (Дек. 2, 2012 02:33:58)
Офлайн
253
:) Присказка.
Прибегает ко мне чел и говорит, ваша программа ломается. Мы что не так? …… Пол часа объяснений…….
И наконец “Ну блин не могу объяснить что не так. Сделайте так чтобы мне было хорошо.”
Мой вольный перевод вашего описания:
Перевод 1:
Напишите функцию принимающую два массива из трех значений x,xMax и возвращающую x покомпонентно ограниченные сверху значениями xMax.
Решение:
def limit_by_upper_bound(x,xMax): return numpy.min([x,xMax],axis=0)
import numpy as np import assert def limit_by_upper_bound(x,xMax): assert(np.min(xMax)>0) k=np.min(np.abs(x)/xMax) if k>1: return np.array(x)/k else: return np.array(x)
boltaykaЭти переменные даны на входе. Нужно в данном контексте это ваше огорчение или радость что они подходят под условие или нет и ничего не объясняет по поводу того что должно быть результатом программы.
Нужно, чтобы x y z не выходили за пределы максимума
boltaykaтак никто и предполагает что он сортированный. Это вы должны дополнительно указать если он будет сортированный.
массив x y z может быть не сортированным
boltaykaпочему нельзя? Внутри функции можно делать все что заблагорассудится. Мы должны удовлетворить внешним спецификациям те что на входе и что изменится во внешнем мире. Да собственно никто и не жаждет их сортировать.
сортировать его нельзя
boltaykaсм выше так никто и предполагает что они разные.
числа могут быть одинаковыми
Отредактировано doza_and (Дек. 2, 2012 09:48:10)
Офлайн
0
Простите, писал в пятом часу утра (ночи?). Мог совсем непонятно объяснить. Первый перевод близок к тому, что мне надо. Но надо, чтобы цифры уменьшались пропорционально…
На деле будет работа с 3D.
Чтобы было понятнее, нарисовал ниже некое подобие иллюстрации. (размеры не соответствуют, числа писал от фонаря)
рис.1 — исходная фигура. 30х16х20.
рис.2 — параллелепипед (10х8х9), в который ее надо вписать. При этом, уменьшая фигуру, надо сохранить пропорции сторон (масштаб я уже высчитывал отдельно). 
Отредактировано boltayka (Дек. 2, 2012 11:43:42)
Прикреплённый файлы:
Безымянный.png (3,6 KБ)
Офлайн
18
boltayka
фигуры можно вращать?
Офлайн
0
adray, там и вращать-то ничего не надо.
Вот пример: http://i.materialise.com/3dprintlab/instance/bbec6412-7823-45cb-8953-287426fabb7d
и небольшая (648байт) модель для запуска примера. Там есть блок Scale, если его значения будут превышать максимум, то выдаст ошибку
Офлайн
18
Без вращения:
def is_included(box, into_box): return all(map(lambda x1, x2: x1 < x2, box, into_box)) box_max = (10, 123, 11) box_scaled = (12, 12, 10) is_included(box_scaled, box_max) >>False
Офлайн
0
adray, супер. Очень благодарен! Делает не до конца, но понятно, куда дальше плясать.
Единственное что, хочется все же понять, что делают map и lambda. all я убрал.
Офлайн
18
map возвращает коллекцию, полученную в результате применения функции (поэлементно), заданной в первом аргументе к коллекции(ям), заданной(ым) в следующих аргументах. Количество аргументов заданной ф-ии должно совпадать с количеством коллекций.
Советую почитать на эту тему учебник или доки - там есть много полезных фич.
Офлайн