将线分割(分割)成任意长度的段。(开始时短,结束时宽)

假设有一条线(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


有更好的方法吗?


江户川乱折腾
浏览 86回答 2
2回答

拉丁的传说

如果比率必须是常数,让r,段的相对长度为1,&nbsp;r,&nbsp;r²,&nbsp;r³, …r^(n-1)对于n部件,这总和为(r^n-1) / (r-1)。我们也有X = r^(n-1),给予r = X^(1/(n-1))。如果线段的长度为L,则零件为L.r^k.(r-1)&nbsp;/&nbsp;(r^n-1)例如,对于4零件 and&nbsp;X=27/8,我们有r=3/2零件是8/65,&nbsp;12/65,&nbsp;18/65, 和27/65of&nbsp;L。如果比率不需要恒定并且部分与某些给定数字成比例Rk(例如X=R[n-1]/R0),请求R和并使用L.Rk&nbsp;/&nbsp;R

翻阅古今

您可以为此强制执行一个简单的算术序列。从问题参数开始:N = quantity of segmentsX = scale factor: segment[N-1] / segment[0]L = length of line首先,找到所需的均值:mean = L / N现在,我们需要对第一项和最后一项进行平均。让a成为第一段的长度,目前未知。求解a(a + X*a) / 2 = mean&nbsp;a = 2*mean / (1+X)您现在有了第一个 ( a) 和最后一个 ( X*a) 项,以及项的数量。现在找到共同点很简单:d = (X*a - a) / (N-1)您的段序列现在是[ a + i*d for 0 <= i < N ]&nbsp; &nbsp; // i being a sequence of integers
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java