Разбиение куба (многомерного, в том числе в частности трёхмерного, двухмерного квадрата) на ячейки
на языке python:
# coding:utf-8
class CubeCells(object):
def __init__(self, **p_dict):
assert p_dict
p_intervals = [
(p_name, self._get_intervals(p))
for p_name, p in p_dict.iteritems()
]
self.p_intervals = p_intervals
self.p_dict = p_dict
def _get_intervals(self, p):
if len(p) <= 2:
return p
ret = []
for num in range(len(p) - 1):
interval = p[num:num + 2]
ret.append(interval)
return ret
def get_cells(self):
cells = []
p_name, intervals = self.p_intervals[0]
for interval in intervals:
cells.append([(p_name, interval)])
for p_name, intervals in self.p_intervals[1:]:
_cells = []
for interval in intervals:
for cell in cells:
_cells.append(cell + [(p_name, interval)])
cells = _cells
return cells
def get_cells_count(self):
count = 1
for p in self.p_dict.itervalues():
count *= (len(p) - 1)
return count
>>> p1 = [0, 0.5, 0.9, 1] >>> p2 = [0, 0.45, 1] >>> p3 = [0, 2, 5, 7, 50] >>> CubeCells(p1=p1, p2=p2, p3=p3).get_cells()
- это пример разбиения трехмерного куба со сторонами p1, p2, p3 на ячейки (p1, p2, p3 задают узлы разбиения.)
В результате вы получите интервалы ячеек:
{'p1': [0, 0.5], 'p2': [0, 0.45], 'p3': [0, 2]}
{'p1': [0, 0.5], 'p2': [0.45, 1], 'p3': [0, 2]}
{'p1': [0, 0.5], 'p2': [0, 0.45], 'p3': [2, 5]}
{'p1': [0, 0.5], 'p2': [0.45, 1], 'p3': [2, 5]}
{'p1': [0, 0.5], 'p2': [0, 0.45], 'p3': [5, 7]}
{'p1': [0, 0.5], 'p2': [0.45, 1], 'p3': [5, 7]}
{'p1': [0, 0.5], 'p2': [0, 0.45], 'p3': [7, 50]}
{'p1': [0, 0.5], 'p2': [0.45, 1], 'p3': [7, 50]}
{'p1': [0.5, 0.9], 'p2': [0, 0.45], 'p3': [0, 2]}
{'p1': [0.5, 0.9], 'p2': [0.45, 1], 'p3': [0, 2]}
{'p1': [0.5, 0.9], 'p2': [0, 0.45], 'p3': [2, 5]}
{'p1': [0.5, 0.9], 'p2': [0.45, 1], 'p3': [2, 5]}
{'p1': [0.5, 0.9], 'p2': [0, 0.45], 'p3': [5, 7]}
{'p1': [0.5, 0.9], 'p2': [0.45, 1], 'p3': [5, 7]}
{'p1': [0.5, 0.9], 'p2': [0, 0.45], 'p3': [7, 50]}
{'p1': [0.5, 0.9], 'p2': [0.45, 1], 'p3': [7, 50]}
{'p1': [0.9, 1], 'p2': [0, 0.45], 'p3': [0, 2]}
{'p1': [0.9, 1], 'p2': [0.45, 1], 'p3': [0, 2]}
{'p1': [0.9, 1], 'p2': [0, 0.45], 'p3': [2, 5]}
{'p1': [0.9, 1], 'p2': [0.45, 1], 'p3': [2, 5]}
{'p1': [0.9, 1], 'p2': [0, 0.45], 'p3': [5, 7]}
{'p1': [0.9, 1], 'p2': [0.45, 1], 'p3': [5, 7]}
{'p1': [0.9, 1], 'p2': [0, 0.45], 'p3': [7, 50]}
{'p1': [0.9, 1], 'p2': [0.45, 1], 'p3': [7, 50]}