Math 尺度不可知、可微、共平面度量

Math 尺度不可知、可微、共平面度量,math,3d,Math,3d,我在寻找一个(几乎所有地方)可微函数f(p1,p2,p3,p4),给定四个点将给我一个关于共平面性的尺度不可知度量。如果四个点位于同一平面上,则为零,否则为正。缩放不可知意味着,当我均匀缩放所有点时,平面度度量将返回相同的值 我提出了一些非常复杂且不容易优化的方法。定义u=p2-p1,v=p3-p1,w=p4-p1。那么平面度度量是: [(u x v) * w]² / (|u x v|² |w|²) 其中x表示叉积,“*”表示点积 分子是由四个点定义的四面体的体积的平方,分母是一个标准化因子,

我在寻找一个(几乎所有地方)可微函数
f(p1,p2,p3,p4)
,给定四个点将给我一个关于共平面性的尺度不可知度量。如果四个点位于同一平面上,则为零,否则为正。缩放不可知意味着,当我均匀缩放所有点时,平面度度量将返回相同的值

我提出了一些非常复杂且不容易优化的方法。定义
u=p2-p1
v=p3-p1
w=p4-p1
。那么平面度度量是:

[(u x v) * w]² / (|u x v|² |w|²)
其中x表示叉积,“*”表示点积

分子是由四个点定义的四面体的体积的平方,分母是一个标准化因子,使得这个度量变成一个角度的余弦。因为角度在均匀比例下不会改变,所以此函数满足我的所有要求

有人知道更简单的吗

亚历克斯

编辑:

我最终使用了一个增广的拉格朗日方法来执行优化,所以我不需要它是规模不可知的。只要使用约束就足够了,因为优化过程会找到正确的拉格朗日乘数来补偿比例。

怎么样

|(u x v) * w| / |u|^3
(如果您认为更简单,您可以将
|x |
更改为
(x)^2

怎么样

|(u x v) * w| / |u|^3

(如果您认为更简单,您可以将
|x |
更改为
(x)^2

您的方法似乎还可以,为了高效实施,我会这样做:

  • 像你一样接受你,v,w
  • 规范化它们:存在各种各样的技巧来有效地计算平方根的倒数,无论你想要什么精度,比如。大多数现代处理器都有用于此操作的内置处理器
  • 取f=| det(u,v,w)|(=(uxv).w)。有3x3矩阵的快速直接实现;请参阅@batty的答案
这相当于你在没有正方形的情况下所做的事情。它仍然是齐次的,几乎处处可微。如果你想得到处处可微的东西,就取行列式的平方


编辑:@phkahler含蓄地建议使用内接球体半径与外接球体半径的比率作为平面度的度量。这是点的有界可微函数,按比例不变。然而,这至少和你(和我)的建议一样难以计算。特别是计算外切球体的半径对舍入误差非常敏感。

您的方法似乎还可以,为了高效实现,我会这样做:

  • 像你一样接受你,v,w
  • 规范化它们:存在各种各样的技巧来有效地计算平方根的倒数,无论你想要什么精度,比如。大多数现代处理器都有用于此操作的内置处理器
  • 取f=| det(u,v,w)|(=(uxv).w)。有3x3矩阵的快速直接实现;请参阅@batty的答案
这相当于你在没有正方形的情况下所做的事情。它仍然是齐次的,几乎处处可微。如果你想得到处处可微的东西,就取行列式的平方


编辑:@phkahler含蓄地建议使用内接球体半径与外接球体半径的比率作为平面度的度量。这是点的有界可微函数,按比例不变。然而,这至少和你(和我)的建议一样难以计算。特别是计算外切球体的半径对舍入误差非常敏感。

关于点重新排序,应对称的度量是:

((u x v).w)^2/(|u||v||w||u-v||u-w||v-w|)
它与四面体体积的平方除以所有6条边的长度成正比。它并不比你的公式或Alexandre C.的简单,但也不复杂。然而,当任意两点重合时,它确实变得不必要的奇异

一个性能更好、顺序不敏感的公式是:

let a = u x v
    b = v x w
    c = w x u
(a.w)^2/(|a| + |b| + |c| + |a+b+c|)^3

这有点像四面体的体积除以表面积,但提高到适当的幂,使整个物体的尺度不敏感。这也比您的公式复杂一些,但除非所有4个点都是共线的,否则它会起作用。

关于点重新排序,应该对称的度量是:

((u x v).w)^2/(|u||v||w||u-v||u-w||v-w|)
它与四面体体积的平方除以所有6条边的长度成正比。它并不比你的公式或Alexandre C.的简单,但也不复杂。然而,当任意两点重合时,它确实变得不必要的奇异

一个性能更好、顺序不敏感的公式是:

let a = u x v
    b = v x w
    c = w x u
(a.w)^2/(|a| + |b| + |c| + |a+b+c|)^3

这有点像四面体的体积除以表面积,但提高到适当的幂,使整个物体的尺度不敏感。这比你的公式要复杂一点,但除非所有4个点都是共线的,否则它是有效的。

这看起来更像是@Alex的一个问题,似乎你的度量是正确的…@6502你可能是对的,尽管我相信有足够多的程序员编写3D图形软件(通常是网格编辑/建模)可以帮我解决这个问题。为什么不按(平方)标准的乘积来衡量呢?你为什么把一切都摆正?你确定你真的想要共面点的可微性吗?对于绝对值而不是平方,它仍然是齐次的,几乎所有地方都是可微的。我建议,对于输入点的任何顺序,函数都应该返回相同的结果。我可以建议四面体的体积除以边长的函数吗?同时看看四面体网格生成中使用的度量——它们试图避免平面性,所以它们有度量