Найти - Пользователи
Полная версия: (x y z) в заданных пределах
Начало » Python для новичков » (x y z) в заданных пределах
1
boltayka
Здравствуйте.
Есть 3 числа (x, y, z) и три максимальных значения (например: 20, 15, 10). Естественно, надо соблюдать пропорции при уменьшении чисел.
Нужно, чтобы x y z не выходили за пределы максимума. Все, казалось бы, легко. Только есть 3 но:

0) массив x y z может быть не сортированным (51, 22, 33)
1) сортировать его нельзя
2) числа могут быть одинаковыми.

Помогите, а то над алгоритмом уже всю голову сломал. Спасибо
doza_and
:) Присказка.
Прибегает ко мне чел и говорит, ваша программа ломается. Мы что не так? …… Пол часа объяснений…….
И наконец “Ну блин не могу объяснить что не так. Сделайте так чтобы мне было хорошо.”

Мой вольный перевод вашего описания:
Перевод 1:
Напишите функцию принимающую два массива из трех значений x,xMax и возвращающую x покомпонентно ограниченные сверху значениями xMax.
Решение:
def limit_by_upper_bound(x,xMax):
     return numpy.min([x,xMax],axis=0)
Перевод 2:
Напишите функцию принимающую вектор x, и вектор xMax и возвращающую вектор x1 сонаправленный с вектором x и лежащий внутри гиперпараллепипеда одна из вершин которого xMax. xMax>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)

Извините я проигнорировал требование чтобы компонент вектора было 3. Если надо добавьте проверки.

Почему мне трудно понять постановку задачи:
boltayka
Нужно, чтобы x y z не выходили за пределы максимума
Эти переменные даны на входе. Нужно в данном контексте это ваше огорчение или радость что они подходят под условие или нет и ничего не объясняет по поводу того что должно быть результатом программы.
упомянут один максимум а строкой выше их 3 - как это понимать?
boltayka
массив x y z может быть не сортированным
так никто и предполагает что он сортированный. Это вы должны дополнительно указать если он будет сортированный.
boltayka
сортировать его нельзя
почему нельзя? Внутри функции можно делать все что заблагорассудится. Мы должны удовлетворить внешним спецификациям те что на входе и что изменится во внешнем мире. Да собственно никто и не жаждет их сортировать.
boltayka
числа могут быть одинаковыми
см выше так никто и предполагает что они разные.
boltayka
Простите, писал в пятом часу утра (ночи?). Мог совсем непонятно объяснить. Первый перевод близок к тому, что мне надо. Но надо, чтобы цифры уменьшались пропорционально…

На деле будет работа с 3D.
Чтобы было понятнее, нарисовал ниже некое подобие иллюстрации. (размеры не соответствуют, числа писал от фонаря)
рис.1 — исходная фигура. 30х16х20.
рис.2 — параллелепипед (10х8х9), в который ее надо вписать. При этом, уменьшая фигуру, надо сохранить пропорции сторон (масштаб я уже высчитывал отдельно).
adray
boltayka
фигуры можно вращать?
boltayka
adray, там и вращать-то ничего не надо.
Вот пример: http://i.materialise.com/3dprintlab/instance/bbec6412-7823-45cb-8953-287426fabb7d
и небольшая (648байт) модель для запуска примера. Там есть блок Scale, если его значения будут превышать максимум, то выдаст ошибку
adray
Без вращения:
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
если нужно узнать, по каким осям не вписывается, убираем all и возвращается булев вектор.

Судя по задаче, отмасштабированная модель должна вписываться в некий кусок заготовки, так что вращать надо
boltayka
adray, супер. Очень благодарен! Делает не до конца, но понятно, куда дальше плясать.
Единственное что, хочется все же понять, что делают map и lambda. all я убрал.
adray
map возвращает коллекцию, полученную в результате применения функции (поэлементно), заданной в первом аргументе к коллекции(ям), заданной(ым) в следующих аргументах. Количество аргументов заданной ф-ии должно совпадать с количеством коллекций.

Советую почитать на эту тему учебник или доки - там есть много полезных фич.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB