小型绘图系统课程设计._第1页
小型绘图系统课程设计._第2页
小型绘图系统课程设计._第3页
小型绘图系统课程设计._第4页
小型绘图系统课程设计._第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、东华理工大学信息工程学院计算机图形学课程设计报告 题目:小型绘图系统姓名:梁启龙学号:201320070134班级:1320701指导教师:桂颖完成时间:2016年 5月 16日目录一. 系统功能设计功能说明:实现基本图元(直线、圆、多边形、曲线)的绘制;功能要求:1) 使用静态切分视图,将屏幕切分为左右窗格。左窗格是控制窗格,右窗格为显示窗格。2) 使用橡皮筋技术动态演示基本图元的绘制过程。3) 基本图元的数据(几何数据和属性数据)可以交互进行输入和修改。4) 可以对二维图形进行颜色填充操作。5) 使用填充算法结合基本图形生成算法绘制下面的图形二详细设计关于视图是直接基于mfc单文档制作,未

2、能实现静态分切视图功能,实现在视图上部添加控制窗格和控制按钮,视图区用以绘图显示。详细设计如图所示。动态演示基本图元的绘制过程:动态演示图元绘制需要添加鼠标响应事件来设置,我的设计思路是这样的,以直线、矩形、圆为例。首先添加一个鼠标左键单击事件void CJjyyView:OnLButtonDown(UINT nFlags, CPoint point)在视图类上方定义BOOL型变量m_startRect,设置为确认左键单击可以开始画图元,定义HCURSOR m_HCross,初始化光标为十字型光标,然后用CPoint定义三个过程中需要用到的点:m_ptOrigin;m_OldPoint;m_s

3、tartPoint;此时把UINT m_ndrawtype;同时定义用以判断画的是什么图形。定义完后再视图类中CJjyyView:CJjyyView()初始化函数:m_startPoint=0;m_startRect=FALSE;m_ndrawtype=0;m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);完成后再buttondown中添加关键代码:void CJjyyView:OnLButtonDown(UINT nFlags, CPoint point) CView:OnLButtonDown(nFlags, point);m_s

4、tartRect=TRUE;/鼠标左键单击,设置可以开始绘制图形 m_startPoint=point; /记录起始点 m_OldPoint=point;/设置老点也为起始点 :SetCursor(m_HCross);m_ptOrigin = point;这样左键单击的响应事件就暂时设定终了,随后需要用到buttonup的响应事件来画出图形,使用Ctrl+W也就是mfc classwizard添加鼠标松开的响应,首先添加两行代码重置绘制标志m_startRect=FALSE;/重置绘制标志 :ClipCursor(NULL);/解锁光标,即将光标恢复为默认光标然后添加获取设备句柄函数CClie

5、ntDC dc(this);然后用dc.SelectStockObject(NULL_BRUSH);设置画刷为空画刷。接下来使用一个switch(m_ndrawtype)来判别选择画哪一种图形,首先case1就设置为画直线:添加画直线代码:dc.MoveTo(m_startPoint); dc.LineTo(m_OldPoint); 这两句是擦去MouseMove消息响应中绘制的最后一次临时线,然后输入dc.MoveTo(m_startPoint); dc.LineTo(point); 绘制固定线。Break结束。接下来case2即是加入画矩形的代码:dc.Rectangle(CRect(m_

6、startPoint,m_OldPoint);dc.Rectangle(CRect(m_startPoint,point); 画圆也是依次类推,过程中都是直接调用了vc中现有的函数用以绘制图形,所以这几部很简单就做好了。画圆的代码为: dc.Ellipse(CRect(m_startPoint,m_OldPoint); dc.Ellipse(CRect(m_startPoint,point); 用以上方法在有算法和可选函数的情况下基本都能画出想要的图元了,然而这样的绘制方法并不能让人在画图的时候看到临时线而判断画出的是不是想要的图形,这样就要用到mousemove消息响应机制。添加了mouse

7、move类后在其中加入代码:CDC *pDC=GetDC();:SetCursor(m_HCross); CClientDC dc(this);dc.SetROP2(R2_NOT);dc.SetROP2(R2_NOT);此处用两次取反来实现临时线的绘制和擦去,然后这里和bottonup中需要设置一个同样的switch()来判定所画图形,但不同的是在循环前要加入一个if(TRUE=m_startRect),根据是否有单击判定是否可以画图形,用直线做实例:case 1:/LINE :SetCursor(m_HCross); /擦去上一次绘制的临时线 dc.MoveTo(m_startPoint);

8、 dc.LineTo(m_OldPoint); /绘制这一次的临时线 dc.MoveTo(m_startPoint); dc.LineTo(point); /将临时线的终点复制给m_OldPoint, /使其在消息循环的过程中将该值传递到 /擦去上一次画线的过程中,以便擦去上一次所画的线 m_OldPoint=point; break; 仿照直线实例即可完成其他基本图元的临时线型绘制,令使用者更直观的了解所画出来的图形,然后松开左键绘制固定图元线。直线、矩形、圆实现后开始做困难一些的多边形和曲线的实现:我的思路是通过鼠标点击的点存储入数组中,用确定点相连来确定多边形的相应边绘制多边形,曲线也是

9、通过确定点来确定曲线的控制多边形然后绘制出曲线。在左键单击响应中也添加相应case来存储点的坐标并绘制出一个点再视区中:CDC*pDC=GetDC();xi=point.x;yi=point.y;i+;pDC->SetPixel(point.x-1,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x,point.y-1,RGB(0,0,0);pDC->Set

10、Pixel(point.x,point.y,RGB(0,0,0);pDC->SetPixel(point.x,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);然后我添加一个右键单击响应事件用以逐点连线绘制多边形和曲线。此处我设定一个BOOL变量m_bDraw来确定右键是否单击,然后用与bottondown相同的

11、case来保证调用时不出误差,本人特别钟爱使用switch循环,因为不易出错,可以重复使用:代码如下:void CJjyyView:OnRButtonDown(UINT nFlags, CPoint point) m_bDraw=TRUE; switch(m_ndrawtype) case 6: if(m_bDraw)CDC *pDC=GetDC();pDC->MoveTo(x0,y0);for(int j=1;j<i;j+)pDC->LineTo(xj,yj);pDC->LineTo(x0,y0);/ TODO: Add your message handler co

12、de here and/or call defaulti=0;此处i=0是消除数组中储存的点,避免重复连线和连线错误。这是绘制多边形方法。绘制曲线的方法是用了所学知识中N次比赛尔曲线的画法绘制,代码如下:点的存储CDC*pDC=GetDC();xi=point.x;yi=point.y;i+;if(pDC->GetPixel(point.x,point.y)=RGB(255,255,255)pDC->SetPixel(point.x-1,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y,RGB(0,0,0);pDC-&g

13、t;SetPixel(point.x-1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x,point.y,RGB(0,0,0);pDC->SetPixel(point.x,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1

14、,point.y+1,RGB(0,0,0);bz3=false;break;其中bz3变量是为了防止误点两次右键时会使曲线第一点连出一条新的直线至原点而添加的。然后绘制曲线switch(m_ndrawtype) case 7: if(m_bDraw)if(bz3=false)CDC *pDC=GetDC();float t,xx,yy;float bb;int n=i-1;pDC->MoveTo(x0,y0);for(t=0.05;t<1.00001;t=t+0.05)xx=0;yy=0; for(i=0;i<=n;i+)bb=b(i,n,t);xx=xx+xi*bb;yy=

15、yy+yi*bb;pDC->LineTo(int(xx),int(yy); / TODO: Add your message handler code here and/or call defaulti=0;bz3=true;此处应在恰当位置先行定义n次曲线需要用到的函数float b(int i,int n,float t)int k,a=1,b=1;for(k=i+1;k<=n;k+) a=a*k;for(k=1;k<=n-i;k+) b=b*k;float bh=(float)a/b;for(k=1;k<=i;k+) bh=bh*t;for(k=1;k<=n

16、-i;k+) bh=bh*(1-t);return bh;至此,所需图元都可以实现动态绘制。我还加入了铅笔,比较简单的实现方法:pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); m_ptOrigin = point;用绘制直线的方法就可以实现画图中铅笔的功能。最后来写二维图形的颜色填充,我采用的是图形学中学到的改进型种子填充算法填充封闭图形,虽然填充大范围时速度会有点慢,但好歹现学现用,原理是选定颜色后用鼠标左键点击确定第一个点,然后开始填充点所在的封闭图形;int z1300002;void push1(int x,int y,long &

17、amp;top) top=top+1; z1top0=x; z1top1=y;void pop1(int &xz,int &yz,long &top) xz=z1top0; yz=z1top1; top=top-1;这段代码为种子填充算法所需函数。然后在bottonup中加入填充代码:case 4:CDC *pDC=GetDC();CRect rect; int xz=m_startPoint.x,yz=m_startPoint.y;long top=0;push1(xz,yz,top);while(top>0) pop1(xz,yz,top); if(pDC-&

18、gt;GetPixel(xz-1,yz)!=RGB(0,0,0)&&pDC->GetPixel(xz-1,yz)!=m_Color) push1(xz-1,yz,top); pDC->SetPixel(xz-1,yz,m_Color); if(pDC->GetPixel(xz,yz+1)!=RGB(0,0,0)&&pDC->GetPixel(xz,yz+1)!=m_Color) push1(xz,yz+1,top); pDC->SetPixel(xz,yz+1,m_Color); if(pDC->GetPixel(xz+1,y

19、z)!=RGB(0,0,0)&&pDC->GetPixel(xz+1,yz)!=m_Color) push1(xz+1,yz,top); pDC->SetPixel(xz+1,yz,m_Color); if(pDC->GetPixel(xz,yz-1)!=RGB(0,0,0)&&pDC->GetPixel(xz,yz-1)!=m_Color) push1(xz,yz-1,top); pDC->SetPixel(xz,yz-1,m_Color); 其中int xz=m_startPoint.x,yz=m_startPoint.y;即是

20、获取着色初点。m_Color是我定义的用来调用调色盘颜色的,用int定义即可。然后用如下代码调取调色盘:void CJjyyView:OnYs() CColorDialog colorDialog;int reasult=colorDialog.DoModal();if(reasult=IDOK)m_Color=colorDialog.GetColor();/ TODO: Add your command handler code here以上便是我的总体设计思路和实现的过程,然后我还加了清屏函数用以清屏void CJjyyView:OnQingping() RedrawWindow();m_

21、ndrawtype=0;i=0;/ TODO: Add your command handler code herem_ndrawtype=0;是清屏后从新选择图元按钮以画图(重置);i=0;清除数组存储点。下面放上实验结果:至此课设要求基本达成,实验过程中我也遇到了许多问题,第一个碰到的问题是覆盖的问题,即是当两根线画在同一位置时它就会消失,我觉得应该和负负得正差不多一个道理,还有一个覆盖即是画矩形和圆时新的矩形会覆盖掉先前话的图形,不能重叠,这两个问题在不停的研究橡皮筋技术和在博客上研究其他大触的解答上得到了解决。还有就是画多边形和曲线时一开始我不知道要怎么设置数组存储点,把点打出来然后连

22、线绘图。经过我请教实力过硬的同学后得到了解决,原来其实很简单就能实现。还有就是在调用调色盘时怎么把颜色输出到所学的种子填充算法中,经过几次修改输出的RGB后得到解决。然后就没什么值得商榷的问题了,这就得到了一个简单的绘图程序,当然还有许多可以改进和完善的地方。3、 总结及展望1) 总结: 这次的课设经由参阅书本资料和博客大触的指点以及在同学的帮助下得以完成,真正的自己完成了一个小程序的设计,基本实现了题目中要求的各项功能,尚欠静态切分视图,图元的交互输入和修改也没有能实现,但是在设计和编码的过程中学习到了不少新的知识和程序设计方式,收货颇丰。自己感觉短时间内做出这样的效果还较为满意。2) 展望

23、:整个设计中因为设计时出现的各种问题等原因可能有许多代码基本上没什么用,在修改时因为没有报错就没有删去,导致整个程序源码会有些杂乱,源码可读性不强,不足之处还在于打点绘制曲线之后点没有消掉,还留于视区,可以考虑通过设计橡皮擦功能或者调整源码使之再绘制曲线后消去,下一步的工作和思路在于添加橡皮擦功能令用户能进行小范围的修改,还可以考虑加入撤销和重做的按钮与指令,然后就是加入改变绘制线的线宽、线型和颜色等属性的插件。使程序更加趋近于画图,达到更好的设计效果和人机交互目的。实验源代码:/ jjyyView.cpp : implementation of the CJjyyView class/#in

24、clude "stdafx.h"#include "jjyy.h"#include "ZX.h"#include "ZF.h"#include "jjyyDoc.h"#include "jjyyView.h"#include "QYTC.h"#include "TXBH.h"#include "YUAN.h"#include "TXCJ.h"#include "QXSC.h"#

25、include "QMSC.h"#include "XY.h"#include "ZSG.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CJjyyViewint z1300002;void push1(int x,int y,long &top) top=top+1; z1top0=x; z1top1=y;void pop1(int &xz,int &yz,long &

26、top) xz=z1top0; yz=z1top1; top=top-1;IMPLEMENT_DYNCREATE(CJjyyView, CView)BEGIN_MESSAGE_MAP(CJjyyView, CView)/AFX_MSG_MAP(CJjyyView)ON_COMMAND(ID_ZX, OnZx)ON_COMMAND(ID_YUAN, OnYuan)ON_COMMAND(ID_ZF, OnZf)ON_COMMAND(ID_QYTC, OnQytc)ON_COMMAND(ID_TXBH, OnTxbh)ON_COMMAND(ID_TXCJ, OnTxcj)ON_COMMAND(ID_

27、QXSC, OnQxsc)ON_COMMAND(ID_QMSC, OnQmsc)ON_COMMAND(ID_XY, OnXy)ON_COMMAND(ID_ZSG, OnZsg)ON_COMMAND(ID_QINGPING, OnQingping)ON_COMMAND(ID_HZX, OnHzx)ON_COMMAND(ID_HJX, OnHjx)ON_COMMAND(ID_HYUAN, OnHyuan)ON_COMMAND(ID_TIANCHONG, OnTianchong)ON_COMMAND(ID_HB, OnHb)ON_COMMAND(ID_YS, OnYs)ON_WM_LBUTTONDO

28、WN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(ID_HDBX, OnHdbx)ON_WM_RBUTTONDOWN()ON_COMMAND(ID_HQX, OnHqx)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPrevi

29、ew)END_MESSAGE_MAP()int x50,y50,i,k,k1;/ CJjyyView construction/destructionUINT m_ndrawtype;CPoint m_ptOrigin;BOOL m_bDraw;BOOL m_startRect;HCURSOR m_HCross;CPoint m_OldPoint;CPoint m_PointOrigin;CPoint m_startPoint;int m_Color;bool bz3=false;CJjyyView:CJjyyView()m_startPoint=0;m_startRect=FALSE;m_n

30、drawtype=0;m_bDraw = false;m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);/ TODO: add construction code hereCJjyyView:CJjyyView()BOOL CJjyyView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs

31、);/ CJjyyView drawingvoid CJjyyView:OnDraw(CDC* pDC)CJjyyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/ CJjyyView printingBOOL CJjyyView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CJjyyView:OnBeginPrinting(C

32、DC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CJjyyView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CJjyyView diagnostics#ifdef _DEBUGvoid CJjyyView:AssertValid() constCView:AssertValid();void CJjyyView:Dump(CDumpCon

33、text& dc) constCView:Dump(dc);CJjyyDoc* CJjyyView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJjyyDoc);return (CJjyyDoc*)m_pDocument;#endif /_DEBUG/ CJjyyView message handlersvoid CJjyyView:OnQingping() RedrawWindow();m_ndrawtype=0;i=0;/ TODO: Add yo

34、ur command handler code herevoid CJjyyView:OnHzx() m_ndrawtype=1;/ TODO: Add your command handler code herevoid CJjyyView:OnHjx() m_ndrawtype=2;/ TODO: Add your command handler code herevoid CJjyyView:OnHyuan() m_ndrawtype=3;/ TODO: Add your command handler code herevoid CJjyyView:OnTianchong() m_nd

35、rawtype=4;/ TODO: Add your command handler code herevoid CJjyyView:OnHb() m_ndrawtype=5;/ TODO: Add your command handler code herevoid CJjyyView:OnYs() CColorDialog colorDialog;int reasult=colorDialog.DoModal();if(reasult=IDOK)m_Color=colorDialog.GetColor();/ TODO: Add your command handler code here

36、void CJjyyView:OnLButtonDown(UINT nFlags, CPoint point) CView:OnLButtonDown(nFlags, point);m_startRect=TRUE;/鼠标左键单击,设置可以开始绘制矩形框 m_startPoint=point; /记录起始点 m_OldPoint=point;/设置老点也为起始点 :SetCursor(m_HCross);m_ptOrigin = point;m_bDraw = true;switch(m_ndrawtype) case 6:CDC*pDC=GetDC();xi=point.x;yi=point

37、.y;i+;pDC->SetPixel(point.x-1,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x,point.y,RGB(0,0,0);pDC->SetPixel(point.x,point.y+1,RGB(0,0,0);pDC->SetPixel

38、(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);break;case 7:CDC*pDC=GetDC();xi=point.x;yi=point.y;i+;if(pDC->GetPixel(point.x,point.y)=RGB(255,255,255)pDC->SetPixel(point.x-1,point.y-1,RGB(0,0,0);pDC->SetPixel(

39、point.x-1,point.y,RGB(0,0,0);pDC->SetPixel(point.x-1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x,point.y-1,RGB(0,0,0);pDC->SetPixel(point.x,point.y,RGB(0,0,0);pDC->SetPixel(point.x,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RG

40、B(0,0,0);pDC->SetPixel(point.x+1,point.y+1,RGB(0,0,0);bz3=false;break;/ TODO: Add your message handler code here and/or call defaultvoid CJjyyView:OnLButtonUp(UINT nFlags, CPoint point) m_bDraw = false;m_startRect=FALSE; :ClipCursor(NULL); CClientDC dc(this);/获取设备句柄 dc.SelectStockObject(NULL_BRUS

41、H); /设置画刷为空画刷 switch(m_ndrawtype) case 1:/Line /擦去MouseMove消息响应中绘制的最后一次临时线 dc.MoveTo(m_startPoint); dc.LineTo(m_OldPoint); /绘制固定线 dc.MoveTo(m_startPoint); dc.LineTo(point); break; case 2: /Retangle /利用当前画刷绘制矩形,内部由当前空画刷(NULL_BRUSH)填充。 /擦去MouseMove消息响应中的临时矩形 dc.Rectangle(CRect(m_startPoint,m_OldPoint)

42、; /绘制固定矩形 dc.Rectangle(CRect(m_startPoint,point); /m_drawType=0; /该行的可以使得每画一次都要选择所画的形状 break; case 3: /Circle dc.Ellipse(CRect(m_startPoint,m_OldPoint); dc.Ellipse(CRect(m_startPoint,point); break; case 4:CDC *pDC=GetDC();CRect rect; int xz=m_startPoint.x,yz=m_startPoint.y;long top=0;push1(xz,yz,top

43、);while(top>0) pop1(xz,yz,top); if(pDC->GetPixel(xz-1,yz)!=RGB(0,0,0)&&pDC->GetPixel(xz-1,yz)!=m_Color) push1(xz-1,yz,top); pDC->SetPixel(xz-1,yz,m_Color); if(pDC->GetPixel(xz,yz+1)!=RGB(0,0,0)&&pDC->GetPixel(xz,yz+1)!=m_Color) push1(xz,yz+1,top); pDC->SetPixel(x

44、z,yz+1,m_Color); if(pDC->GetPixel(xz+1,yz)!=RGB(0,0,0)&&pDC->GetPixel(xz+1,yz)!=m_Color) push1(xz+1,yz,top); pDC->SetPixel(xz+1,yz,m_Color); if(pDC->GetPixel(xz,yz-1)!=RGB(0,0,0)&&pDC->GetPixel(xz,yz-1)!=m_Color) push1(xz,yz-1,top); pDC->SetPixel(xz,yz-1,m_Color); /

45、 TODO: Add your message handler code here and/or call defaultCView:OnLButtonUp(nFlags, point);void CJjyyView:OnMouseMove(UINT nFlags, CPoint point) CDC *pDC=GetDC();:SetCursor(m_HCross); CClientDC dc(this);dc.SetROP2(R2_NOT);dc.SetROP2(R2_NOT); dc.SelectStockObject(NULL_BRUSH); if(TRUE=m_startRect) switch(m_ndrawtype) case 1:/LINE :SetCursor(m_HCross); /擦去上一次绘制的临时线 dc.MoveTo(m_startPoint); dc.LineTo(m_OldPoint); /绘制这一次的临时线 dc.MoveTo(m_startPoint); dc.LineTo(point); /将临时线的终点复制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论