【问题标题】:How to Scale a Curve Line made up of points?如何缩放由点组成的曲线?
【发布时间】:2017-11-11 11:38:26
【问题描述】:

缩放由点组成的曲线的最佳算法是什么?例如:

Curve line (A):
o               
 o             
  o            o o   
   o         o     o     o o
    o       o       o   o   o
     o     o         o o     o
       o o

如果曲线 (A) 被“缩小”5%,那么它看起来像这样。

Output:

o
 o        o o
  o      o    o   o o
   o    o      o o   o
    o o

如果将曲线 (A) 放大 10%,则它看起来像这样。

o               
 o             
  o                
   o               
    o                o o    
     o             o     o      o o    
      o           o       o   o     o
       o         o         o o       o
        o       o
         o     o
           o o

我只是想知道如何解决它的算法、概念或想法,但为了更清楚,这里有一些我想要实现的 java 代码。

class CurveLine
{
    public static ArrayList<float[]> getScaledCurveLine
    (float[][] curveLine, float percentage, bool enlarged)
    {
         ArrayList<float[]> scaledCurveLine = new ArrayList<float[]>();
         /*
               Some Algorithm for Scaling Curve Line
         */
         return scaledCurveLine; //new set of points
    }

    public static void main (string args[])
    {
         float [][] curveLine = new float[20][2]; //set of points
         curveLine[0][0] = 0; //x1
         curveLine[0][1] = 5; //y1
         curveLine[1][0] = 1; //x2
         //and so on..

         ArrayList<float[]> largerCurveLine = getScaledCurveLine(curveLine, 20, true);
         ArrayList<float[]> smallerCurveLine = getScaledCurveLine(curveLine, 20, false);
    }
}

我在缩放点中阅读了一些算法,例如“最近邻插值”,但我不确定我是否走在正确的道路上:(。

我非常需要知道该怎么做,伙计们:(提前谢谢。

【问题讨论】:

  • point *= 0.95point *= 1.1 - 某些语言标签或代码可能会给出真正的答案。
  • 感谢@Marco13 的回复 .. 我放了一些java代码让它更清楚。谢谢。
  • 在您的示例中,缩小的图包含的点比原始图少,而放大的点多一个。但是您没有为此指定规则(例如,用相同的因子缩放点数,使它们在 x 中保持等距,...?)。如果没有这样的规则,@Marco13 的方法,保留所有点并单独移动它们,是我能想象到的最简单和最准确的解决方案。
  • 是的,当它变大时如何添加一些点,当它变小时删除一些点,以及在缩放时根据指定位置移动点的规则是我想知道的。你不认为有一些算法可以解决这个问题,他们已经为此指定了规则吗?在 Microsoft Powerpoint 中,他们已经实现了点曲线的缩放,我很好奇他们是如何做到的,哈哈。
  • 关于您的示例代码:这不是曲线。它是一系列(直线)线段。有缩放曲线的解决方案,并最终将它们转换为一系列直线段,其中包含任意数量的点。但首先,这首先需要一条真实曲线(例如三次曲线或贝塞尔曲线),其次,其背后的数学有点过于复杂,无法在答案中总结。 (在下一条评论中继续...)

标签: java algorithm scale curve points


【解决方案1】:

如果我的问题是正确的,您基本上希望在不改变点密度的情况下调整折线(曲线)的大小。

  1. 近似/拟合曲线以匹配您的折线

    如果你得到的分数多于你应该分段进行(例如使用 4 点三次)。如果您有一些原始折线数据,您可以将原始折线记住为曲线,以便进一步重新采样以避免在每次调整大小时进行拟合。

    更多信息见How can i produce multi point linear interpolation?

    所用曲线的多项式次数取决于您需要的连续性。对于基本的图形内容,4 点立方就足够了。但是如果你需要更高的导数也比你需要使用更高的度数更平滑。

  2. 将所有曲线控制点乘以比例

    如果您使用由向量定义的曲线,也将它们相乘...如果您想在每个轴上进行更复杂的转换或重新缩放,而不是在项目符号 #3中采样后应用此步骤>。因为如果在控制点和曲线点本身上进行这些转换,将产生不同的结果。

  3. 新折线示例

    所以只需通过新的点密度(参数步长)迭代您的曲线,并将生成的点用作新的折线。

    如果您在此步骤中应用变换#2,参数步骤也会受到比例的影响。

    如果是带有参数t=&lt;0,1&gt; 的分段曲线,您需要从t 开始,下一条曲线的值来自上一条曲线。所以一旦t1.0 交叉,您将移动到下一条曲线,并且应该以t-1.0 参数起始值开始。

    如果您想要更精确的密度而不是需要在曲线上找到与最后一个精确距离的点,而不是恒定的参数增量。

以下是我对这一切的想法的简要概述:

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多