C++ B样条曲线

B样条曲线

基于EasyX图形库

鼠标左键点击选取初始四个点,生成B样条曲线
之后左键点击选取点拉伸或平移变换。

#include
#include
#include 
using namespace std;struct CP2
{double x;double y;
};void CreatBLine( CP2 p[] )
{double x,y,t,F[4];int i,j;for(i=0;i<=1000;i++){t=(double)i/1000;F[0]= 1 - 3*t + 3*t*t - t*t*t;F[1]= 4 - 6*t*t + 3*t*t*t;F[2]= 1 + 3*t + 3*t*t - 3*t*t*t;F[3]= t*t*t;x=y=0;for(j=0; j<4; j++){x+=F[j]*p[j].x;y+=F[j]*p[j].y;}x/=6;y/=6;putpixel(x,y,YELLOW);}}void CreatLine( CP2 p[] )
{for(int i=0; i<4; i+=2){setcolor(RED);line( p[i].x, p[i].y, p[(i+1)].x,  p[(i+1)].y );setcolor(GREEN);setfillcolor(GREEN);fillcircle(p[i].x, p[i].y,2);fillcircle( (p[i].x+p[(i+1)].x)/2 , (p[i].y+p[(i+1)].y)/2, 2);fillcircle(p[(i+1)].x,  p[(i+1)].y,2);}
}int main()
{CP2 p[4],dP,oldP;int i,j,n=0 ;i = j = 0;initgraph(1000, 600,SHOWCONSOLE);ExMessage m;// 获取一条鼠标消息while(1){m=getmessage(EM_MOUSE);if(m.message == WM_LBUTTONDOWN){			//左键摁下获取数据p[n].x=m.x;p[n].y=m.y;cout<<p[n].x<<"  "<<p[n].y<<endl;n++;if(n==4)break;}}CreatLine(p);CreatBLine(p);while(1){m=getmessage(EM_MOUSE);if(m.message == WM_LBUTTONDOWN ){	oldP.x=m.x;oldP.y=m.y;for(i=0;i<4;i++){if( abs(oldP.x-p[i].x)<3 && abs(oldP.y-p[i].y)<3 )break;}	while(i!=4){m=getmessage(EM_MOUSE);if(m.message == WM_LBUTTONUP)break;else if(m.message == WM_MOUSEMOVE){cleardevice();p[i].x=m.x;p[i].y=m.y;CreatLine(p);CreatBLine(p);}}if (i == 4){for (j = 0; j < 4; j += 2){if (abs(oldP.x - (p[j].x + p[(j + 1)].x) / 2) < 3 && abs(oldP.y - (p[j].y + p[(j + 1)].y) / 2) < 3)break;}while (j != 4){m = getmessage(EM_MOUSE);if (m.message == WM_LBUTTONUP)break;else if (m.message == WM_MOUSEMOVE){cleardevice();dP.x = m.x - (p[j].x + p[(j + 1)].x) / 2;dP.y = m.y - (p[j].y + p[(j + 1)].y) / 2;p[j].x += dP.x;p[j].y += dP.y;p[(j + 1)].x += dP.x;p[(j + 1)].y += dP.y;CreatLine(p);CreatBLine(p);}}}}else continue;}closegraph();return 0;
}

C++ Bezier曲线

C++ B样条曲线

C++ Hermite曲线


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部