3d 如何从5个曲面点中获取超球面中心点?

3d 如何从5个曲面点中获取超球面中心点?,3d,geometry,4d,3d,Geometry,4d,我试图在四维空间中实现一个voronoi采样器,这应该是一个非常简单的任务,但是选择一个好的起点分布,由于分布不均匀,有时会产生一些非常倾斜的voronoi单元(我接受关于如何生成均匀随机点散射的建议) 因此,我开始研究产生质心voronoi细胞的情况,并在标题问题上绊倒。我从一个假设开始,我们可以定义一个4D超球面,由五个曲面点组成 我甚至得到了一些代码,从三维空间的三个点中生成一个三维球体中心点(在这种情况下,这些点总是在球体的赤道上),我分享了这些代码。我还设法找到了从四个曲面点中找出三维

我试图在四维空间中实现一个voronoi采样器,这应该是一个非常简单的任务,但是选择一个好的起点分布,由于分布不均匀,有时会产生一些非常倾斜的voronoi单元(我接受关于如何生成均匀随机点散射的建议)

因此,我开始研究产生质心voronoi细胞的情况,并在标题问题上绊倒。我从一个假设开始,我们可以定义一个4D超球面,由五个曲面点组成

我甚至得到了一些代码,从三维空间的三个点中生成一个三维球体中心点(在这种情况下,这些点总是在球体的赤道上),我分享了这些代码。我还设法找到了从四个曲面点中找出三维空间球体中心的代码,但它的体积大得惊人,有很多矩阵行列式计算,我承认这有点粉碎了我自己将其扩展到4D的希望

我在中发现了大量的演示,但这不是我可以轻易转换成代码的东西

更新

大家好,我终于在我的周末,所以我可以给这些照片

首先,我得到了下面的C#(Unity3D)代码,我可以从视觉上确认这是一个奇迹。当所有点都共面时,它显然失败了,但这几乎是意料之中的

static public Vector3 TetrahedronCircumcenter3D(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
{
    Vector3 ba = b - a; //all points from an 'a' point of view
    Vector3 ca = c - a;
    Vector3 da = d - a;
    Vector3 crosscd = Vector3.Cross(ca, da); //perpendicular vectors to those above
    Vector3 crossdb = Vector3.Cross(da, ba);
    Vector3 crossbc = Vector3.Cross(ba, ca);
    return a + (
        (
            ba.sqrMagnitude * crosscd +
            ca.sqrMagnitude * crossdb +
            da.sqrMagnitude * crossbc
        ) *
        (0.5f / (ba.x * crosscd.x + ba.y * crosscd.y + ba.z * crosscd.z)) // half point
    );
}
正如我所说,它在视觉上起作用

我从一个我不幸丢失的链接中得到了这个,这个链接解释了如何从垂直线的交叉点计算单纯形的外心。这两个词很重要,因为这正是我一直在寻找的:“单纯形环绕中心”。单纯形是在R^n中可以得到的最简单的形状:R^2中的三角形、R^3中的四面体和R^4中的五面体等等

然后我决定尝试扩展它,简单地使用良好的感觉将其扩展到4D。我首先遇到了一个问题,除了3-D和(奇怪的)7-D之外,任何东西都不能期望两个向量之间有一个垂直的叉积,我想我已经完成了。但是一句话给出了下一条线索(这是很明显的,在一个人说了之后:你可以从4-D中3个向量的叉积中得到一个垂直的4-D向量。搜索公式,我发现了更好的东西:

扩展该代码以使用Vector4是很简单的

扩展代码如下所示:

static public Vector4 PentatopeCircumcenter4D(Vector4 a, Vector4 b, Vector4 c, Vector4 d, Vector4 e)
{
    Vector4 ba = b - a; //all points from an 'a' point of view
    Vector4 ca = c - a;
    Vector4 da = d - a;
    Vector4 ea = e - a;
    Vector4 crosscde = CrossProduct(ca, da, ea); //perpendicular vectors
    Vector4 crossdeb = CrossProduct(da, ea, ba);
    Vector4 crossebc = CrossProduct(ea, ba, ca);
    Vector4 crossbcd = CrossProduct(ba, ca, da);
    return a +
        (
            (
                crosscde * ba.sqrMagnitude +
                crossdeb * ca.sqrMagnitude +
                crossebc * da.sqrMagnitude +
                crossbcd * ea.sqrMagnitude
            ) *
            (0.5f / (ba.x * crosscde.x + ba.y * crosscde.y + ba.z * crosscde.z + ba.w * crosscde.w))
        );
}
这就引出了下一个问题:如何确认这是否有效?

编辑:此处解释了基本原理:

编辑:它在4D中不起作用。从点a、b、c、d和e到计算中心的距离不同。a、b、d是一致的。点c和e显示不同的距离


编辑:在运行时没有一个线性代数解算器在手,也不能像其他资源中指定的那样减少系统,我不得不走矩阵的路。代码有点广泛,但没什么可怕的。有一些5x5矩阵行列式在路上,但我通过检查所有点和给定中心之间的距离来工作但是,上面的尝试性解决方案不起作用。

通过行列式的超球面方程(但有4维)对于4D来说相当庞大

有一种方法需要计算逆矩阵(相当简单的过程,矩阵代数中的标准问题)

选择一个点作为基准X0,并制作4个向量
V1=X1-X0,V2=X2-X0
,依此类推。 计算它们的一半长度

L1 = V1.norm / 2 ...
获取标准化(单位)向量:

求解方程以获得半径向量
R
(从
X0
到超球面中心)

超球面中心是

 C = X0 + R
描述了这个方程的良好原理

它使用半径向量到V向量的投影,就像三角形周围的外接圆的2D情况下的中间垂直度方法一样


通过行列式的超球面方程(但有4维)对于4D来说是相当巨大的

有一种方法需要计算逆矩阵(相当简单的过程,矩阵代数中的标准问题)

选择一个点作为基准X0,并制作4个向量
V1=X1-X0,V2=X2-X0
,依此类推。 计算它们的一半长度

L1 = V1.norm / 2 ...
获取标准化(单位)向量:

求解方程以获得半径向量
R
(从
X0
到超球面中心)

超球面中心是

 C = X0 + R
描述了这个方程的良好原理

它使用半径向量到V向量的投影,就像三角形周围的外接圆的2D情况下的中间垂直度方法一样


您好!谢谢您的回答。我对这个问题进行了进一步的更新。我似乎发现了一些利用您所展示的原理的东西。@Fernando D'Andrea我没有足够的数学想象力来直观地控制4D:)的正确性。但您可以检查从源点到结果球体中心的距离您好!谢谢你的回答。我对这个问题作了进一步的补充。似乎我发现了一些东西,利用了你展示的原理。@Fernando D'Andrea我没有足够的数学想象力来直观地控制4D:)的正确性。但您可以检查从源点到结果球体中心的距离