我还对两个线段之间的平均距离感兴趣。给定线段AB和CD,每个点在AB上到CD上最近的点的平均距离是多少?
我尝试了很多网络搜索,但都没有成功,所以非常感谢您的建议。
谢谢。
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以某种方式做到了。以下是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似乎在特定点上甚至无法处理,更不用说符号化处理了。
A=(0,0,0)
,B=(4,0,0)
,以及 C=(3.99999999,3,0)
或 C=(4.000000001,3,0)
。在前一种情况下,你的第一个公式(当 D 在 AB 上时)得到的平均距离为 3.5,但在第二种情况下,你的第二个公式得到的距离为 4,尽管这两个距离应该几乎相同。(我的分析计算结果为 3.7359) - David Zdot(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上所有点之间的平均距离...可以用双重积分来完成,尽管我不敢想象得出的公式会有多么复杂。
A+k(B-A)
,因此我手动计算了(A+k(B-A)-C)^2
,得到了(A-C)^2+2k(B-A).(A-C)+k^2(B-A)^2
。我设定了K1=(A-C)^2
,K2=2(B-A).(A-C)
和K3=(B-A)^2
,并让Mathematica计算Integrate[Sqrt[K1 + K2 k + K3 k^2],{k,0,1}]
。 - David Z如果分析失败了,就去用计算机做大量的计算,直到你对数字有了感觉...
我也有一份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的指数变小时(它们是负数!)。在Mathematica中:
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的示例(忘记第三个维度):
Table[Mean[Table[EuclideanDistance[{0, 0}, {4, 0 + 3 k}], {k, 0, 1,
10.0^-i}]], {i, 0, 6}]
这将会给出:
{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
这就是我之前采用的纯数字方法所得到的结果。
现在我要回去工作了,把这个推广到由一个点和线段的端点定义的任意三角形留给大家。