gpt4 book ai didi

用曲线连接图中点的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:01 24 4
gpt4 key购买 nike

我需要开发一种算法,以非线性方式连接点,即使用平滑曲线,如下图:

insert description of image here

问题是我找不到最好的解决方案,要么使用 Bezier Curves , Polimonial Interpolation , Curve Adjustment ,等等。

简而言之,我需要一个根据上图对点进行插值的公式,在一个坐标和另一个坐标之间生成N个中间点。

在上图中,第一个坐标 (c1) 是 (x = 1, y = 220),第二个 (c2) 是 (x = 2, y = 40)。

因此,如果我想在 c1 和 c2 之间创建例如 4 个中间坐标,我将必须获得一个包含 4 个元素的数组 (x, y),如下所示:

[1.2, 180], [1.4, 140], [1.6, 120], [1.8, 80]

有没有人有什么想法?

最佳答案

我认为任何Piecewise curve interpolation应该这样做。这里有一个小的 C++ 例子:

//---------------------------------------------------------------------------
const int n=7; // points
const int n2=n+n;
float pnt[n2]= // points x,y ...
{
1.0, 220.0,
2.0, 40.0,
3.0,-130.0,
4.0,-170.0,
5.0,- 40.0,
6.0, 90.0,
7.0, 110.0,
};
//---------------------------------------------------------------------------
void getpnt(float *p,float t) // t = <0,n-1>
{
int i,ii;
float *p0,*p1,*p2,*p3,a0,a1,a2,a3,d1,d2,tt,ttt;
// handle t out of range
if (t<= 0.0f){ p[0]=pnt[0]; p[1]=pnt[1]; return; }
if (t>=float(n-1)){ p[0]=pnt[n2-2]; p[1]=pnt[n2-1]; return; }
// select patch
i=floor(t); // start point of patch
t-=i; // parameter <0,1>
i<<=1; tt=t*t; ttt=tt*t;
// control points
ii=i-2; if (ii<0) ii=0; if (ii>=n2) ii=n2-2; p0=pnt+ii;
ii=i ; if (ii<0) ii=0; if (ii>=n2) ii=n2-2; p1=pnt+ii;
ii=i+2; if (ii<0) ii=0; if (ii>=n2) ii=n2-2; p2=pnt+ii;
ii=i+4; if (ii<0) ii=0; if (ii>=n2) ii=n2-2; p3=pnt+ii;
// loop all dimensions
for (i=0;i<2;i++)
{
// compute polynomial coeficients
d1=0.5*(p2[i]-p0[i]);
d2=0.5*(p3[i]-p1[i]);
a0=p1[i];
a1=d1;
a2=(3.0*(p2[i]-p1[i]))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-p2[i]+p1[i]));
// compute point coordinate
p[i]=a0+(a1*t)+(a2*tt)+(a3*ttt);
}
}
//---------------------------------------------------------------------------
void gl_draw()
{
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);

// set 2D view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(1.0/5.0,1.0/500.0,1.0);
glTranslatef(-4.0,0.0,0.0);

// render lines
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_STRIP);
float p[2],t;
for (t=0.0;t<=float(n-1);t+=0.1f)
{
getpnt(p,t);
glVertex2fv(p);
}
glEnd();

// render points
glPointSize(4.0);
glColor3f(0.0,0.0,1.0);
glBegin(GL_POINTS);
for (int i=0;i<n2;i+=2) glVertex2fv(pnt+i);
glEnd();
glPointSize(1.0);

glFinish();
SwapBuffers(hdc);
}
//---------------------------------------------------------------------------

这里预览:

preview

如您所见,这很简单,您只需要 n控制点 pnt (我从你的图表中提取)并插入...... getpnt函数将计算由参数 t=<0,n-1> 寻址的曲线上的任何点.在内部,它只是选择使用哪个立方 block 并计算为单个立方曲线。在 gl_draw您可以了解如何使用它来获取两者之间的点。

由于您的控制点均匀分布在 x 上轴:

x = <1,7>
t = <0,6>

我会写:

x = t+1
t = x-1

所以你可以计算任何x的任何点也是……

形状与您的图形不完全匹配,因为选择的控制点不正确。任何局部最小值/最大值都应该是一个控制点,有时也使用拐点更安全。曲线的起点和终点形状暗示了隐藏的起点和终点控制点,这些控制点没有显示在图表上。您可以使用所需的任意数量的点,但请注意,如果您破坏了 x 均匀分布,那么您将失去计算 t 的能力。来自 x直接!

因为我们不知道图表是如何创建的,所以我们只能猜测......

关于用曲线连接图中点的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com