假設有一條線(1, 30)(float 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有更好的方法嗎?
2 回答

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
如果比率必須是常數,讓r
,段的相對長度為1
, r
, r2
, r3
, …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
零件 and X=27/8
,我們有r=3/2
零件是8/65
, 12/65
, 18/65
, 和27/65
of L
。
如果比率不需要恒定并且部分與某些給定數字成比例Rk
(例如X=R[n-1]/R0
),請求R
和并使用
L.Rk / R

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
您可以為此強制執行一個簡單的算術序列。從問題參數開始:
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) 項,以及項的數量?,F在找到共同點很簡單:
d = (X*a - a) / (N-1)
您的段序列現在是
[ a + i*d for 0 <= i < N ] // i being a sequence of integers
添加回答
舉報
0/150
提交
取消