1、计算机图形学画直线制作过程本次程序是计算机图形学老师刚刚布置的一道作业,要求我们画出任意直线的点阵图。在这里分享下制作的过程及效果,希望有兴趣各位朋友能够及时提醒我其中的不足,谢谢!步骤:(一)打开VC+6.0,创建一个MFC AppWizard(exe),工程名为:jask_jd_Line,选择但文档类型,在应用程序向导第六步将基类改为“CFormView”,单击“完成”,创建完成。(二)创建一个新对话框IDD_DLG_INPUT,用来输入直线方程。并添加控件如下:控件名称控件ID 控件标题组框IDC_STATIC 方程式:静态文本IDC_STATICY=编辑框IDC_EDIT1静态文本ID
2、C_STATICX+编辑框IDC_EDIT_SEND静态文本IDC_EDIT2按钮IDOK确定按钮IDCANCEL取消如图:(三)用类向导为对话框IDD_DLG_INPUT创建一个新类CFuncInput,并为控件添加变量:(四)在CFuncInput:DoDataExchange(CDataExchange* pDX)函数中添加如下代码初始化对话框变量值:(这样当弹出对话框时就编辑框中就会有初始值,当然这个也可以不要)SetDlgItemText(IDC_EDIT1,1); SetDlgItemText(IDC_EDIT2,0);(五)打开ResourceView进入Menu项,(删除默认的
3、菜单项,左键单机菜单主项,按Delete就可以了,但是别全部删除了,不然这个菜单会消失的,之后就是编译会出问题,在全部删除之前添加菜单“操作”,这个不用多介绍吧,如下:IDM_DRAWLINE 画线(&D)IDM_NEW 刷新(&N)IDM_COLOR 颜色(&C)(六)用类向导为这三个菜单ID添加响应函数,并添加代码如下:void CTask_jd_LineView:OnDrawline() /主要的函数,根据输入的方程式进行绘制直线 / TODO: Add your command handler code here CFuncInput dlg; /这里注释下,要在task_jd_Lin
4、eView.h文件中添加#includeFuncInput.h包含新建的类 if(dlg.DoModal()=IDOK) float k,c; k=StringtoInt(dlg.m_k); c=StringtoInt(dlg.m_c);/这个StringtoInt是自己定义的函数,代码见后文 CDC *pDC=GetDC(); CBrush brush(Color); CBrush *old=pDC-SelectObject(&brush); CRect rt; GetClientRect(&rt); if(k=0&k=1) /斜率大于0且小于1 int x=-(rt.Width()/2)/
5、10; int y=(int)(k*x+c+0.5); float e=k*x+c-y-0.5; for(int i=0;iEllipse(rt.Width()/2+x*10-3,rt.Height()/2-y*10-3,rt.Width()/2+x*10+3,rt.Height()/2-y*10+3); x+; e+=k; if(e=0) y+; e-; else if(k=-1&k0) /斜率大于-1且小于0 int x=-(rt.Width()/2)/10; int y=(int)(k*x+c+0.5); float e=k*x+c-y+0.5; for(int i=0;iEllipse
6、(rt.Width()/2+x*10-3,rt.Height()/2-y*10-3,rt.Width()/2+x*10+3,rt.Height()/2-y*10+3); x+; e+=k; if(e1) /斜率大于1 int y=-(rt.Height()/2)/10; int x=(int)(y-c)/k+0.5); float e=(y-c)/k-x-0.5; for(int i=0;iEllipse(rt.Width()/2+x*10-3,rt.Height()/2-y*10-3,rt.Width()/2+x*10+3,rt.Height()/2-y*10+3); y+; e+=1/k;
7、 if(e=0) x+; e-; else /斜率小于-1 int y=-(rt.Height()/2)/10; int x=(int)(y-c)/k+0.5); float e=(y-c)/k-x+0.5; for(int i=0;iEllipse(rt.Width()/2+x*10-3,rt.Height()/2-y*10-3,rt.Width()/2+x*10+3,rt.Height()/2-y*10+3); y+; e+=1/k; if(e0) x-; e+; else void CTask_jd_LineView:OnNew() / TODO: Add your command ha
8、ndler code here Invalidate(); CDC* pDC=GetDC(); CTask_jd_LineView:OnDraw(pDC);void CTask_jd_LineView:OnColor() / TODO: Add your command handler code here CColorDialog ColorDialog; /定义颜色对话框对象 if (ColorDialog.DoModal()=IDOK) Color=ColorDialog.GetColor();/*Color在class CTask_jd_LineView中定义:Private:COLOR
9、REF Color;并在void CTask_jd_LineView:OnInitialUpdate()中初始化为:Color=RGB(250,0,0);*/ (七)添加函数将字符串转变成浮点数,函数如下:float StringtoInt(CString str) /将字符串转换成浮点数 float result=0; int dot=0; int d=10; int symbol=1; for(int i=0;i=0&str.GetAt(i)=0&str.GetAt(i)SelectObject(&pen); pDC-MoveTo(Mpoint.x-1,0); pDC-LineTo(Mpo
10、int.x-1,rt.Height(); pDC-MoveTo(0,Mpoint.y-1); pDC-LineTo(rt.Width(),Mpoint.y-1); pDC-SelectObject(pOldPen); /*坐标系(细线)*/ CPen pen1; pen1.CreatePen(PS_SOLID,1,RGB(180,120,0); pOldPen=pDC-SelectObject(&pen1); for(int i=Mpoint.x+10;iMoveTo(i,0); pDC-LineTo(i,rt.Height(); for(i=Mpoint.x-10;i0;i-=10) pDC
11、-MoveTo(i,0); pDC-LineTo(i,rt.Height(); for(i=Mpoint.y+10;iMoveTo(0,i); pDC-LineTo(rt.Width(),i); for(i=Mpoint.y-10;i0;i-=10) pDC-MoveTo(0,i); pDC-LineTo(rt.Width(),i); pDC-SelectObject(pOldPen); (九)到现在为止,应该就可以运行成功了。在我的代码里还添加了一些元素,让界面更好看:在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中删除(工具栏
12、):if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY| CBRS_SIZE_DYNAMIC) | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) TRACE0(Failed to create toolbarn); return -1; / fail to create 和m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDock
13、ing(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);在BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)中添加:cs.lpszName = _T( 绘制任意直线 ); cs.style = WS_OVERLAPPEDWINDOW; cs.cx=500; cs.cy=400; return TRUE;修改static UINT indicators =/ ID_SEPARATOR, / status line indicator /ID_INDICATOR_CAPS, /ID_INDICATOR_NU
14、M, /ID_INDICATOR_SCRL, IDS_INDICATOR_MOUSE /*在String Table中双击最后的空白行,添加ID:IDS_INDICATOR_MOUSE,标题:“ 当前坐标是: “不要忽略这些空格哈,不然没那么好看的,具体的各位自己调整*/;(十)用ClassWizard天机鼠标移动响应函数,并将鼠标位置所在的坐标显示在状态栏上,代码如下:void CTask_jd_LineView:OnMouseMove(UINT nFlags, CPoint point) /显示当前鼠标在该坐标系中的坐标 / TODO: Add your message handler c
15、ode here and/or call default CStatusBar*pFrame=(CStatusBar*)AfxGetMainWnd(); CStatusBar*pStatusBar=(CStatusBar*)pFrame-GetDescendantWindow(AFX_IDW_STATUS_BAR); CString strMousePoint; strMousePoint.Format(t当前坐标为: x=%1.2f, y=%1.2f,1.0*(point.x-Mpoint.x)/10,1.0*(Mpoint.y-point.y)/10); pStatusBar-SetPan
16、eText(pStatusBar-CommandToIndex(IDS_INDICATOR_MOUSE),strMousePoint); CFormView:OnMouseMove(nFlags, point);(十一)这下真的没问题了,下面大家看看我运行的几个截图效果:1、鼠标放上之前:2、鼠标放上之后:3、点击菜单“画线(&D)”后:4、单机确定后:5、点击菜单“刷新(&N)”后返回图2,点击菜单“颜色(&C)”后:6、选择绿色,点击“确定”,再点击菜单“画线”,改变编辑框的内容:7、点击“确定”后:8、点击“颜色”选择粉红,确定,点击画线,改变对话框值:9、点击“确定”后:10、当然鼠标在上面移动式,状态栏的变化是没法截图过来的,就不演示了,有兴趣的做出来后就看得到了,就到此为止吧,还请多多指教!
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2