我将建议一个算法,但由于推导在数学上有点混乱,我没有足够的时间仔细考虑并仔细检查它的正确性。另外,我可能已经包括了一些冗余检查,如果证明某些适当的不等式可能会变得多余,并且可以证明在合理假设下可能始终存在解决方案的存在。我相信这个想法是正确的,但我可能在写这篇文章时犯了一些错误,所以要小心。
因为根据您的评论,由于对称性,在沿正方形边界的线段内只有一个角足以解决其余情况,因此我将专注于一个角情况。
您的具有一个 90 度角的多边形段被分成一对垂直的直线段,第一个长度为 l1,第二个长度为 l2。这两个长度是给你的。您还想在总长度为l1 + l2 的多边形段上添加给定数量的n 点,以使任意两个连续点之间的欧几里得直线距离相同。打电话给那个未知的距离d。当您这样做时,您将在l1 上得到n1 未知长度的完整段d 和n2 在l2 上的未知长度d 的完整段,这样
n1 + n2 = n
一般而言,您还会在l1 上得到一个额外的长度为d1 <= d 的段,一端位于90 度角。类似地,您还将在l2 上有一个长度为d2 <= d 的额外段,其一端位于90 度角。因此,d1 和d2 两个线段共用一个公共端并且相互垂直,因此它们形成一个直角三角形。根据毕达哥拉斯定理,这两段满足方程
d1^2 + d2^2 = d^2
如果我们结合到目前为止的所有方程和信息,我们得到一个方程和限制系统,它们是:
n1*d + d1 = l1
n2*d + d2 = l2
d1^2 + d2^2 = d^2
n1 + n2 = n
n1 and n2 are non-negative integers
变量d, d1, d2, n1, n2 是未知的,而l1, l2, n 是给定的。
从前两个等式,你可以表达d1 和d2 并代入第三个等式:
d1 = l1 - n1*d
d2 = l2 - n2*d
(l1 - n1*d)^2 + (l2 - n2*d)^2 = d^2
n1 + n2 = n
n1 and n2 are non-negative integers
在特殊情况下,当一个人只想添加一个点时,即n = 1,一个人要么有n1 = n = 1,要么有n2 = n = 1,这取决于分别是l1 > l2还是l1 <= l2。
说l1 > l2。然后n1 = n = 1 和n2 = 0 所以
d1 = l1 - d
d2 = l2
(l1 - d)^2 + l2^2 = d^2
展开方程,化简并求解d:
l1^2 - 2*l1*d + d^2 + l2^2 = d^2
l1^2 + l2^2 - 2*l1*d = 0
d = (l1^2 + l2^2) / (2*l1)
接下来,让我们回到一般情况。你必须解决系统
(l1 - n1*d)^2 + (l2 - n2*d)^2 = d^2
n1 + n2 = n
n1 and n2 are non-negative integers
变量d, n1, n2 是未知的,而l1, l2, n 是给定的。展开第一个方程:
l1^2 - 2 * l1 * n1 * d + n1^2 * d^2 + l2^2 - 2 * l2 * n2 * d + n2^2 * d^2 = d^2
n1 + n2 = n
n1 and n2 are non-negative integers
并将术语组合在一起
(n1^2 + n2^2 - 1) * d^2 - 2 * (l1*n1 + l2*n2) * d + (l1^2 + l2^2) = 0
n1 + n2 = n
n1 and n2 are non-negative integers
第一个方程是d中的二次方程
(n1^2 + n2^2 - 1) * d^2 - 2 * (l1*n1 + l2*n2) * d + (l1^2 + l2^2) = 0
通过二次公式,您期望有两个解决方案(通常,您选择哪个是正数。
如果两者都是肯定的并且d < l1和d < l2,你可能有两种解决方案):
d = ( (l1*n1 + l2*n2) +- sqrt( (l1*n1 + l2*n2)^2 - (l1^2 + l2^2)*(n1^2 + n2^2 - 1) ) ) / (n1^2 + n2^2 - 1)
n1 + n2 = n
n1 and n2 are non-negative integers
现在,如果你能找到合适的n1 和n2,你可以使用上面的二次公式计算出必要的d。
为了存在解决方案,平方根中的表达式必须是非负的,所以你有不等式限制
d = ( (l1*n1 + l2*n2) +- sqrt( (l1*n1 + l2*n2)^2 - (l1^2 + l2^2)*(n1^2 + n2^2 - 1) ) ) / (n1^2 + n2^2 - 1)
(l1*n1 + l2*n2)^2 - (l1^2 + l2^2)*(n1^2 + n2^2 - 1) >= 0
n1 + n2 = n
n1 and n2 are non-negative integers
化简不等式:
(l1*n1 + l2*n2)^2 - (l1^2 + l2^2)*(n1^2 + n2^2 - 1) = (l1^2 + l2^2) - (l1*n2 - l2*n1)^2
这将我们带到以下系统
d = ( (l1*n1 + l2*n2) +- sqrt( (l1^2 + l2^2) - (l1*n2 - l2*n1)^2 ) ) / (n1^2 + n2^2 - 1)
(l1^2 + l2^2) - (l1*n2 - l2*n1)^2 >= 0
n1 + n2 = n
n1 and n2 are non-negative integers
分解不等式,
d = ( (l1*n1 + l2*n2) +- sqrt( (l1^2 + l2^2) - (l1*n2 - l2*n1)^2 ) ) / (n1^2 + n2^2 - 1)
(sqrt(l1^2 + l2^2) - l1*n2 + l2*n1) * (sqrt(l1^2 + l2^2) + l1*n2 - l2*n1) >= 0
n1 + n2 = n
n1 and n2 are non-negative integers
所以这些限制有两种情况:
案例一:
d = ( (l1*n1 + l2*n2) +- sqrt( (l1^2 + l2^2) - (l1*n2 - l2*n1)^2 ) ) / (n1^2 + n2^2 - 1)
sqrt(l1^2 + l2^2) - l1*n2 + l2*n1 >= 0
sqrt(l1^2 + l2^2) + l1*n2 - l2*n1 >= 0
n1 + n2 = n
n1 and n2 are positive integers
或
案例二:
d = ( (l1*n1 + l2*n2) +- sqrt( (l1^2 + l2^2) - (l1*n2 - l2*n1)^2 ) ) / (n1^2 + n2^2 - 1)
sqrt(l1^2 + l2^2) - l1*n2 + l2*n1 <= 0
sqrt(l1^2 + l2^2) + l1*n2 - l2*n1 <= 0
n1 + n2 = n
n1 and n2 are positive integers
我们专注于案例 1,发现案例 2 是不可能的。首先表达n2 = n - n1,然后将其替换为两个不等式中的每一个,并在每个不等式的一侧隔离n1。此过程产生:
案例1:
d = ( (l1*n1 + l2*n2) +- sqrt( (l1^2 + l2^2) - (l1*n2 - l2*n1)^2 ) ) / (n1^2 + n2^2 - 1)
( l1*n - sqrt(l1^2 + l2^2) ) / (l1 + l2) <= n1 <= ( l1*n + sqrt(l1^2 + l2^2) ) / (l1 + l2)
n1 + n2 = n
n1 and n2 are positive integers
可以看到情况 2 反转了不等式,这是不可能的,因为左边小于右边。
所以算法可能是这样的:
function d = find_d(l1, l2, n)
{
if n = 1 and l1 > l2 {
return d = (l1^2 + l2^2) / (2*l1)
} else if n = 1 and l1 <= l2 {
return d = (l1^2 + l2^2) / (2*l2)
}
for integer n1 >= 0 starting from floor( ( l1*n - sqrt(l1^2 + l2^2) ) / (l1 + l2) ) to floor( ( l1*n + sqrt(l1^2 + l2^2) ) / (l1 + l2) ) + 1
{
n2 = n - n1
D = (l1^2 + l2^2) - (l1*n2 - l2*n1)^2
if D >= 0
{
d1 = ( (l1*n1 + l2*n2) - sqrt( D ) ) / (n1^2 + n2^2 - 1)
d2 = ( (l1*n1 + l2*n2) + sqrt( D ) ) / (n1^2 + n2^2 - 1)
if 0 < d1 < max(l1, l2) {
return d1
} else if 0 < d2 < max(l1, l2) {
return d2
} else {
return "could not find a solution"
}
}
}
}