用C语言实现一个基于B样条的算法

Python012

用C语言实现一个基于B样条的算法,第1张

不可能给你编出“机器手”程序。

这是绘图“机器手”控制程序介绍。

墨水浓度3种,笔的控制:平面坐标,角度,压力,起终点,轨迹,洗笔,甩笔,沾墨。

竹的基本参数:节,干,叶,枝先由画家的图,分解获得。曲线用离散点控制。每4点为一个B样条,非控制点坐标在4点之间,用4点B样条函数计算,t是参数(曲线参数方程的位置参数,例如在30%的地方,t=0%到100%,或用每4点的q[i],q[i+1]计算)。

B样条上的每个点都是可以算出来的么 -- B样条 是内插函数,已知控制点,插非控制点,笔按此走。

B样条内插程序很容易写。但并不解决你的控制机器人(手)画竹子的问题。你提供的文章作者是两个中国人,用英文写的,很容易读。

voidCGraph151View::seekPoint(intk)//表示k阶2{3CPoint *interim//存储B样数组指针4CDC *pDC =GetDC()5CGraph151Doc *pDoc = GetDocument()//6intj = pDoc->Length-17intlength=1.0/0.001//B样曲线的点的个数8interim =newCPoint[length]//保存B样曲线点9intindex_length=0//记录interim数组下一个下标10//画控制点图11pDC->MoveTo(pDoc->m_point[0])12for(intn=0n<pDoc->Lengthn++)13{14pDC->LineTo(pDoc->m_point[n])15pDC->MoveTo(pDoc->m_point[n])16}17///结束1819for(floatt=pDoc->T[0]t<pDoc->T[pDoc->T_Length-1]t +=0.001)20{21inti22chushihua()//还原m_point 和 im_point点数组使与初始化相同23for(intr=1r<kr++)24{25guodian()//更新一下m_point点数组 的数据26for( i=ri<=ji++)27{28floatpara129floatpara23031if( (pDoc->T[i+k-r] - pDoc->T[i]) !=0.0)32{33para1 = (t - pDoc->T[i]) / (pDoc->T[i+k-r] - pDoc->T[i])34para2 = (pDoc->T[i+k-r] - t) /(pDoc->T[i+k-r] - pDoc->T[i])35}36else37{38para1=0.039para2=0.040}4142intx =int( (para1 * pDoc->m_point[i].x) + (para2 * pDoc->m_point[i-1].x) )43inty =int( (para1 * pDoc->m_point[i].y) + (para2 * pDoc->m_point[i-1].y) )44pDoc->im_point[i].SetPoint(x,y)45}4647}4849interim[index_length++].SetPoint( pDoc->im_point[3].x,pDoc->im_point[3].y)//存储计算出的点50}5152//画图 B样曲线53CPen pen(PS_SOLID,1,RGB(255,0,0))54pDC->SelectObject(pen)55pDC->MoveTo(interim[0])56for(intn=0n<lengthn++)57{58pDC->LineTo(interim[n])59pDC->MoveTo(interim[n])60}61//B样曲线画图结束62}