第五章曲线和曲面Word文档下载推荐.docx
- 文档编号:15687941
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:71
- 大小:630.36KB
第五章曲线和曲面Word文档下载推荐.docx
《第五章曲线和曲面Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第五章曲线和曲面Word文档下载推荐.docx(71页珍藏版)》请在冰豆网上搜索。
(2)添加消息处理函数。
利用ClassWizard(类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CHermiteView,根据表1建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。
表1菜单项的消息处理函数
标示符ID
消息
消息处理函数
CHermiteView
WM_LBUTTONDOWN
OnLButtonDown(UINTnFlags,CPointpoint);
WM_LBUTTONUP
OnLButtonUp(UINTnFlags,CPointpoint);
WM_MOUSEMOVE
OnMouseMove(UINTnFlags,CPointpoint);
(3)添加函数。
在工程中添加应用函数的方法,这里先在HermiteView.h中声明需要使用的函数名称,然后再在HermiteView.cpp中定义此函数。
//HermiteView.h:
interfaceoftheCHermiteViewclass
//
/////////////////////////////////////////////////////////////////////////////
constintN=3;
//N次Hermite曲线
constintnpoints=50;
//由npoints+1个点构成的折线逼近Hermite曲线
classPoint//二维平面点Point类
{
public:
doublex,y;
//二维平面中的点坐标为双精度浮点小数
Point(){x=0;
y=0;
};
//构造函数
Point(double_x,double_y){x=_x;
y=_y;
Point(CPointp){x=p.x;
y=p.y;
inlinePointoperator=(Pointp){x=p.x;
return(*this);
//Point对象的赋值运算
inlinePointoperator=(CPointp){x=p.x;
//CPoint对象的赋值运算
inlinePointoperator+=(Pointp){x+=p.x;
y+=p.y;
//重载+=运算
inlinePointoperator+=(CPointp){x+=p.x;
inlinePointoperator-=(Pointp){x-=p.x;
y-=p.y;
//重载-=运算
inlinePointoperator-=(CPointp){x-=p.x;
inlinePointoperator*=(doubles){x*=s;
y*=s;
//重载*=运算
inlinePointoperator/=(doubles){x/=s;
y/=s;
//重载/=运算
inlinePointoperator+(Pointp){Pointt;
t.x=x+p.x;
t.y=y+p.y;
return(t);
//重载+运算
inlinePointoperator+(CPointp){Pointt;
inlinePointoperator-(Pointp){Pointt;
t.x=x-p.x;
t.y=y-p.y;
//重载-运算
inlinePointoperator-(CPointp){Pointt;
inlinePointoperator*(doubles){Pointt;
t.x=x*s;
t.y=y*s;
//重载*运算
inlinePointoperator/(doubles){Pointt;
t.x=x/s;
t.y=y/s;
//重载/运算
inlineoperatorCPoint(){returnCPoint((int)x,(int)y);
//类型强制转换运算
classCHermiteView:
publicCView
......
intm_nCount;
//记录鼠标左键按下的次数
CPointm_Newpoint;
//记录鼠标移动时的位置坐标
PointptControlPts[N+1];
//曲线控制点坐标
PointptPts[npoints+1];
//逼近曲线的折线点坐标
voidhermite_to_points(PointCP[],Pointpts[],intnpoints);
//计算Hermite曲线上各点的坐标值
Pointhermite(PointV[],doubleu);
//计算Hermite曲线在参数为u的坐标值
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CHermiteView)
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
//HermiteView.cpp:
implementationoftheCHermiteViewclass
CHermiteView:
:
CHermiteView()
m_nCount=0;
//鼠标左键按下的次数初始化为0
}
voidCHermiteView:
OnLButtonDown(UINTnFlags,CPointpoint)
ptControlPts[m_nCount]=point;
//保存鼠标左键按下的当前位置
m_Newpoint=point;
//存放画线的起始位置
m_nCount=(++m_nCount)%(N+1);
//记录鼠标左键按下的次数,次数>
=N+1时,归零
CView:
OnLButtonDown(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
inti;
if(m_nCount==0)//m_nCount为0时,说明鼠标左键按下的次数为N+1的整数倍,绘制曲线
{
CClientDCdc(this);
CPenpen,*oldpen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
//创建红色实线画笔,线宽为1
oldpen=dc.SelectObject(&
pen);
//选择新画笔
hermite_to_points(ptControlPts,ptPts,npoints);
//当控制点的个数满足要求时,计算Hermite曲线上各点位置
dc.MoveTo(ptPts[0]);
//将Hermite曲线上各点位置相连,绘制Hermite曲线
for(i=1;
i<
npoints;
i++)
dc.LineTo(ptPts[i]);
dc.SelectObject(oldpen);
//恢复老画笔
}
OnLButtonUp(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
if(m_nCount>
0&
&
m_nCount<
=N&
m_nCount%2==1)//绘制曲线起点和终点的切向量
dc.SetROP2(R2_NOT);
//设置绘图模式,以屏幕颜色的相反色绘图
//以重绘的方式擦除前一个OnMouseMove绘制的直线
dc.MoveTo((CPoint)ptControlPts[m_nCount-1]);
//擦除前面刚绘制的一条直线
dc.LineTo(m_Newpoint);
//从起始位置到当前位置绘制一条新的直线
dc.LineTo(point);
m_Newpoint=point;
//存放当前鼠标位置
//输入参数CP为控制点坐标
//控制点CP的个数为N+1
//输出参数为Hermite曲线上的离散点序列pts
//离散点pts的个数为npoints+1
hermite_to_points(PointCP[],Pointpts[],intnpoints)
doubleu,delt;
PointP[N+1],V[N+1];
delt=1/(double)(npoints);
//将参数u变化区间进行npoints等分
u=0;
//Hermite矩阵与控制点坐标相乘,得到V
P[0]=CP[0];
P[1]=CP[2];
P[2]=CP[1]-CP[0];
P[3]=CP[3]-CP[2];
V[0]=P[0]*2-P[1]*2+P[2]+P[3];
V[1]=P[0]*(-3)+P[1]*3-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 曲线 曲面