Разбиение куба (многомерного, в том числе в частности трёхмерного, двухмерного квадрата) на ячейки

на языке 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]}