Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2012 01:55:26

boltayka
От:
Зарегистрирован: 2009-10-07
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

Здравствуйте.
Есть 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)

Офлайн

#2 Дек. 2, 2012 09:36:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

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

Мой вольный перевод вашего описания:
Перевод 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
числа могут быть одинаковыми
см выше так никто и предполагает что они разные.



Отредактировано doza_and (Дек. 2, 2012 09:48:10)

Офлайн

#3 Дек. 2, 2012 11:42:29

boltayka
От:
Зарегистрирован: 2009-10-07
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

Простите, писал в пятом часу утра (ночи?). Мог совсем непонятно объяснить. Первый перевод близок к тому, что мне надо. Но надо, чтобы цифры уменьшались пропорционально…

На деле будет работа с 3D.
Чтобы было понятнее, нарисовал ниже некое подобие иллюстрации. (размеры не соответствуют, числа писал от фонаря)
рис.1 — исходная фигура. 30х16х20.
рис.2 — параллелепипед (10х8х9), в который ее надо вписать. При этом, уменьшая фигуру, надо сохранить пропорции сторон (масштаб я уже высчитывал отдельно).

Отредактировано boltayka (Дек. 2, 2012 11:43:42)

Прикреплённый файлы:
attachment Безымянный.png (3,6 KБ)

Офлайн

#4 Дек. 2, 2012 12:38:35

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

boltayka
фигуры можно вращать?

Офлайн

#5 Дек. 2, 2012 12:49:08

boltayka
От:
Зарегистрирован: 2009-10-07
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

adray, там и вращать-то ничего не надо.
Вот пример: http://i.materialise.com/3dprintlab/instance/bbec6412-7823-45cb-8953-287426fabb7d
и небольшая (648байт) модель для запуска примера. Там есть блок Scale, если его значения будут превышать максимум, то выдаст ошибку

Офлайн

#6 Дек. 2, 2012 13:11:40

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

Без вращения:

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 и возвращается булев вектор.

Судя по задаче, отмасштабированная модель должна вписываться в некий кусок заготовки, так что вращать надо

Офлайн

#7 Дек. 2, 2012 13:30:49

boltayka
От:
Зарегистрирован: 2009-10-07
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

adray, супер. Очень благодарен! Делает не до конца, но понятно, куда дальше плясать.
Единственное что, хочется все же понять, что делают map и lambda. all я убрал.

Офлайн

#8 Дек. 2, 2012 14:27:51

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

(x y z) в заданных пределах

map возвращает коллекцию, полученную в результате применения функции (поэлементно), заданной в первом аргументе к коллекции(ям), заданной(ым) в следующих аргументах. Количество аргументов заданной ф-ии должно совпадать с количеством коллекций.

Советую почитать на эту тему учебник или доки - там есть много полезных фич.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version