Math 计算点到线段和线段到线段的平均距离

Math 计算点到线段和线段到线段的平均距离,math,geometry,wolfram-mathematica,Math,Geometry,Wolfram Mathematica,我正在寻找一种算法来计算3D中点和线段之间的平均距离。因此,给定代表线段AB的两个点A(x1,y1,z1)和B(x2,y2,z2)以及第三个点C(x3,y3,z3),AB上的每个点到点C的平均距离是多少 我还对两条线段之间的平均距离感兴趣。给定线段AB和CD,AB上的每个点到CD上最近点的平均距离是多少 我在尝试过的网络搜索中没有任何运气,所以如果有任何建议,我将不胜感激 谢谢。首先,两点之间的距离是坐标成对差平方和的平方根。 (例如,从(0,0,0)到(1,1,1)的距离为sqrt(3),但这

我正在寻找一种算法来计算3D中点和线段之间的平均距离。因此,给定代表线段AB的两个点A(x1,y1,z1)和B(x2,y2,z2)以及第三个点C(x3,y3,z3),AB上的每个点到点C的平均距离是多少

我还对两条线段之间的平均距离感兴趣。给定线段AB和CD,AB上的每个点到CD上最近点的平均距离是多少

我在尝试过的网络搜索中没有任何运气,所以如果有任何建议,我将不胜感激


谢谢。

首先,两点之间的距离是坐标成对差平方和的平方根。 (例如,从(0,0,0)到(1,1,1)的距离为sqrt(3),但这适用于任意数量的标注中的任意点。) 这种距离称为(小写L)或欧几里德范数。 为A点和B点之间的距离编写规范(A,B)

关于平均距离这个有趣的问题。。。 (请注意,查找点到直线或线段之间的最小距离是一个更为常见的问题。这里有一个答案,该问题有很好的指针,但它似乎同时被删除。)

求取C点到线段AB的平均距离,考虑A和B之间的任意点的距离,即(1-K)A+KB,其中k的范围为0至1。 这就是范数(C,(1-k)A+kB)。 所以平均距离是从k=0到范数(C,(1-k)A+kB)的1的积分

Mathematica可以对任何特定的A、B和C进行积分

下面是Mathematica实现:

avgd[A_,B_,C_] :=  Integrate[Sqrt@Dot[(1-k)*A+k*B-C, (1-k)*A+k*B-C], {k, 0, 1}]
被积函数也可以写成
Norm[(1-k)*A+k*B-C]
。无论哪种方式,Mathematica都可以对特定的点进行积分,但不能象征性地对其进行积分,尽管显然大卫是以某种方式让它这样做的。 以下是David评论中的示例:

> avgd[{0, 0, 0}, {4, 0, 0}, {4, 3, 0}] // N

3.73594
对于两条线段之间的平均距离问题,理论上我认为这应该可行:

avgd[A_,B_,C_,D_] := Integrate[Norm[(1-k)A+k*B - (1-j)C - j*D], {k,0,1}, {j,0,1}]

但是Mathematica似乎对这一点感到窒息,即使是对于特定的点,更不用说象征性的了。

如果你的意思是我认为你所说的“平均”(和“距离”,即德雷夫斯提到的L2范数),那么我认为有一个程序可以用来计算点和线段之间的平均距离。你需要一个函数
dot(a,B)
,它取两个向量的点积

// given vectors (points) A, B, C
K1 = dot(A-C,A-C)
K2 = 2*dot(B-A,A-C)
K3 = dot(B-A,B-A)
L1 = sqrt(K3*(K1+K2+K3))
L2 = sqrt(K3*K1)
N = 4*K3*L1 + 2*K2*(L1-L2) + (K2*K2-4*K1*K3)*log((K2+2*L2)/(2*K3+K2+2*L1))
D = N / (8*K3^1.5)
假设我已经正确地转录了所有内容,
D
将是平均距离

这基本上就是我在Mathematica中所做的计算积分结果的伪代码。可能有一些简洁的计算捷径,但如果有,我不知道。(除非有,否则我会质疑你到底需要做多少计算)

如果您想找到从线段CD上最近的点到AB上所有点的平均距离,在大多数情况下,最近的点将是C或D,因此您可以只检查这两个点,看看哪个更近(可能使用其他答案中引用的一些最小距离计算)。唯一的例外是当CD和AB平行时,您可以从一个垂直运行到另一个垂直运行,在这种情况下,您必须更精确地定义您的需求


如果你想找到CD上所有点和AB上所有点之间的平均距离。。。它可以用二重积分来完成,尽管我不敢想象得到的公式会有多复杂。

好吧,如果分析失败,那就去找一台电脑,做一些愚蠢的计算,直到你对数字有了感觉

我也有一本Mathematica。为了简单起见,因为三角形必须位于平面内,所以我在二维空间中进行了以下工作。为了使事情更加简单,我在
{0,0}
处指定了一个点,并从
{1,0}
{0,1}
指定了一个线段。如果有意义,点到线的平均距离必须是从{0.0}到线段上任何位置的所有线的平均长度。当然,有很多这样的台词,所以让我们从10开始。在Mathematica中,这可以计算为

Mean[Table[EuclideanDistance[{0, 0}, {1 - k, 0 + k}], {k, 0, 1, 10.0^-1}]]]
它给出了
0.830255
。下一步很明显,让我测量的线的数量变大。事实上,当10.0的指数变小时(它们是负数!),让我们做一个平均值表。在数学中:

Table[Mean[Table[EuclideanDistance[{0, 0}, {1 - k, 0 + k}], {k, 0, 1, 
10.0^-i}]], {i, 0, 6}]
产生:

{1, 0.830255, 0.813494, 0.811801, 0.811631, 0.811615, 0.811613}
按照这种方法,我重新设计了@Dave的示例(忘记第三维度):

其中:

{9/2, 4.36354, 4.34991, 4.34854, 4.34841, 4.34839, 4.34839}
这与@dreeves所说的@Dave的算法计算结果不符

编辑:好的,我在这上面又浪费了一些时间。对于我首先使用的简单示例,即在
{0,0}
处的一个点和从
{0,1}
延伸到
{1,0}
的线段,我在Mathematica中定义了一个函数(一如既往),如下所示:

fun2[k_] := EuclideanDistance[{0, 0}, {0 + k, 1 - k}]
现在,这是可积的。Mathematica给出:

   In[13]:= Integrate[fun2[k], {k, 0, 1}]

   Out[13]= 1/4 (2 + Sqrt[2] ArcSinh[1])
或者,如果您希望有数字,请执行以下操作:

In[14]:= NIntegrate[fun2[k], {k, 0, 1}]
Out[14]= 0.811613
这就是我之前采用的纯数值方法给出的结果


我现在要继续工作,让大家把它推广到由一个点和一条线段的端点定义的任意三角形。

有趣的方法,你能给我一个解释/证明吗?(我只是好奇)…现在我想起来了,我相信这个公式有问题。考虑<代码> a=(0,0,0)<代码>,<代码> b=(4,0,0)< /代码>,要么<代码> c=(3 99999999,3,0)<代码>或<代码> c=(4,00000000,1,3,0)< /代码>。在前一种情况下,第一个公式(当D位于AB上时)得出的平均距离为3.5,但在第二种情况下,第二个公式得出的距离为4,尽管两者几乎相同。(我自己的分析计算结果是3.7359)只要你在编辑它,我想你不是说
In[14]:= NIntegrate[fun2[k], {k, 0, 1}]
Out[14]= 0.811613