《计算机图形学》实习指导书20140430_第1页
《计算机图形学》实习指导书20140430_第2页
《计算机图形学》实习指导书20140430_第3页
《计算机图形学》实习指导书20140430_第4页
《计算机图形学》实习指导书20140430_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

第一章VC编程基础(3)用同样的方法,将鼠标右键响应函数、鼠标移动响应函数加到程序中,只是在

#endifCStatusBarm_wndStatusBar;3)修改staticUINTindicators[]数组staticUINTindicators[]={ID_SEPARATOR,//statuslineindicator//ID_INDICATOR_CAPS,//ID_INDICATOR_NUM,//ID_INDICATOR_SCRL,ID_SEPARATOR,//statuslineindicatorID_SEPARATOR,//statuslineindicatorID_SEPARATOR,//statuslineindicator};4)将CMainFrame::OnCreate函数中的内容作如下修改://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))if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failedtocreatetoolbar\n");return-1;//failtocreate}5)在CMainFrame::OnCreate函数中最后一个语句前增加下列语句:m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);xx=point.x; //取出坐标信息sprintf(p1,“%4d”,xx); //转化为字符串m_wndStatusBar.SetPaneText(2,p1,TRUE);//在第2个区域显示x坐标m_wndStatusBar.SetPaneText(3,p1,TRUE);//在第3个区域显示y坐标获得文档类指针CClientDCht(this); //定义当前绘图设备if(MenuID==1){//DDA直线//第一次按键将第一点保留在文档类数组中pDoc->group[PressNum]=point;//第二次按键保留第二点,用文档类画线pDoc->group[PressNum]=point;PressNum=0;//程序画图

//定义数组,public:voidDDALine(CClientDC*DCPoint);//定义函数CPenpen(0,0,RGB(255,0,0));//定义一支新笔CPen*pOldPen=DCPoint->SelectObject(&pen);//绘图设备选新笔,//同时保留旧笔DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画DCPoint->MoveTo(group[0]); //抬笔到第一点,第一点由鼠标事先确定,//存放在group[0]DCPoint->LineTo(group[1]); //画到第二点,第二点由鼠标事先确定,//存放在group[1]DCPoint->SelectObject(pOldPen); //恢复旧笔}mPointOrign=point;mPointOld=point;;//记录第一点pDC.SetROP2(R2_NOT);//设置异或方式pDC.MoveTo(mPointOrign);pDC.LineTo(mPointOld);//擦旧线pDC.MoveTo(mPointOrign);pDC.LineTo(point);//画新线

第二章图形生成1、理论分析1,xi第六种直线是垂直线,要求x0=x1,y0<y1。绘制程序如下:for(y=y0;y<=y1;y++){setpixel(x0,y,RGB(255,0,0));}对于一条任意给定的直线段,首先要判断是否为水平或垂直线;如果是按照水平、垂直线绘制方法绘出;如果不是,就要调整起始、终止端点,判断属于1、2、3、4中的哪一类,然后根据类别选择相应的绘制方法。DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画//直线端点由鼠标确定后存放在group[0]、group[1]垂直线if(y0==y1)//水平线

x=x0;x0=x1;x1=x;//交换起始、终止点x=y0;y0=y1;y1=x;根据该算法,对于圆心为(0,0),半径为R的圆,绘图的起点为(0,R),d0=3-2R,递推公式为 xi+1=xi+1,当di>0 时,yi+1=yi–1,di+1=di+4(xi-yi)+10;当 di≤0时,yi+1=yi,di+1=di+4xi+6;结束条件为 xi>y i。根据对称条件,找到一个圆上点(x,y),可以同时确定其他7个点(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)。对于圆心在任意点(x0,y0)的圆,可以使用上述方法,只是在绘点时,将(x,y)等8个点绘制成(x+x0,y+y0)。实现程序如下:获得文档类指针定义当前绘图设备第二次按键保留第二点,用文档类画线程序画图Bresenham圆if(PressNum==0){//第一次按键将第一点保留在mPointOrign

mPointOld=point;//记录第一点elseif(PressNum==1){//第二次按键调用文档类画圆程序画图

pDC.SelectStockObject(NULL_BRUSH);//画空心圆DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画根据该算法,对于圆心为(x0,y0),半径为R的圆,绘图的起点为(x0,y0+R),d0=0,递推公式为:当di<0时,xi+1=xi+1,yi+1=yi,di+1=di+2(xi-x0)+1;当di≥0时,xi+1=xi,yi+1=yi-1,di+1=di-2(yi-y0)+1;结束条件为yi≤y0。根据对称条件,找到一个圆上点(x,y),可以同时确定其他3个点(x,2y0-y),(2x0-x,y),(2x0-x,2y0-y)。在绘点时,每求处一个点(x,y),应同时绘出其它3个点。实现程序如下:if(MenuID==3||MenuID==4){//Bresenham圆以及正负法圆pDoc->BCircle(&ht,mPointOrign,point);ReleaseCapture();}elseif(PressNum==1&&MenuID==4){//第二次按键调用画圆程序画图PressNum=0;pDoc->ZCircle(&ht,mPointOrign,point);ReleaseCapture();}if((MenuID==3||MenuID==4)&&PressNum==1){DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针pDoc->PointNum=0;//初始化CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针CClientDCht(this); //定义当前绘图设备pDoc->Bezier(&ht,1);//绘制Bezier函数MenuID=6; //将下面的操作改为修改控制点位置PressNum=0;}CView::OnRButtonDown(nFlags,point);}if(MenuID==6&&PressNum==0){//在控制点数组中,逐个寻找 pDoc->Bezier(&pDC,1);//擦除十字标志和旧线pDoc->group[SaveNumber]=point;//记录新控制点

pDoc->Bezier(&pDC,1);//画十字标志和新曲线

CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针pDC.SetROP2(R2_NOT);//设置异或方式for(inti=0;i<pDoc->PointNum;i++){//消除所有光标pDoc->Bezier(&pDC,0);//绘制Bezier函数MenuID=5; //将下面的操作改回Bezier曲线方式CPointp[1000];//设置一个数组存储完整的Bezier曲线控制点p[i++]=group[j++];//先将第1,2号点存入数组p[i++]=group[j++];while(j<=PointNum-2)//存入奇、偶号点,生成并存入插入点

for(j=0;j<i-3;j+=3)//控制点分组,分别生成各段曲线

if(mode)//mode=1时,以异或方式画可擦除的黑色曲线,用于调整形状else//mode=0时,画红色的正式曲线

dt=1.0/n;//参数t的间隔,分10段,即用10段直线表示一段曲线pDC->MoveTo(p1);//移到起点for(i=1;i<=n;i++)//用Bezier参数方程计算曲线上等间隔的10个点

SetPixel(),该函数原型如下:COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);不难看出,参数crColor即代表设置对应坐标的像素的颜色,因此,只需将先前程序中的crColor参数改为我们想要的颜色,就能改变生成的图形的颜色。程序实现//定义数组,classCcolorDialog:publicCCommonDialog。SetPixel()中的最后一个参数修改为成员变量CDC::TextOut,CDC::SetTextColor。BOOLTextOut(intx,inty,constCString&str);该函数用于在坐标为(x,y)处显示文字str。virtualCOLORREFSetTextColor(COLORREFcrColor);插入一个新的对话框模板资源,以攻输入所需的字符串参数。使用Ctrl+R插入新对话框资源,如下图:双击设计好的模板,为对话框资源添加一个类。然后使用Ctrl+W打开类向导,为三个编辑框添加变量,如下图所示:给对话框类CDrawCharDlg添加两个成员变量:classCDrawCharDlg:publicCDialog{//Constructionpublic: CDrawCharDlg(CWnd*pParent=NULL);//standardconstructorpublic: CFontm_fnt;//保存字体 COLORREFm_clrText;//保存颜色//DialogData //{{AFX_DATA(CDrawCharDlg) enum{IDD=IDD_DIALOG_DRAWCHAR}; CString m_strString; int m_nY; int m_nX;…………..}并在构造函数将其初始化:CDrawCharDlg::CDrawCharDlg(CWnd*pParent/*=NULL*/) :CDialog(CDrawCharDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDrawCharDlg) m_strString=_T(""); m_nY=0; m_nX=0; m_clrText=RGB(0,0,0); //}}AFX_DATA_INIT}用Ctrl+W打开类向导,为“字体”按钮添加消息响应函数:voidCDrawCharDlg::OnButtonFont(){ //TODO:Addyourcontrolnotificationhandlercodehere CFontDialogdlg; if(dlg.DoModal()==IDOK) { m_fnt.DeleteObject(); LOGFONTLogFnt; dlg.GetCurrentFont(&LogFnt);//保存所选字体 m_fnt.CreateFontIndirect(&LogFnt);//创建所选字体 m_clrText=dlg.GetColor();//获得所选颜色 }}上述函数中使用的CFontDialog是MFC中自带的用于选择字体的对话框。至此,已完成所有数据接收的部分,接下来要做的就是将字符按照接收到的信息显示到屏幕上。首先在视图类的.cpp文件的开头添加如下代码,将对话框的头文件包含进来:#include"stdafx.h"#include".h"#include".h"#include"View.h"#include"DrawCharDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW……………然后为菜单项“字符”添加消息响应函数:voidCMyView::OnDrawChar(){ //TODO:Addyourcommandhandlercodehere CDC*pDC=GetDC(); CDrawCharDlgdlg; if(dlg.DoModal()==IDOK) { CFont*pfntOld=pDC->SelectObject(&dlg.m_fnt);//保存旧字体 pDC->SetTextColor(dlg.m_clrText);//设置颜色 pDC->TextOut(dlg.m_nX,dlg.m_nY,dlg.m_strString);//画到屏幕上 pDC->SelectObject(pfntOld);//还原旧字体 } ReleaseDC(pDC);}至此,字符的显示已全部完成。第三章图形变换CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针pDoc->GenerateGraph(&pDC);//调用文档类函数在屏幕上生成图形group[0].x=100;group[0].y=100;//图形数据准备DrawGraph(pDC);//画图形}if(MenuID==11){//平移mPointOld=point;//记录第一点//根据两点间距计算平移量for(inti=0;i<pDoc->PointNum;i++)//根据平移量计算新图形坐标{ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->DrawGraph(&ht);//生成新图形转化为字符串m_wndStatusBar.SetPaneText(2,p1,TRUE);//在第2个区域显示x坐标sprintf(p1,"%4d",yy);在第3个区域显示y坐标擦旧线画新线CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针if(MenuID==15){//对称变换mPointOld=point;//记录第一点pDoc->Symmetry(mPointOrign,point);//进行对称变换pDoc->DrawGraph(&ht);//生成新图形擦旧线矩阵1b[0][0]=ca;b[0][1]=sa;b[0][2]=0;//矩阵2a[0][0]=b[0][0]*c[0][0]+b[0][1]*c[1][0]+b[0][2]*c[2][0];//矩阵1、2合并矩阵3c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];//矩阵1、2、3 合并b[0][0]=ca;b[0][1]=-sa;b[0][2]=0;//矩阵4

a[0][0]=b[0][0]*c[0][0]+b[0][1]*c[1][0]+b[0][2]*c[2][0];//矩阵1、2、3、4合并c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];//所有矩阵合并

for(i=0;i<PointNum;i++)//利用复合矩阵对所有图形点坐标进行变换

第四章图形显示if(MenuID==20){//种子填充:画边界 mPointOld1=point;//记录第一点PressNum++;ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->group[0]=mPointOrign;//借助DDA直线函数画边界擦旧线画新线if(MenuID==20&&PressNum>0){//种子填充

ht.MoveTo(mPointOrign);//擦除橡皮筋ht.LineTo(point);pDoc->group[0]=mPointOld1;//封闭多边形pDoc->group[1]=mPointOrign;pDoc->DDALine(&ht);PressNum=0;MenuID=21;//改变操作方式为种子点选取ReleaseCapture();if(MenuID==21){//确定种子点,填充

pDoc->SeedFill(&ht,point);PressNum=0;MenuID=20;//设置决定顶点操作方式}CView::OnLButtonDown(nFlags,point);}intsavex,xleft,xright,pflag,x,y,num;CPointstack_ptr[200];/堆栈pDC->SetROP2(R2_COPYPEN);//绘图方法为直接画num=0;//num为堆栈中的种子数stack_ptr[num++]=seedpoint;while(num>0){x=stack_ptr[--num].x;y=stack_ptr[num].y;pDC->SetPixel(x,y,RGB(255,0,0));savex=x;x++;while(pDC->GetPixel(x,y)!=RGB(255,0,0))//向右填充,直到边界{pDC->SetPixel(x++,y,RGB(255,0,0));};xright=x-1;x=savex-1;while(pDC->GetPixel(x,y)!=RGB(255,0,0))//向左填充,直到边界{pDC->SetPixel(x--,y,RGB(255,0,0));};xleft=x+1;x=xleft;y++;//在扫描线下一行搜索未填充区域pflag=1;while(x<xright){if(pDC->GetPixel(x,y)!=RGB(255,0,0)&&pflag==1){边界后的第一个未填充区域像素stack_ptr[num].x=x;stack_ptr[num++].y=y;x++;}if(pDC->GetPixel(x,y)==RGB(255,0,0))pflag=1;//pflag=1表示填充区域或边界elsepflag=0;//pflag=0表示未填充区域x++;}x=xleft;y-=2; pflag=1;//在扫描线上一行搜索未填充区域while(x<xright){if(pDC->GetPixel(x,y)!=RGB(255,0,0)&&pflag==1){stack_ptr[num].x=x;stack_ptr[num++].y=y;x++;}if(pDC->GetPixel(x,y)==RGB(255,0,0)) pflag=1;elsepflag=0;x++;}}}if(MenuID==22){//边缘填充选顶点if(MenuID==22){//边缘填充选点结束 voidCMy200032590100Doc::EdgeFill(CClientDC*pDC) {inti,xr,x1,y1,x2,y2,y;floatm,x;CPenpen;pen.CreatePen(PS_SOLID,1,RGB(0,255,255));//确定填充颜色,由该颜色与背景//色异或混合而成pDC->SetROP2(R2_XORPEN);//绘图方法为异或CPen*pOldPen=pDC->SelectObject(&pen);xr=0;for(i=0;i<PointNum;i++)//找出边界盒右边界参数{if(xr<group[i].x)xr=group[i].x;}for(i=0;i<PointNum-1;i++)

{x1=group[i].x;x2=group[i+1].x;//取一条边y1=group[i].y;y2=group[i+1].y;if(y1!=y2){if(y1>y2)//确保(x1,y1)为下端点{y=y1;y1=y2;y2=y; y=x1;x1=x2;x2=y;}m=(float)(x2-x1)/(float)(y2-y1);x=x1;//m为相邻扫描线之间边的x增量for(y=y1+1;y<=y2;y++){x+=m;//确定边缘点pDC->MoveTo((int)x,y);//从边缘点一直画到边界盒右端pDC->LineTo(xr,y);} }}pDC->SelectObject(pOldPen);}1、理论分析扫描线填充算法运用了复杂的数据结构,且在填充过程中需要反复排序,编程难度较大。VC类库中的函数CDC::Polygon()实现了扫描线填充算法功能。实际上我们所学的计算机图形学所有算法都能通过引用VC类库提供的函数(或函数组合)加以实现。本节通过引用函数CDC::Polygon(),来说明如何应用VC类函数。函数CDC::Polygon(LPPOINTlpPoints,intnCount)有两个参数,lpPoints是一个数组,用来存储多边形的顶点,nCount是一个表示顶点数量的整形数。按照要求准备好这两个参数,就可以调用函数了。2、操作说明操作与边缘填充完全一样。在选取菜单项后,用鼠标左键依次选取多边形顶点;在前一个顶点确定、鼠标移动时,用一根橡皮筋表示前一顶点与当前点之间的连线,以方便当前边的确定;最后用右键结束选点,程序将最后一个顶点与第一个顶点用线连接起来,以表示还有这样一条边,确保多边形封闭。3、编程实现1)菜单响应函数建立.打开工程项目,依次点击菜单“查看”、“建立类向导”,出现窗口。在ClassName:栏中选CMy200032590100View;在ObjectIds:栏中选ID_FILL_SCANLINE;在Messages:栏中选COMMAND;点击AddFunction按键,出现函数命名窗口,点击该窗口中的OK按键,该函数在200032590100View.cpp中生成。点击该窗口中的EditCode按键查看、编辑该函数。加入语句如下:CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针pDoc->PointNum=0;//实际上不需要该变量,但为了借鉴边缘填充的部分功//能,与边缘填充保持一致if(MenuID==23){pDoc->group[PressNum]=pDoc->group[0];//封闭多边形ht.MoveTo(pDoc->group[PressNum-1]);//擦除ht.LineTo(pDoc->group[0]);for(i=0;i<PressNum;i++)//擦除ht.LineTo(pDoc->group[i+1]);CPenpen(PS_SOLID,1,RGB(255,0,0));//设置多边形边界颜色(即画笔)CPen*pOldPen=ht.SelectObject(&pen);CBrushbrush(RGB(0,255,0));//设置多边形填充颜色(即画刷)CBrush*pOldBrush=ht.SelectObject(&brush);ht.SetROP2(R2_COPYPEN); //设置直接画方式ht.Polygon(pDoc->group,PressNum);//调用多边形扫描线填充函数ht.SelectObject(pOldPen);//恢复系统的画笔、画刷颜色设置ht.SelectObject(pOldBrush);PressNum=0;pDoc->PointNum=0;//初始化参数,为下一次操作做准备ReleaseCapture();}第五章二维裁剪CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针#defineXMIN100//定义的窗口参数符号,符号只要在被使用前定义即可#defineLEFT1//定义的几个常数符号code1=encode(x1,y1);//对端点编码code2=encode(x2,y2);if((code1&code2)!=0)return;//完全不可见if((LEFT&code)!=0)//求线段与窗口左边的交点elseif((RIGHT&code)!=0)//求线段与窗口右边的交点elseif((BOTTOM&code)!=0)//求线段与窗口底边的交点elseif((TOP&code)!=0)//求线段与窗口顶边的交点CMy200032590100Doc*pDoc=GetDocument();//获得文档类指针边缘填充选顶点if(MenuID==25){//多边形裁剪pDoc->group[PressNum]=pDoc->group[0];//将第一个顶点作为最后一个顶点//记录顶点数量//用第一条窗口边进行裁剪//用第二条窗口边进行裁剪//用第三条窗口边进行裁剪//用第四条窗口边进行裁剪pDC->MoveTo(group[0]);//绘制裁剪多边形x=XMINif(group[n].x<XMIN&&group[n+1].x<XMIN)//外外,不输出

if(group[n].x>=XMIN&&group[n+1].x>=XMIN)//里里,输出后点

if(group[n].x>=XMIN&&group[n+1].x<XMIN)//里外,输出交点

if(group[n].x<XMIN&&group[n+1].x>=XMIN)//外里,输出交点、后点y=YMAXif(group[n].y>=YMAX&&group[n+1].y>=YMAX)//外外,不输出if(group[n].y<YMAX&&group[n+1].y<YMAX)//里里,输出后点if(group[n].y<YMAX&&group[n+1].y>=YMAX)//里外,输出交点if(group[n].y>=YMAX&&group[n+1].y<YMAX)//外里,输出交点、后点x=XMAXif(group[n].x>=XMAX&&group[n+1].x>=XMAX)//外外,不输出

if(group[n].x<XMAX&&group[n+1].x<XMAX)//里里,输出后点

if(group[n].x<XMAX&&group[n+1].x>=XMAX)//里外,输出交点

if(group[n].x>=XMAX&&group[n+1].x<XMAX)//外里,输出交点、后点

y=YMIN

if(group[n].y<YMIN&&group[n+1].y<YMIN)//外外,不输出

if(group[n].y>=YMIN&&group[n+1].y>=YMIN)//里里,输出后点

if(group[n].y>=YMIN&&group[n+1].y<YMIN)//里外,输出交点

if(group[n].y<YMIN&&group[n+1].y>=YMIN)//外里,输出交点、后点

圆裁剪与直线裁剪和多边形裁剪都不一样,直线裁剪完还是直线,多边形裁剪完还是多边形,而圆裁剪完便有可能不再是圆,所以我们需要修改圆的生成算法,让其能够自主判断是否在矩形框内,若是,则绘出该点像素,若不是,则不绘。在选择裁剪菜单后,立即生成指定窗口。用鼠标左键依次确定圆的圆心和圆上一点。然后立即调用文档类裁剪函数对圆进行裁剪,并用红色标记裁剪结果。在画圆的过程中,依然使用橡皮筋显示圆的位置。编程实现修改然后在voidCMy::BCircle(*DCPoint,CRect*rc){ intr,d,x,y,x0,y0; DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接画 r=(int)sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));x=0;y=r;d=3-2*r;x0=p1.x;y0=p1.y; while(x<y||x==y) {if(rc->PtInRect(CPoint(x+x0,y+y0))) //判断点是否在矩形框内DCPoint->SetPixel(x+x0,y+y0,);if(rc->PtInRect(CPoint(-x+x0,y+y0))) DCPoint->SetPixel(-x+x0,y+y0,);if(rc->PtInRect(CPoint(x+x0,-y+y0)))DCPoint->SetPixel(x+x0,-y+y0,);if(rc->PtInRect(CPoint(-x+x0,-y+y0)))DCPoint->SetPixel(-x+x0,-y+y0,);if(rc->PtInRect(CPoint(y+x0,x+y0))) DCPoint->SetPixel(y+x0,x+y0,);if(rc->PtInRect(CPoint(-y+x0,x+y0))) DCPoint->SetPixel(-y+x0,x+y0,);if(rc->PtInRect(CPoint(y+x0,-x+y0)))DCPoint->SetPixel(y+x0,-x+y0,);if(rc->PtInRect(CPoint(-y+x0,-

温馨提示

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

评论

0/150

提交评论