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