C语言课程设计三角形.docx
- 文档编号:10460928
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:44
- 大小:336.79KB
C语言课程设计三角形.docx
《C语言课程设计三角形.docx》由会员分享,可在线阅读,更多相关《C语言课程设计三角形.docx(44页珍藏版)》请在冰豆网上搜索。
C语言课程设计三角形
《C++程序设计》课程设计
一、目的
在《C++程序设计》课程学习和课程实验的基础上,利用VisualC++6.0MFC编程,实现一个交互绘图程序。
通过一定代码量的实际编程,巩固、加深C++概念的理解,提高面向对象编程技术的水平和熟练度,检验《C++程序设计》课程的学习效果,为后续专业课程的学习奠定程序设计基础。
二、任务与要求
利用VisualC++6.0MFC编程创建单文档多视应用程序框架,用鼠标点击屏幕交互生成三角形,并绘制三角形的外接圆和内切圆,程序运行界面参见下图。
要求:
(1)用链表记录生成的三角形;
(2)三角形类中包含顶点、边长、外接圆半径、内切圆半径及圆心等数据成员;
(3)生成的三角形可以存盘/读出。
程序的基本代码量约为500行,在此基础上可进一步发挥个人的想象力、创造力,为程序添加新的功能,使程序的总量大于1000行。
供参考的功能有:
(1)图形的放大与缩小;
(2)图形的移动/旋转/拷贝;
(3)三角形质量的统计分析(内切圆半径与最长边之比);
(4)三角形信息的列表显示;
(5)修改图形的线型/线宽/颜色等。
三、步骤与参考资料
(1)创建单文档、多视应用程序框架;
(2)设计点、线段、三角形类(CPoint2D、CLine、CTriangle代码参见附录);
(3)设计菜单:
在WorkSpace中选ResourceView的“Menu”,双击IDR_MAINFRAME,就会出现主菜单,在其中添加如图所示的菜单项。
(4)菜单命令映射:
给每个子菜单取一个合适的ID号,如:
ID_MENU_DRAW_TRIANGLE、ID_MENU_DISPLAY、ID_MENU_SAVE_TRIANGLE、ID_MENU_READ_TRIANGLE,在子菜单上击鼠标右键,选ClassWizard,选菜单的ID号,再选Command,最后点击AddFunction按钮,添加消息映射函数。
依次添加所有菜单命令的消息映射函数。
(5)鼠标消息映射:
在具体实现各个子菜单的消息映射函数前,本例需要解决生成三角形的问题。
用鼠标在视口中交互绘制三角形需要映射鼠标动作的消息响应函数,在ClassWizard中选择视口类添加鼠标左键、右键、移动WM_LBUTTONDOWN、WM_RBUTTONDOWN、WM_MOUSEMOVE的响应函数,其中要自己写入交互画三角形的代码,重点是鼠标移动过程中的异或;鼠标消息是标准的,直接从对话框右列表框中选。
(6)响应鼠标动作交互画三角形的代码:
voidCTriangleView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{//以下均为自己添加的程序代码
CPoint2Dp;
CDC*pDC=GetDC();
CPennewpen(PS_SOLID,1,RGB(0,255,255));
CPen*pOldpen=pDC->SelectObject(&newpen);
pDC->SetROP2(R2_XORPEN);//异或状态画图
if(drawflag==1)//表示进入画图状态
{
p.x=point.x;p.y=point.y;
if(Pointnum%3==0)
pTriangle=newCTriangle;
//画十字
pDC->MoveTo(point.x,point.y-5);pDC->LineTo(point.x,point.y+5);
pDC->MoveTo(point.x-5,point.y);pDC->LineTo(point.x+5,point.y);
if(Pointnum==0)//第一次点击鼠标左键
{
pTriangle->setTriVertax(p);
Pointnum++;
pDC->MoveTo(pTriangle->p1.x,pTriangle->p1.y);
pTriangle->p2.x=point.x;pTriangle->p2.y=point.y;
pDC->LineTo(pTriangle->p2.x,pTriangle->p2.y);
}
elseif(Pointnum==1)//第二次点击鼠标左键
{
pTriangle->p2.x=point.x;pTriangle->p2.y=point.y;
Pointnum++;
}
else//第三次点击鼠标左键
{
pTriangle->setTriVertax(p);
//把十字异或
pDC->MoveTo(pTriangle->p1.x,pTriangle->p1.y-5);pDC->LineTo(pTriangle->p1.x,pTriangle->p1.y+5);
pDC->MoveTo(pTriangle->p1.x-5,pTriangle->p1.y);pDC->LineTo(pTriangle->p1.x+5,pTriangle->p1.y);
pDC->MoveTo(pTriangle->p2.x,pTriangle->p2.y-5);pDC->LineTo(pTriangle->p2.x,pTriangle->p2.y+5);
pDC->MoveTo(pTriangle->p2.x-5,pTriangle->p2.y);pDC->LineTo(pTriangle->p2.x+5,pTriangle->p2.y);
pDC->MoveTo(pTriangle->p3.x,pTriangle->p3.y-5);pDC->LineTo(pTriangle->p3.x,pTriangle->p3.y+5);
pDC->MoveTo(pTriangle->p3.x-5,pTriangle->p3.y);pDC->LineTo(pTriangle->p3.x+5,pTriangle->p3.y);
pTriangle->draw();//画三角形
m_pdlg=newCDlgTriangle(this);
CStringstr1,str2,str3,str4,str5,str6,str7,str8,str9,str10;
str1.Format("%.2f",pTriangle->a);m_pdlg->m_a=str1;
str2.Format("%.2f",pTriangle->b);m_pdlg->m_b=str2;
str3.Format("%.2f",pTriangle->c);m_pdlg->m_c=str3;
str4.Format("%.2f",pTriangle->RcenPoint.x);m_pdlg->m_Rx=str4;
str5.Format("%.2f",pTriangle->RcenPoint.y);m_pdlg->m_Ry=str5;
str6.Format("%.2f",pTriangle->R);m_pdlg->m_R=str6;
str7.Format("%.2f",pTriangle->rcenPoint.x);m_pdlg->m_rx=str7;
str8.Format("%.2f",pTriangle->rcenPoint.y);m_pdlg->m_ry=str8;
str9.Format("%.2f",pTriangle->r);m_pdlg->m_r=str9;
m_pdlg->m_x1=pTriangle->p1.x;
m_pdlg->m_y1=pTriangle->p1.y;
m_pdlg->m_x2=pTriangle->p2.x;
m_pdlg->m_y2=pTriangle->p2.y;
m_pdlg->m_x3=pTriangle->p3.x;
m_pdlg->m_y3=pTriangle->p3.y;
str10.Format("%.2f",pTriangle->triArea());m_pdlg->m_s=str8;
m_pdlg->Create(IDD_TRIANGLE,this);
CTriangleDoc*pDoc=GetDocument();
if(pDoc->ptrHead==NULL)
{
pDoc->ptrHead=pTriangle;
pTriangle->last=pTriangle;
}
else
{
pDoc->ptrHead->last->next=pTriangle;
pTriangle->last=pDoc->ptrHead->last;
pDoc->ptrHead->last=pTriangle;
}
pTriangle->next=pDoc->ptrHead;
Pointnum=0;
}
}
pDC->SelectObject(pOldpen);
CView:
:
OnLButtonDown(nFlags,point);
}
///右击之后不再画图drawflag变为0
voidCTriangleView:
:
OnRButtonDown(UINTnFlags,CPointpoint)
{
if(drawflag)
{
drawflag=0;
Pointnum=0;
}
CView:
:
OnRButtonDown(nFlags,point);
}
voidCTriangleView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{//鼠标移动过程中,总是先异或前次画的图,再画新位置的图,交替更换就形成动态
if(drawflag==1&&(Pointnum==1||Pointnum==2))
{
CClientDCdc(this);
CPenpen(PS_SOLID,1,RGB(0,255,255));
CPen*pOldpen=dc.SelectObject(&pen);
dc.SetROP2(R2_XORPEN);
if(Pointnum==1)
{
dc.MoveTo(pTriangle->p1.x,pTriangle->p1.y);
dc.LineTo(pTriangle->p2.x,pTriangle->p2.y);
pTriangle->p2.x=point.x;pTriangle->p2.y=point.y;
dc.MoveTo(pTriangle->p1.x,pTriangle->p1.y);
dc.LineTo(point.x,point.y);
}
else
{
dc.MoveTo(pTriangle->p2.x,pTriangle->p2.y);
dc.LineTo(pTriangle->p3.x,pTriangle->p3.y);
dc.MoveTo(pTriangle->p1.x,pTriangle->p1.y);
dc.LineTo(pTriangle->p3.x,pTriangle->p3.y);
pTriangle->p3.x=point.x;pTriangle->p3.y=point.y;
dc.MoveTo(pTriangle->p2.x,pTriangle->p2.y);
dc.LineTo(pTriangle->p3.x,pTriangle->p3.y);
dc.MoveTo(pTriangle->p1.x,pTriangle->p1.y);
dc.LineTo(pTriangle->p3.x,pTriangle->p3.y);
}
dc.SelectObject(pOldpen);
}
CView:
:
OnMouseMove(nFlags,point);
}
(7)对话框显示生成三角形的信息
voidCTriangleView:
:
OnDisplay()
{
m_pdlg->ShowWindow(SW_SHOW);//本例用的是无模式对话框,可用有模式对话框//自己写
}
(8)链表保存与读出
voidCTriangleView:
:
OnFilesave()
{
CStringfilename;
CFileDialogdlg(FALSE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"txt文件(*.txt)|*.txt|AllFiles(*.*)|*.*||");
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
}
else
return;
//此处自己添加写链表数据的代码
}
voidCTriangleView:
:
OnRead()
{
CStringfilename;
CFileDialogdlg(TRUE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"txt文件(*.txt)|*.txt|AllFiles(*.*)|*.*||");
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
}
else
return;
//此处自己添加读链表数据的代码
CClientDCdc(this);
this->OnDraw(&dc);
}
四、课程设计评估
序号
内容
比例
要求
1
课程设计报告与文档
30%
2
程序运行的有效性
50%
3
程序设计规范性
10%
4
程序注释
10%
注:
最终评分=上述表项得分×系数(代码量、功能)
五、供参考的资料
(备注:
下列代码仅供参考,不一致或不合理之处可在课程设计当中加以改进)
链表节点类的设计
classEsLinkNode
{
public:
EsLinkNode*next,*last;
public:
EsLinkNode();
virtual~EsLinkNode();
EsLinkNode*GetNext();
EsLinkNode*GetLast();
voidLinkAfter(EsLinkNode*newNode);
voidLinkBefore(EsLinkNode*newNode);
//virtualEsLinkNode*NewNode();
friendclassEsLink;
public:
virtualBOOLRead(FILE*pfile);
virtualBOOLWrite(FILE*pfile);
};
链表节点类的实现
EsLinkNode:
:
EsLinkNode()
{
next=(EsLinkNode*)NULL;
last=(EsLinkNode*)NULL;
//LinkNodespecificinitializationgoeshere
}
//destructfunction
EsLinkNode:
:
~EsLinkNode()
{
next=(EsLinkNode*)NULL;
last=(EsLinkNode*)NULL;
}
EsLinkNode*EsLinkNode:
:
GetNext()
{
returnnext;
}
EsLinkNode*EsLinkNode:
:
GetLast()
{
returnlast;
}
voidEsLinkNode:
:
LinkAfter(EsLinkNode*newNode)
{
newNode->next=next;
next=newNode;
newNode->last=this;
newNode->next->last=newNode;
}
voidEsLinkNode:
:
LinkBefore(EsLinkNode*newNode)
{
newNode->last=last;
last=newNode;
newNode->next=this;
newNode->last->next=newNode;
}
BOOLEsLinkNode:
:
Read(FILE*pfile)
{
returnTRUE;
}
BOOLEsLinkNode:
:
Write(FILE*pfile)
{returnTRUE;
}
CPoint2D类的设计
classCPoint2D:
publicCObject
{
public:
doublex,y;
public:
CPoint2D(){x=-1e10;y=-1e10;}
CPoint2D(doublex,doubley){this->x=x;this->y=y;}
~CPoint2D(){}
voidoperator=(CPoint2D&p){x=p.x;y=p.y;}
};
CLine类的设计
classCLine:
publicCObject
{
public:
doubleA,B,C;//直线方程系数
public:
CLine(){A=0;B=0;C=0;}
CLine(doubleNA,doubleNB,doubleNC){A=NA;B=NB;C=NC;}
~CLine(){}
};
CTriangle类的设计
classCTriangle:
publicCObject,publicEsLinkNode
{
public:
CPoint2Dp1,p2,p3;//三角形顶点
doublea,b,c;//三角形边长
doubleR,r;//三角形外接圆半径和内切圆半径
CPoint2DRcenPoint,rcenPoint;//三角形外接圆和内切圆的圆心
public:
CTriangle();
CTriangle(CPoint2Dp1,CPoint2Dp2,CPoint2Dp3);
CTriangle(doublex1,doubley1,doublex2,doubley2,doublex3,doubley3);
~CTriangle(){}
private:
boolInterOfTwoLine(CLine&line1,CLine&line2,CPoint2D&intPoint);
public:
voidsetTriVertax(CPoint2D&p);//设置顶点
voidtriEdgeLength();//计算边长
doubletriArea();//计算面积
voidCircum();//计算外接圆圆心
voidInscribedCircle();//计算内切圆圆心
voiddraw();
BOOLRead(FILE*pfile);
BOOLWrite(FILE*pfile);
};
///计算两条直线的交点
boolCTriangle:
:
InterOfTwoLine(CLine&line1,CLine&line2,CPoint2D&intPoint)
{
if(line1.A*line2.B==line1.B*line2.A)
{
AfxMessageBox("两直线平行,求交不成功!
");
returnfalse;
}
doubletemp=line1.B*line2.A-line1.A*line2.B;
intPoint.x=(line1.C*line2.B-line1.B*line2.C)/temp;
intPoint.y=(line1.A*line2.C-line1.C*line2.A)/temp;
returntrue;
}
voidCTriangle:
:
Circum()///计算外接圆圆心公式
{///计算外接圆半径
if(a==-1e10)
triEdgeLength();
doubletemp=triArea();
R=a*b*c/(4.0*temp);
CLineL1,L2;
L1.A=p2.x-p1.x;L1.B=p2.y-p1.y;L1.C=(p1.y*p1.y-p2.y*p2.y+p1.x*p1.x-p2.x*p2.x)*0.5000;
L2.A=p2.x-p3.x;L2.B=p2.y-p3.y;L2.C=(p3.y*p3.y-p2.y*p2.y+p3.x*p3.x-p2.x*p2.x)*0.5000;
InterOfTwoLine(L1,L2,RcenPoint);
}
voidCTriangle:
:
InscribedCircle()///计算内切圆圆心公式
{///计算内切圆半径
if(a==-1e10)
triEdgeLength();
doublep;
p=(a+b+c)*0.5;
r=sqrt((p-a)*(p-b)*(p-c)/p);
doubletemp;
temp=a+b+c;
rcenPoint.x=(a*p3.x+b*p1.x+c*p2.x)/temp;
rcenPoint.y=(a*p3.y+b*p1.y+c*p2.y)/temp;
}
voidCTriangle:
:
draw()
{
Circum();
InscribedCircle();
CMDIFrameWnd*pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
CMDIChildWnd*pChild=(CMDIChildWnd*)pFrame->GetActiveFrame();
CTriangleView*pView=(CTriangleView*)pChild->GetActiveView();
CDC*pDC=pView->GetDC();
pDC->MoveTo(p1.x,p1.y);
pDC->LineTo(p2.x,p2.y);
pDC->LineTo(p3.x,p3.y);
pDC->LineTo(p1.x,p1.y);
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockOb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 三角形