2016-06-18 3 views
1

Как следует из названия, как создать массив numpy трехмерных координат геометрической формы?Создание массива чисел, представляющих геометрическую форму

В настоящее время у меня есть простая форма уже разобрались:

latva = 6 
latvb = 6 
latvc = 6 
latdiv = 20 
latvadiv = latva/latdiv 
latvbdiv = latvb/latdiv 
latvcdiv = latvc/latdiv 
lol = np.zeros((latdiv**3,4),dtype=np.float64) 
lol[:,:3] = (np.arange(latdiv**3)[:,None]//(latdiv**2,latdiv,1)*(latvadiv,latvbdiv,latvcdiv)%(latva,latvb,latvc)) 

создает массив (8000,4). Если вы затем разделите массив вдоль столбца 1,2,3 (игнорируя четвертый, поскольку в этом вопросе бессмысленно) и запишите его (лично, я использую pyplot), вы получаете куб!

Простой. Также работает для прямоугольника.

Но у меня нет туманной идеи о том, как получить дальнейшее развитие - скажем, о ромбе.

Меня не интересуют черная магия, как сферы, овалы или фигуры, стороны которых не меняются после линии. Просто такие вещи, как ваш стандартный ромб/ромбоид/параллелепипед/Whatever_you_want_to_call_it.

Любые идеи о том, как это сделать?

+0

Что такое pythonic abracadabra в последней строке, предназначенной для? Заполняет массив трехмерными координатами регулярных точек сетки внутри куба? На поверхности куба? По краям? – MBo

+0

@MBo Это объясняется здесь. http://stackoverflow.com/a/37780768/4999890 Извините, я не могу сделать ссылку на мобильный. – MadisonCooper

+0

три переменных не определены где-то latvadiv, latvbdiv, latvcdiv –

ответ

0

Поскольку у вас уже есть удобный способ создания точек в квадрате или кубе, самый простой способ сделать ромб, параллелограмм для 2D-случая и параллелепипеда для 3D-случая - применить аффинное преобразование для вычисления новых точечных координат.

Например, для создания ромба вы можете найти матрицу как комбинацию перевода (-centerX, -centerY), поворот на Pi/4, масштабирование по осям (при необходимости) и перевод в нужную позицию.

AffMatrix = ShiftMatrix * RotateMatrix * ScaleMatrix * BackShiftMatrix 
for each point coordinates: 
    (NewX, NewY) = (AffMatrix) * (X, Y) 

Ромбоид будет включать также сдвиговое преобразование.

Я думаю, что numpy имеет готовые к использованию процедуры для создания и комбинирования (умножения) аффинных матриц.