我需要代码/文本/谷歌关键字/其他资源来实现这个类。速度并不重要。它应该适用于任何维度
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()
# ???
您试图表示嵌入在m维空间中的n维空间。例如,(N=2, M=3)是三维"世界"中的一个平面。
如果你愿意,你可以实现一个定义点的集合,但是表示这样一个子空间的自然方式是用一组线性方程或基向量,所以这应该是基本的实现。如果你用基向量,有N个。如果你使用方程,每一个都减少1个维数,所以有M-N个。
要找到两个这样的子空间的交点,你只需要将它们的集合组合起来,并简化(到一组线性无关的向量或方程)。交点的维数可以是0到n之间的任意数
这些技术是直接和众所周知的,并且属于线性代数的标题。
编辑:
我认为处理基向量是最简单的。
- 使用点来获得基向量。
- 使用基向量求正交空间的基向量(例如,如果空间是二维的直线,那么正交空间就是一条垂直线;如果空间是三维的直线,那么正交空间就是一条垂直于直线的平面;如果空间是三维的平面,那么正交空间就是一条垂直于平面的直线)。
- 如果你愿意,从正交空间的向量中得到空间的方程是很简单的。
- 要得到两个空间的交点,取它们的基并并,并约为一个基。求出一个公点,就完成了。