Разбиение куба (многомерного, в том числе в частности трёхмерного, двухмерного квадрата) на ячейки
на языке 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]}