大家好,欢迎来到IT知识分享网。
原理:
http://www.cnblogs.com/jqm304775992/p/5044728.html
//矩阵乘法
void mul(float *c, float *a, float *b, int row, int rc, int col)
{
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
float t = 0;
for(int k=0; k<rc; k++)
t += a[i*rc+k] * b[k*col+j];
c[i*col+j] = t;
}
}
}
void hermite(CDC *pdc)
{
int nctlPoints = 6; //控制点数
int nPoints = 100; //每段曲线的点数
//控制点
float Px[] = {
320, 400, 480, 560, 640, 700};
float Py[] = {
280, 120, 50, 120, 280, 300};
//控制多边形
pdc->MoveTo(Px[0], Py[0]);
for(int i=0; i<nctlPoints; i++)
pdc->LineTo(Px[i], Py[i]);
//曲线
CPen newPen(PS_SOLID, 2, RGB(255, 0, 0));
pdc->SelectObject(&newPen);
float M[4][4] =
{
{
2, -2, 1, 1},
{-3, 3, -2, -1},
{
0, 0, 1, 0},
{
1, 0, 0, 0}
};
float delta = 1.0 / nPoints;
for(i=0; i<nctlPoints-3; i+=2) //完成整个曲线的连接
{
//设定矩阵G
float G1[4][1] = {
{Px[i]}, {Px[i+2]}, {Px[i+1]-Px[i]}, {Px[i+3]-Px[i+2]}};
float G2[4][1] = {
{Py[i]}, {Py[i+2]}, {Py[i+1]-Py[i]}, {Py[i+3]-Py[i+2]}};
for(float t=0; t<=1; t+=delta)
{
//设定矩阵T
float T[4];
for(int k=0; k<=3; k++)
T[3-k] = pow(t, k);
//计算
float tmp[4][1], x[1], y[1];
mul((float *)tmp, (float *)T, (float *)M, 1, 4, 4);
mul((float *)x, (float *)tmp, (float *)G1, 1, 4, 1);
mul((float *)y, (float *)tmp, (float *)G2, 1, 4, 1);
if(t == 0)
pdc->MoveTo(x[0], y[0]);
else
pdc->LineTo(x[0], y[0]);
}
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24477.html