假设有一行(1, 30)
(浮点数x = 30)
我需要将其分成多个部分,每个下一个部分应比上一个部分宽,最后一个部分应比第一个部分宽X倍。
我有一个想法,首先将线分成相等的部分,然后增加,然后减少,直到达到两个条件: -第一段比最后一段短X倍 -对于同一乘数,每个分段(第一个分段除外)都比以前宽
//input:
int lineDimension = 30;
int numberOfSegments = 5;
int step = 1;
float[] splitLineIntoSegments(float lineDimension, int numberOfSegments, float differenceBetweenFirstAndLastSegmentMultiplicator, float step) {
float[] result = new float[numberOfSegments];
//first split into equal segments
for (int i = 0; i < numberOfSegments; i++) {
result[i] = lineDimension / numberOfSegments;
}
//increase each next value untill difference reached
do {
for (int ii = 0; ii < numberOfSegments; ii++) {
if (result[ii]-step<=0)
return result;
if (ii>numberOfSegments/2){
result[ii] += step;
}
else result[ii] -= step;
}
}
while ((float)result[numberOfSegments] / (float)result[0] > differenceBetweenFirstAndLastSegmentMultiplicator);
return result;
}
float [] res = splitLineIntoSegments(lineDimension,numberOfSegments,2,step);
其结果应为4,5,6,7,8
有更好的方法吗?
答案 0 :(得分:3)
如果比率必须恒定,则让r
,各段的相对长度为1
,r
,r²
,r³
,…{ {1}}个r^(n-1)
部分,总和为n
。我们也有(r^n-1) / (r-1)
,给出X = r^(n-1)
。
如果线段的长度为r = X^(1/(n-1))
,则部分为
L
例如对于L.r^k.(r-1) / (r^n-1)
部分和4
,我们有X=27/8
,部分是r=3/2
,8/65
,12/65
和18/65
27/65
。
如果比率不必恒定且各部分与某些给定数字L
(例如Rk
)成比例,则取总和X=R[n-1]/R0
并使用
R
答案 1 :(得分:0)
您可以为此强制一个简单的算术序列。 从问题参数开始:
N = quantity of segments
X = scale factor: segment[N-1] / segment[0]
L = length of line
首先,找到所需的均值:
mean = L / N
现在,我们需要第一个和最后一个项才能求平均值。令a
为当前未知的第一段的长度。解决a
(a + X*a) / 2 = mean
a = 2*mean / (1+X)
您现在有了第一个(a
)和最后一个(X*a
)术语,以及术语数量。现在,找到共同的区别很简单:
d = (X*a - a) / (N-1)
您的细分顺序现在是
[ a + i*d for 0 <= i < N ] // i being a sequence of integers