任意维度无限体的交集

3 投票
1 回答
843 浏览
提问于 2025-04-16 22:30

我需要一些代码、文本、谷歌关键词或者其他资源来实现这个类。速度不是重点,主要是它应该能适用于任意数量的维度。

class InfiniteVolume: # such as a point, line, plane, volume, 4d-volume
    def __init__(self, points): # two points for line, three points for plane, etc.
        self.points = points
        assert all(len(p)==len(points[0]) for p in points)

    def vdim(self): # Dimensions of the volume. For example 2.
        return len(self.points)-1

    def wdim(self): # Dimensions of the world.  For example 3.
        return len(self.points[0])

    def __contains__(self, point):
        # ???

    def intersect(self, other):
        assert self.wdim() == other.wdim()
        # ???

1 个回答

6

你想要表示一个N维空间,这个空间嵌套在一个M维空间里。举个例子,当N=2,M=3时,这就相当于在一个三维的“世界”里有一个平面。

你可以定义一组点来表示这个空间,但更自然的方式是用一组线性方程或者基向量来表示,所以这应该是你实现的基础。如果你使用基向量,那么会有N个。如果你使用方程,每个方程会减少一个维度,所以会有M-N个方程。

要找到两个这样的子空间的交集,你只需把它们的集合结合起来,然后简化(得到一组线性无关的向量或方程)。交集的维度可以是从零到N的任何值。

这些技巧很简单,也很常见,属于线性代数的范畴。

编辑:
我觉得处理基向量是最简单的。

  1. 用这些点来获取基向量。
  2. 用基向量找到正交空间的基向量(比如如果这个空间是一条二维的线,正交空间就是一条垂直的线;如果是三维的线,正交空间就是与这条线垂直的一个平面;如果是三维的平面,正交空间就是与这个平面垂直的一条线)。
  3. 如果你愿意,从正交空间的向量中得到这个空间的方程是很简单的。
  4. 要得到两个空间的交集,先把它们的基结合起来,然后简化为一个基。找到一个共同点,你就完成了。

撰写回答