如何缩放由点组成的曲线?
How to Scale a Curve Line made up of points?
缩放由点组成的曲线的最佳算法是什么?例如:
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) 缩放 "Smaller" 5%,则它看起来像这样。
Output:
o
o o o
o o o o o
o o o o o
o o
如果曲线 (A) 缩放 "Bigger" 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);
}
}
我在缩放点中阅读了一些算法,例如 "Nearest Neighbor Interpolation",但我不确定我是否走在正确的道路上 :(.
伙计们,我非常需要知道怎么做:(提前致谢。
如果我答对了你的问题,你基本上想在不改变点密度的情况下调整折线(曲线)的大小。
approximate/fit 曲线匹配你的折线
如果你得到的分数比你应该分段计算的多(例如使用 4 点立方)。如果您有一些原始折线数据,您可以将原始折线记住为任何进一步重采样的曲线,以避免在每次调整大小时都适合。
有关详细信息,请参阅
所用曲线的多项式次数取决于您需要的连续性。对于基本的图形材料,4 点立方体就足够了。但是如果你需要更高的导数比你需要使用更高的度数更平滑。
将所有曲线控制点乘以比例
如果您使用由向量定义的曲线,也将它们相乘...如果您想在每个轴上进行更复杂的转换或以不同方式重新缩放,而不是在项目符号中采样后应用此步骤 # 3。因为如果在控制点和曲线点本身上进行这些转换会产生不同的结果。
采样新折线
因此只需按新的点密度(参数步长)迭代曲线,并将生成的点用作新的多段线。
如果您在此步骤中应用转换 #2,则参数步长也会受到比例的影响。
对于参数为 t=<0,1>
的分段曲线,您需要从 t
开始下一条曲线,其值为上一条曲线。因此,一旦 t
穿过 1.0
,您将移动到下一条曲线,并且应该从 t-1.0
参数起始值开始。
如果你想要更精确的密度,你需要在曲线上找到与最后一个点的精确距离而不是常数参数增量。
以下是我对这一切的想法的简要说明:
缩放由点组成的曲线的最佳算法是什么?例如:
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) 缩放 "Smaller" 5%,则它看起来像这样。
Output:
o
o o o
o o o o o
o o o o o
o o
如果曲线 (A) 缩放 "Bigger" 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);
}
}
我在缩放点中阅读了一些算法,例如 "Nearest Neighbor Interpolation",但我不确定我是否走在正确的道路上 :(.
伙计们,我非常需要知道怎么做:(提前致谢。
如果我答对了你的问题,你基本上想在不改变点密度的情况下调整折线(曲线)的大小。
approximate/fit 曲线匹配你的折线
如果你得到的分数比你应该分段计算的多(例如使用 4 点立方)。如果您有一些原始折线数据,您可以将原始折线记住为任何进一步重采样的曲线,以避免在每次调整大小时都适合。
有关详细信息,请参阅
所用曲线的多项式次数取决于您需要的连续性。对于基本的图形材料,4 点立方体就足够了。但是如果你需要更高的导数比你需要使用更高的度数更平滑。
将所有曲线控制点乘以比例
如果您使用由向量定义的曲线,也将它们相乘...如果您想在每个轴上进行更复杂的转换或以不同方式重新缩放,而不是在项目符号中采样后应用此步骤 # 3。因为如果在控制点和曲线点本身上进行这些转换会产生不同的结果。
采样新折线
因此只需按新的点密度(参数步长)迭代曲线,并将生成的点用作新的多段线。
如果您在此步骤中应用转换 #2,则参数步长也会受到比例的影响。
对于参数为
t=<0,1>
的分段曲线,您需要从t
开始下一条曲线,其值为上一条曲线。因此,一旦t
穿过1.0
,您将移动到下一条曲线,并且应该从t-1.0
参数起始值开始。如果你想要更精确的密度,你需要在曲线上找到与最后一个点的精确距离而不是常数参数增量。
以下是我对这一切的想法的简要说明: