当前位置:首页 » 操作系统 » 控制点算法

控制点算法

发布时间: 2022-02-26 08:07:07

❶ 求二次贝塞尔曲线 算法实现

typedefstruct

{

floatx;

floaty;

}Point2D;

/*cp在此是四个元素的数组:

cp[0]为起点,或上图中的P0

cp[1]为第一控制点,或上图中的P1

cp[2]为第二控制点,或上图中的P2

cp[3]为结束点,或上图中的P3

t为参数值,0<=t<=1*/

Point2DPointOnCubicBezier(Point2D*cp,floatt)

{

floatax,bx,cx;floatay,by,cy;

floattSquared,tCubed;Point2Dresult;

/*计算多项式系数*/

cx=3.0*(cp[1].x-cp[0].x);

bx=3.0*(cp[2].x-cp[1].x)-cx;

ax=cp[3].x-cp[0].x-cx-bx;

cy=3.0*(cp[1].y-cp[0].y);

by=3.0*(cp[2].y-cp[1].y)-cy;

ay=cp[3].y-cp[0].y-cy-by;

/*计算t位置的点值*/

tSquared=t*t;

tCubed=tSquared*t;

result.x=(ax*tCubed)+(bx*tSquared)+(cx*t)+cp[0].x;

result.y=(ay*tCubed)+(by*tSquared)+(cy*t)+cp[0].y;

returnresult;

}

/*ComputeBezier以控制点cp所产生的曲线点,填入Point2D结构数组。

调用方必须分配足够的空间以供输出,<sizeof(Point2D)numberOfPoints>*/

voidComputeBezier(Point2D*cp,intnumberOfPoints,Point2D*curve)

{

floatdt;inti;

dt=1.0/(numberOfPoints-1);

for(i=0;i<numberOfPoints;i++)

curve[i]=PointOnCubicBezier(cp,i*dt);

}

❷ 请问高手如何根据几个点绘制出平滑曲线,就像EXEL中的一样,请给出控制点坐标反推算法

试一下拉格朗日差值,由于他差值是线性的,一定平滑。
公式打不上……,你搜一下就可以找到。
你得到差值公式不就是一个平滑的曲线吗?

❸ 求贝塞尔曲线的顶点坐标的算法

德卡斯特里奥算法可以计算贝塞尔曲线上的点C(u),u∈[0,1]。因此,通过给定一组u的值,便可以计算出贝塞尔曲线上的坐标序列,从而绘制出贝塞尔曲线。

德卡斯特里奥算法的基础就是在向量AB上选择一个点C,使得C分向量AB为u:1-u(也就是∣AC∣:∣AB∣= u)。给定点A、B的坐标以及u(u∈[0,1])的值,点C的坐标便为:C = A + (B - A) * u = (1 - u) * A + B * u。

定义贝塞尔曲线的控制点Pi编号为0i,其中,0表示是第0次迭代。当第一、二、三……次迭代时,0将会被1、2、3……替换。

德卡斯特里奥算法的思想如下:为了计算n次贝塞尔曲线上的点C(u), u∈[0,1],首先将控制点连接形成一条折线00-01-02……0(n - 1)-0n。利用上述方法,计算出折线中每条线段0j-0(j+1)上的一个点1j,使得点1j分该线段的比为u:1-u。然后在折线 10-11-……-1(n-1)上递归调用该算法,以此类推。最终,求得最后一个点n0。 德卡斯特里奥证明了,点n0一定是曲线上的点。

如上图,曲线控制点是00、01、02、03、04、05。线段00-01上取点10,10分该线段的比为u:1-u,类似地取点11、 12、13、14,然后第二次迭代在线段10-11上取点20,点20分该线段的比为u:1-u,类似地取点21、22、23。然后进行下一次迭代,依次类推,直到最后在线段40-41上取点50,50是最终惟一的点,也是在曲线上的点。

上述直观的算法描述可以表达成一个计算方法。

首先,将所有给定的控制点排列成一列,在上图中,即为最左边的一列。每一对相邻的控制点可以伸出两个箭头,分别指向右下方和右上方。在相邻箭头的交叉处,生成一个新的控制点。例如,控制点ij和i(j +1)生成新的控制点(i + 1)j。指向右下方的箭头表示乘以(1 - u),指向右上方的箭头表示乘以u。

因此,通过第0列,可以求出第1列,然后求出第2列……,最终,在n次迭代后,可以到达惟一的一个点n0,这个点就是曲线上的点。

该计算过程算法如下:

Input: array P[0:n] of n+1 points and real number u in [0,1] Output: point on curve, C(u) Working: point array Q[0:n] for i := 0 to n do

Q[i] := P[i]; // save input

for k := 1 to n do

for i := 0 to n - k do

Q[i] := (1 - u)Q[i] + u Q[i + 1];

return Q[0];

该计算方法可以推导出一个递归关系:

但是,直接通过递归方法计算Pi,j效率低下,其原因与通过递归方法计算斐波那契数列一样:递归方法有大量的重复计算。

德卡斯特里奥算法还有一个有趣的性质。对于同一列中的连续的一组控制点,对其应用德卡斯特里奥算法,那么由这些控制点确定的曲线上的点,就是以这组控制点为边的等边三角形中,与这些控制点相对的顶点。

例如:由控制点02、03、04、05确定的曲线上的,对应u的点是32,正如下图中蓝色的等边三角形所表示的。同样,控制点11、12、13确定的曲线上的,对应u的点是31,如图,黄色三角形所示。

根据上面所述,通过给定一组u值,便可以计算出贝塞尔曲线上的坐标序列,从而绘制出贝塞尔曲线。

view plain to clipboardprint?
// arrayCoordinate为控制点

void CChildView::DrawBezier(CDC *pDC, const CArray<CPoint, CPoint>& arrayCoordinate)

{

int n = 0;

if((n = arrayCoordinate.GetSize()) < 2)

return;

double *xarray = new double[n - 1];

double *yarray = new double[n - 1];

double x = arrayCoordinate.GetAt(0).x;

double y = arrayCoordinate.GetAt(0).y;

for(double t = 0.0; t <=1; t += 0.05 / n) // 调整参数t,计算贝塞尔曲线上的点的坐标,t即为上述u

{

for(int i = 1; i < n; ++i)

{

for(int j = 0; j < n - i; ++j)

{

if(i == 1) // i==1时,第一次迭代,由已知控制点计算

{

xarray[j] = arrayCoordinate.GetAt(j).x * (1 - t) + arrayCoordinate[j + 1].x * t;

yarray[j] = arrayCoordinate.GetAt(j).y * (1 - t) + arrayCoordinate[j + 1].y * t;

continue;

}

// i != 1时,通过上一次迭代的结果计算

xarray[j] = xarray[j] * (1 - t) + xarray[j + 1] * t;

yarray[j] = yarray[j] * (1 - t) + yarray[j + 1] * t;

}

}

pDC->MoveTo(x, y);

pDC->LineTo(xarray[0], yarray[0]);

x = xarray[0];

y = yarray[0];

}

delete [] xarray;

delete [] yarray;

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Fioman/archive/2008/06/23/2578895.aspx

java 三次贝塞尔曲线 怎么确定控制点

只是第二点和第三点的坐标而已,肯定有算法。具体看你要实现什么业务。

❺ 拟合贝塞尔曲线算法

是用贝塞尔曲线拟合。参考WinSDK中PolyBezierTo函数。 /* *by Z */ int CalcCtrlPoint(POINT P0,POINT P1,POINT P2,POINT *C)//C为P1与P2之间

❻ 复盘模型:控制点(基于最近的小一级时间段内的12个控制点的分形插值计算)是啥意思

英文原话是:control points ( a very crude method based on the nearest less timeframe, the results must not be considered)
翻译过来就是:控制点(一种非常粗糙的方法,基于最接近的较短时间,不得考虑结果)
EA实际使用结果和这个选项的测试结果有差距,建议用低两级时间段测试,如果是基于5M的EA,就干脆别用这个选项,因为根本没有比1M更低的时间段了!

❼ 拟合贝塞尔曲线算法 (50分)

这里有篇文章是算法的C实现

http://hi..com/roooy/blog/item/5336d7dee09f9e50ccbf1a01.html

❽ gis中为什么空间校正链接越多或控制点越多越校正结果越精确

不知道怎么解释好,它具体实现是有一套算法的,里面有很多数学方法,控制点是固定的,地图却存在误差,添加控制点后影像重采集就是把误差尽可能均匀地分布,当然就精确了

❾ 控制点的研究生只研究算法会不会不好找工作

你就算是被录取了,再参加调剂复试就没意义了!反之,如果调剂学校先发待录取通知,你有意向并且回复确认了,那你就没希望上一志愿的学校了。所以回复要慎重,考虑清楚再确认要怎么表达感谢呢?对于农民,我们可以怎么做呢?我们可以把他们种的米饭吃完,我们可以把他们种的蔬菜水果吃完,这就是对他们真正的感谢,爱心妈妈呢?当我们借完书,可以跟他们说声谢谢,当我们过马路,可以跟他们说声早,当我们有活动,也别忘记他们,这么做是我们可以对他们的感谢,而警察呢?我们如果管好自己,不犯罪他们也会轻松点,我们也可以遵守交通号志来过马路,做了这些,是我们暂时可以做的,只要心理存着感激,他们都会感受到。

❿ 请问两个顶点为刚性固定,中间一个控制点的贝塞尔曲线,是否可以用公式表达出来

定义贝塞尔曲线的控制点Pi编号为0i,其中,0表示是第0次迭代。当第一、二上述直观的算法描述可以表达成一个计算方法。 首先,将所有给定的控制点排列

热点内容
狂三脚本 发布:2024-11-15 17:31:38 浏览:871
附近存储柜 发布:2024-11-15 17:15:17 浏览:451
王选解决汉字存储问题 发布:2024-11-15 17:15:11 浏览:659
球球大作战安卓为什么不能玩哪些模式 发布:2024-11-15 17:14:26 浏览:995
存储器讲课 发布:2024-11-15 17:14:12 浏览:195
安卓充电头怎么称呼 发布:2024-11-15 17:11:17 浏览:445
猎人手游源码 发布:2024-11-15 17:09:28 浏览:432
qt资源图片编译 发布:2024-11-15 16:59:26 浏览:665
编译选项保护范围最广 发布:2024-11-15 16:57:47 浏览:605
c语言中的除号 发布:2024-11-15 16:51:09 浏览:215