Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 由一组基点描述的曲线(样条曲线、贝塞尔路径等)_Algorithm_Computational Geometry - Fatal编程技术网

Algorithm 由一组基点描述的曲线(样条曲线、贝塞尔路径等)

Algorithm 由一组基点描述的曲线(样条曲线、贝塞尔路径等),algorithm,computational-geometry,Algorithm,Computational Geometry,作为输入,我有一组“基点”(例如9点),作为输出,我必须返回另一组描述曲线的点 A1-A9是一个输入;这些是“基点”。我的任务是返回一组点,用户可以从中构建所描绘的曲线,即A1-A9的黑线 我的数学技能很低,谷歌搜索也没什么帮助。据我所知,这可以是三次样条曲线。我找到了一些基于C的源代码,但当我尝试构建样条线零件时,这些代码会不断循环,其中nextPoint.x

作为输入,我有一组“基点”(例如9点),作为输出,我必须返回另一组描述曲线的点

A1-A9是一个输入;这些是“基点”。我的任务是返回一组点,用户可以从中构建所描绘的曲线,即A1-A9的黑线

我的数学技能很低,谷歌搜索也没什么帮助。据我所知,这可以是三次样条曲线。我找到了一些基于C的源代码,但当我尝试构建样条线零件时,这些代码会不断循环,其中
nextPoint.x

请解释一下,我应该使用什么样的样条线、贝塞尔路径或其他构造来完成任务。如果你给我指出一个代码、一个算法或一本好的假人手册,那将非常好。

用于生成曲线上的中间点

例如,给定CubicInterpolate函数:

double CubicInterpolate(
   double y0,double y1,
   double y2,double y3,
   double mu)
{
   double a0,a1,a2,a3,mu2;

   mu2 = mu*mu;
   a0 = y3 - y2 - y0 + y1;
   a1 = y0 - y1 - a0;
   a2 = y2 - y0;
   a3 = y1;

   return(a0*mu*mu2+a1*mu2+a2*mu+a3);
}
要找到三次样条曲线上
点[1]
点[2]
之间的中间点,可以使用:

newPoint.X = CubicInterpolate(point[0].X, point[1].X, point[2].X, point[3].X, 0.5);
newPoint.Y = CubicInterpolate(point[0].Y, point[1].Y, point[2].Y, point[3].Y, 0.5);
点[0]
点[3]
确实会影响
点[1]
点[2]
之间的曲线部分。在曲线的任意一端,只需再次使用端点即可


要确保点之间的距离大致相等,可以计算输入点之间的距离,以确定要生成多少中间点(和
mu
值)。因此,对于相距较远的点,您将使用更多
0
1
之间的
mu
值。相反,对于非常接近的点,您可能根本不需要添加中间点。

谢谢大家。我找到了解决办法。对于通过基本点构建二维曲线,我确实遵循:
我找到了一篇关于C++和C示例的三次样条的文章。此示例允许通过基点查找“一维”三次样条曲线的插值值。因为我需要一个二维三次样条曲线-我创建了两个一维样条曲线-用于“x”和“y”轴。下一步,下一步,我从第一个点到最后一个点运行一个循环,在循环的每次迭代中,我都会找到插值值。根据插值值,我提出了一个观点。所以,当循环结束时,我得到一条曲线

伪代码(使用上述文章中的样条线类):

-(数组*)splineByBasePoints:(数组*)基点
{
int n=基点。计数;
三次_样条X样条、Y样条;
xSpline.build_样条曲线(basePoints.PointNumber,basePoints.XValuesOfPoints,n);
ySpline.build_样条曲线(基点.点编号,基点.Y值点,n);
阵列曲线;
int t=1;//t-中间点。“1”是因为点的数目,而不是索引

对于(;t如果您拥有MATLAB许可证

x = -4:4;
y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0];
cs = spline(x,[0 y 0]);
xx = linspace(-4,4,101);
y=ppval(cs,xx);

输出点是结果曲线的实际像素?仅给定9个蓝色点,就可以通过它们绘制许多不同的曲线。您需要准确地说明什么是输入和所需的输出。@乔治:不,这个问题已完全指定。给定任意N个点集,始终可以绘制无限多条平滑曲线通过所有这些方法绘制。样条方法找到一个最佳的方法,通过一些量来测量,比如二阶导数的大小或类似的东西。@Josh,不,这是一个数学抽象,只是坐标。Ggeorge,我有更新图片。我希望,这是澄清。我相信你想要的是一个三次b样条(注意,你的观点在x中不是单调排列的,这可能会导致一些更简单的方法出现问题)这里是一个很好的起点:查看wiki页面上引用的Dr House的pdf。谢谢,这将很有帮助。
x = -4:4;
y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0];
cs = spline(x,[0 y 0]);
xx = linspace(-4,4,101);
y=ppval(cs,xx);