基于MFC三维图形开发

提纲:
01.MFC上机操作步骤
02.MFC绘图方法
03.设备上下文的调用与释放
04.双缓冲机制

01.MFC上机操作步骤



以后在学习中会重点操作view类:

最常用到的就是里面的OnDraw()函数,以后对图形的操作就是在里面进行:

02.MFC绘图方法

在微软基类库MFC中,CDC类是定义设备上下文对象的基类,封装了绘图所需的所有函数。当输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备绘制和打印图形的功能。
(CDC就相当于画布)

1.CDC类

其中CClientDC类常用,被称为客户区,设备上下文…

  • CClientDC只能在窗口的客户区(不包括边框,标题栏,菜单栏以及状态栏的空白区域)进行绘图。

  • 点(0,0)是客户区的左上角。

2.简单数据类型

  • CPoint类:存放点的坐标(x,y);
  • CRect类:存放矩形左上角顶点和右下角的顶点(left,top,right,bottom);
  • CSize类:存放矩形宽度和高度的坐标(cx,cy),其中cx是矩形的宽度,cy是矩形的高度。

3.绘图工具类

其中最常用的就是CBrush(画刷)和CPen(画笔):

4.映射模式

  • 把图形显示在屏幕坐标系的过程称之为映射;

  • 根据映射模式不同可以分为逻辑坐标和设备坐标:
    默认坐标系是下面这样:
    上面坐标系中的就是设备坐标。
    我们实际生活中使用的坐标系:
    上面坐标系中的就是逻辑坐标。

  • 映射模式

  • 相关函数:


示例1:

CRect rect;//声明客户区矩形
GetClientRect(&rect);//获得客户区坐标
pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式
pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口
pDC->SetViewportExt(rect.Width(), -rect.Height());//x轴水平向右,y轴垂直向上
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//客户区中心为坐标系原点
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//将rect移回到客户区内

上面的代码只是将坐标平移好了,并没有显示出下面的坐标轴。

但是上面示例1的代码只是将坐标系调整了下,并没有显示出坐标轴和原点,那我们该怎么显示出来呢?

//画x轴pDC->MoveTo(-rect.Width()/2, 0);pDC->LineTo(rect.Width() / 2, 0);//画x轴箭头pDC->MoveTo(rect.Width()/ 2, 0);pDC->LineTo(rect.Width() / 2 - 20, 20);pDC->MoveTo(rect.Width() / 2, 0);pDC->LineTo(rect.Width() / 2 - 20, -20);//画y轴pDC->MoveTo(0, -rect.Height ()/ 2);pDC->LineTo(0, rect.Height() / 2);//画y轴箭头pDC->MoveTo(0, rect.Height() / 2);pDC->LineTo(-20, rect.Height() / 2 - 20);pDC->MoveTo(0, rect.Height() / 2);pDC->LineTo(20, rect.Height() / 2 - 20);pDC->TextOutW(100, 100, CString("第一象限"));pDC->TextOutW(-100, 100, CString("第二象限"));pDC->TextOutW(-100, -100, CString("第三象限"));pDC->TextOutW(100, -100, CString("第四象限"));pDC->TextOutW(20, 30, CString("O"));

效果图:

5.使用GDI对象

5.1 画笔函数

5.2 画刷函数


注意:创建了画笔画刷后并不是直接起作用,我们需要用到SelectObject()函数把画笔画刷的地址传进去,同时该函数会返回原先的画笔和画刷

5.3 选入GDI对象

示例:

//画一个矩形框CPen pen1;pen1.CreatePen(PS_SOLID, 5, RGB(255, 0, 0));pDC->SelectObject(&pen1);CBrush b1;b1.CreateSolidBrush(RGB(0, 255, 0));pDC->SelectObject(&b1);pDC->Rectangle(10, 20, 300, 200);

图示:


5.4 绘制像素点函数

5.5 获取像素点颜色函数


示例:

COLORREF clr;int x = 20, y = 20;int i;for (i = 0; i < 20; i++){pDC->SetPixel(x + i, y, RGB(0, 255, 0));}for (i = 0; i < 20; i++){clr = pDC->GetPixel(x + i, y);pDC->SetPixel(x + 100 + i, y, clr);}

图示:


5.6 绘制直线段函数


示例:

CPen newPen, * oldPen;newPen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));oldPen = pDC->SelectObject(&newPen);pDC->MoveTo(100, 50);pDC->LineTo(200, 300);pDC->TextOutW(70, 50, CString("p1"));pDC->TextOutW(230, 300, CString("p2"));pDC->SelectObject(oldPen);newPen.DeleteObject();

图示:


5.7 绘制矩形函数


示例:

CPen p2;p2.CreatePen(PS_SOLID, 5, RGB(255, 0, 0));pDC->SelectObject(&p2);CBrush b2;b2.CreateSolidBrush(RGB(0, 0, 255));pDC->SelectObject(&b2);pDC->RoundRect(10, 20, 300, 200, 30, 30);

图示:

示例:

CPen p3, *oldpen;//声明新画笔对象和旧画笔指针p3.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));//创建1像素宽的蓝色实线画笔oldpen = pDC->SelectObject(&p3);CBrush b3, * oldbrush;//声明新画刷对象和旧画刷指针b3.CreateSolidBrush(RGB(0, 255, 0));//创建绿色实体画刷oldbrush = pDC->SelectObject(&b3);//将新画刷选入设备上下文pDC->Rectangle(100, 100, 600, 300);//绘制矩形pDC->TextOutW(70, 100, CString("p0"));pDC->TextOutW(630, 300, CString("p1"));pDC->SelectObject(&oldpen);//恢复旧画笔pDC->SelectObject(&oldbrush);//恢复旧画刷p3.DeleteObject();// 删除已成自由状态的新画刷b3.DeleteObject();//删除已成自由状态的新画刷

图示:


5.8 绘制椭圆函数

 绘制圆的话就把他描述成一个正方形。

示例:

CPen p2;p2.CreatePen(PS_SOLID, 5, RGB(255, 0, 0));pDC->SelectObject(&p2);CBrush b2;b2.CreateSolidBrush(RGB(0, 0, 255));pDC->SelectObject(&b2);pDC->Ellipse(10, 20, 300, 200);pDC->Ellipse(-200, 300, -100, 200);

图示:


5.9 绘制多边形函数

在描述多边形各顶点时,应该顺时针或逆时针来描绘各顶点,不能交叉描述。

示例:

//绘制三角形CPoint p[3];p[0].x = 50;p[0].y = 50;p[1].x = 100;p[1].y = 100;p[2].x = 150;p[2].y = 50;pDC->Polygon(p, 3);

图示:

作业:用多边形函数绘制一个风车
  CRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(), rect.Height());pDC->SetViewportExt(rect.Width(), -rect.Height());pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);rect.OffsetRect(-rect.Width()/2, -rect.Height()/2);pDC->TextOutW(30, 20, CString("O"));CPoint p[3];p[0] = CPoint(0, 0);p[1] = CPoint(100,-100);p[2] = CPoint(300, 0);pDC->Polygon(p, 3);CPoint a[3];a[0] = CPoint(0, 0);a[1] = CPoint(100, 100);a[2] = CPoint(0, 300);pDC->Polygon(a, 3);CPoint b[3];b[0] = CPoint(0, 0);b[1] = CPoint(-100, 100);b[2] = CPoint(-300, 0);pDC->Polygon(b, 3);CPoint c[3];c[0] = CPoint(0, 0);c[1] = CPoint(-100, -100);c[2] = CPoint(0,-300);pDC->Polygon(c, 3);

图示:


5.10 填充矩形函数

pDC->FillSolidRect(&rect,RGB(0,0,0));

5.11 路径层函数


//绘制第一个多边形,用FillPath()函数填充CPoint p[7];//声明多边形顶点数组p[0] = CPoint(220, 140);p[1] = CPoint(140, 60);p[2] = CPoint(100, 160);p[3] = CPoint(140, 270);p[4] = CPoint(200, 200);p[5] = CPoint(240, 270);p[6] = CPoint(320, 120);pDC->TextOutW(220, 100, CString("P0"));pDC->TextOutW(140, 50, CString("P1"));pDC->TextOutW(60, 160, CString("P2"));pDC->TextOutW(140, 300, CString("P3"));pDC->TextOutW(200, 260, CString("P4"));pDC->TextOutW(240, 300, CString("P5"));pDC->TextOutW(320, 120, CString("P6"));CPen p1,*p2;p1.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));p2=pDC->SelectObject(&p1);CBrush b1,*b2;b1.CreateSolidBrush(RGB(0, 255, 0));b2=pDC->SelectObject(&b1);pDC->BeginPath();pDC->MoveTo(p[0]);for (int i =1; i < 7; i++){pDC->LineTo(p[i]);}pDC->LineTo(p[0]);pDC->EndPath();pDC->FillPath();//绘制第二个多边形,用StrokeAndFillPath()函数填充CPoint c[7];//声明多边形顶点数组c[0] = CPoint(-220, 140);c[1] = CPoint(-140, 60);c[2] = CPoint(-100, 160);c[3] = CPoint(-140, 270);c[4] = CPoint(-200, 200);c[5] = CPoint(-240, 270);c[6] = CPoint(-320, 120);pDC->TextOutW(-220, 100, CString("P0"));pDC->TextOutW(-140, 50, CString("P1"));pDC->TextOutW(-60, 160, CString("P2"));pDC->TextOutW(-140, 300, CString("P3"));pDC->TextOutW(-200, 260, CString("P4"));pDC->TextOutW(-240, 300, CString("P5"));pDC->TextOutW(-320, 120, CString("P6"));pDC->BeginPath();pDC->MoveTo(c[0]);for (int i = 1; i < 7; i++){pDC->LineTo(c[i]);}pDC->LineTo(c[0]);pDC->EndPath();pDC->StrokeAndFillPath();//绘制第三个多边形,用画刷填充CPoint a[7];//声明多边形顶点数组a[0] = CPoint(-220, 140);a[1] = CPoint(-140, 60);a[2] = CPoint(-100, 160);a[3] = CPoint(-140, 270);a[4] = CPoint(-200, 200);a[5] = CPoint(-240, 270);a[6] = CPoint(-320, 120);pDC->TextOutW(-220, -100, CString("P0"));pDC->TextOutW(-140, -50, CString("P1"));pDC->TextOutW(-60, -160, CString("P2"));pDC->TextOutW(-140, -300, CString("P3"));pDC->TextOutW(-200, -260, CString("P4"));pDC->TextOutW(-240, -300, CString("P5"));pDC->TextOutW(-320, -120, CString("P6"));pDC->Polygon(a, 7);pDC->SelectObject(b2);b1.DeleteObject();pDC->SelectObject(p2);p1.DeleteObject();

图示:


例题:

代码:

//第一种CPoint p[7];//声明多边形顶点数组p[0] = CPoint(-580, 140);p[1] = CPoint(-660, 60);p[2] = CPoint(-700, 160);p[3] = CPoint(-660, 270);p[4] = CPoint(-600, 200);p[5] = CPoint(-560, 270);p[6] = CPoint(-480, 120);pDC->TextOutW(-580, 100, CString("P0"));pDC->TextOutW(-660, 50, CString("P1"));pDC->TextOutW(-740, 160, CString("P2"));pDC->TextOutW(-660, 300, CString("P3"));pDC->TextOutW(-600, 260, CString("P4"));pDC->TextOutW(-560, 300, CString("P5"));pDC->TextOutW(-480, 120, CString("P6"));CPen p1, * p2;p1.CreatePen(PS_SOLID, 4, RGB(0, 0, 255));p2 = pDC->SelectObject(&p1);CBrush b1, * b2;b1.CreateSolidBrush(RGB(0, 255, 0));b2 = pDC->SelectObject(&b1);pDC->BeginPath();pDC->MoveTo(p[0]);for (int i = 1; i < 7; i++){pDC->LineTo(p[i]);}pDC->LineTo(p[0]);pDC->EndPath();pDC->FillPath();//第二种CPoint d[7];//声明多边形顶点数组d[0] = CPoint(-280, 140);d[1] = CPoint(-360, 60);d[2] = CPoint(-400, 160);d[3] = CPoint(-360, 270);d[4] = CPoint(-300, 200);d[5] = CPoint(-260, 270);d[6] = CPoint(-180, 120);pDC->TextOutW(-280, 100, CString("P0"));pDC->TextOutW(-360, 50, CString("P1"));pDC->TextOutW(-440, 160, CString("P2"));pDC->TextOutW(-360, 300, CString("P3"));pDC->TextOutW(-300, 260, CString("P4"));pDC->TextOutW(-260, 300, CString("P5"));pDC->TextOutW(-180, 120, CString("P6"));pDC->BeginPath();pDC->MoveTo(d[0]);for (int i = 1; i < 7; i++){pDC->LineTo(d[i]);}pDC->LineTo(d[0]);pDC->EndPath();pDC->StrokeAndFillPath();//第三种CPoint e[7];//声明多边形顶点数组e[0] = CPoint(20, 140);e[1] = CPoint(-60, 60);e[2] = CPoint(-100, 160);e[3] = CPoint(-60, 270);e[4] = CPoint(0, 200);e[5] = CPoint(40, 270);e[6] = CPoint(120, 120);pDC->TextOutW(20, 100, CString("P0"));pDC->TextOutW(-60, 50, CString("P1"));pDC->TextOutW(-130, 160, CString("P2"));pDC->TextOutW(-60, 300, CString("P3"));pDC->TextOutW(0, 260, CString("P4"));pDC->TextOutW(40, 300, CString("P5"));pDC->TextOutW(120, 120, CString("P6"));pDC->Polygon(e, 7);

图示:


5.12 绘制Bezier样条函数





例题:
代码:

CPoint p[7];p[0] = CPoint(100, 400);p[1] = CPoint(200, 200);p[2] = CPoint(500, 100);p[3] = CPoint(550, 300);double k = (p[3].y - p[2].y) / (p[3].x - p[2].x);double x = 600;double y = k * (x - p[3].x) + p[3].y;p[4] = CPoint(ROUND(x), ROUND(y));p[5] = CPoint(900, 400);p[6] = CPoint(800, 120);for (int i = 0; i < 7; i++){if (i == 0)pDC->MoveTo(p[i]);elsepDC->LineTo(p[i]);//绘制控制多边形顶点的小圆点pDC->Ellipse(p[i].x - 5, p[i].y - 5, p[i].x + 5, p[i].y + 5);}CPen p1, * p2;p1.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));p2 = pDC->SelectObject(&p1);pDC->PolyBezier(p, 7);p1.DeleteObject();
这里的ROUND()是四舍五入的作用,需要加上宏定义:#define ROUND(d) int(d+0.5)

图示:


6.显示位图




示例:

CRect rect;//声明客户区GetClientRect(&rect);//获得客户区坐标CDC memDC;//声明一个内存设备上下文对象memDC.CreateCompatibleDC(pDC);//创建与显示设备上下文pDC兼容的内存设备上下文memDCCBitmap newBitmap, * oldBitmap;//定义一个CBitmap的对象和指针newBitmap.LoadBitmap(IDB_BITMAP1);//用LoadBitmap为newBitmap对象加载资源位图oldBitmap = memDC.SelectObject(&newBitmap);//再将位图图像选入内存设备上下文中BITMAP bmp;//声明位图结构体对象newBitmap.GetBitmap(&bmp);//获得位图数据//计算位图在窗口客户区居中显示的左上角坐标int nX = rect.left + (rect.Width() - bmp.bmWidth) / 2;int nY = rect.top + (rect.Height() - bmp.bmHeight) / 2;//将内存DC中的位图拷贝到设备DCpDC->BitBlt(nX, nY, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);//如果想要位图充满整个客户区,要用到StretchBlt函数
//pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);//恢复设备上下文memDC.SelectObject(oldBitmap);
如果出现“LoadBitmap(IDB_BITMAP1)----未定义标志符IDB_BITMAP1”这个报错,就需要加上#include"resource.h"的头文件

nX,nY计算详解:

图示:


7. 设备上下文的调用与释放


8.双缓冲动画

8.1 火焰动画示例:


首先要将位图加载到资源中,并修改名称为IDM_FLAME;
然后打开Test_2View.h文件,找到操作,在其中声明双缓冲函数:

打开Test_2View.cpp,在里面定义双缓冲函数:
其中小位图的总数m_TotalBmps需要在Test_2View.h文件中进行声明,并在Test_2View.cpp文件中的构造函数里面进行初始化。

若要形成动画,在BitBlt函数中还需要一个参数,让这个函数按照一定的时间间隔拷贝位图,并且还要在Test_2View.h中声明这个参数,并在Test_2View.cpp文件中构造函数中初始化为0.

void CTest2View::DoubleBuffer(CDC* pDC)
{CRect rect;//声明客户区矩形GetClientRect(&rect);//获得客户区坐标pDC->FillSolidRect(rect,RGB(0, 0, 0));//将客户区背景色填充成黑色CDC memDC;//声明一个内存设备上下文对象memDC.CreateCompatibleDC(pDC);//创建与显示设备上下文对象pDC兼容的内存设备上下文对象CBitmap newBitmap, * oldBitmap;newBitmap.LoadBitmap(IDB_FLAME);//为newBitmap对象加载位图资源oldBitmap = memDC.SelectObject(&newBitmap);//在内存设备上下文中选入位图图像BITMAP bmp;//声明位图结构体对象newBitmap.GetBitmap(&bmp);//将newBitmap对象中的位图信息存放到结构体变量中//计算小位图宽度=刚导入的位图总宽/小位图总数//m_TotalBmps需要在view.h中进行声明int nbmpWidth = bmp.bmWidth / m_TotalBmps;//计算位图居中显示时左上角点的坐标int nX = rect.left + (rect.Width() - nbmpWidth) / 2;int nY = rect.top + (rect.Height() - bmp.bmHeight) / 2;//用位块传送函数依次将小位图从内存设备上下文拷贝到显示设备上下文中//若要形成动画,这需要一个参数,让这个函数按照一定的时间间隔拷贝位图//并且还要在Test_2View.h中声明这个参数,并在构造函数中初始化为0pDC->BitBlt(nX, nY, nbmpWidth, rect.Height(), &memDC, m_Num * bmp.bmWidth / m_TotalBmps, 0, SRCCOPY);//最后恢复设备上下文memDC.SelectObject(oldBitmap);
}

最后如果我们想要m_Num这个参数起作用,还要设置定时器,那我们如何在MFC中添加呢?

在ondraw函数中设置定时器:

如果没有关闭定时器,会是闪动的动画:

flame动画

如果关闭了定时器,会是下面这样静止的画面:


8.2 双缓冲动画(小球碰撞:红色球与客户区碰撞)

在菜单项中进行一系列操作后,还要在view.h的头文件中对一些变量和函数进行声明:

  protected:BOOL bPlay;//用来控制动画的暂停和播放int nWidth, nHeight;//客户区的宽,高CPoint direction;//小球的运动方向//用圆来代替球int r;//半径CPoint pt;//圆的中心点// 操作public:void DoubleBuffer(CDC* pDC);//双缓冲函数void DrawObject(CDC* pDC);//绘制函数void BorderTest();//遇到边界要有碰撞检测

在veiw.cpp文件的构造函数中进行初始化:

CTest2FootballTestView::CTest2FootballTestView() noexcept
{// TODO: 在此处添加构造代码bPlay = FALSE;//开关设为关pt = CPoint(200, 200);//中心点赋值direction = CPoint(1, 1);//运动方向:x,y方向各一步长}

在ondraw函数中调用双缓冲:

void CTest2FootballTestView::OnDraw(CDC* pDC)
{CTest2FootballTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码//调用双缓冲DoubleBuffer(pDC);}

定义双缓冲:

//定义双缓冲
void CTest2FootballTestView::DoubleBuffer(CDC* pDC)
{//该案例不需要自定义坐标系,直接来写双缓冲即可CRect rect;//声明客户区矩形GetClientRect(&rect);//获得客户区坐标//设置客户区的宽,高nWidth = rect.Width();nHeight = rect.Height();//定义内存DCCDC memDC;//创建一个与显示DC兼容的内存DCmemDC.CreateCompatibleDC(pDC);CBitmap newBitmap, * oldBitmap;//创建兼容内存位图newBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//将兼容位图选入内存DColdBitmap = memDC.SelectObject(&newBitmap);//绘制DrawObject(&memDC);//碰撞检测BorderTest();//显示内存位图pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0,0, SRCCOPY);//恢复memDC.SelectObject(oldBitmap);newBitmap.DeleteObject();}

定义绘制函数:

//定义绘制函数
void CTest2FootballTestView::DrawObject(CDC* pDC)
{//不绘制小球的边界线CPen *oldPen = (CPen *)pDC->SelectStockObject(NULL_PEN);CBrush newBrush(RGB(255, 0, 0));CBrush* oldBrush = pDC->SelectObject(&newBrush);//设置半径r = nWidth / 10;//绘制圆(左上角坐标:圆心坐标-r;右下角坐标:圆心坐标+r)pDC->Ellipse(pt.x - r, pt.y - r, pt.x + r, pt.y + r);pDC->SelectObject(oldBrush);pDC->SelectObject(oldPen);}

定义边界检测函数:

//定义边界检测函数
void CTest2FootballTestView::BorderTest()
{if (pt.x + r >= nWidth)//说明与右边界进行了碰撞direction.x = -1;//那么x方向变为朝左if (pt.x - r <=0)//说明与左边界进行了碰撞direction.x = 1;//那么方向应该每次+1if (pt.y + r >= nHeight)//与下边界碰撞direction.y = -1;if (pt.y - r <=0)//与上边界碰撞direction.y = 1;
}

在OnTimer函数中根据球体的运动方向改变小球的中心位置:

void CTest2FootballTestView::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//根据球体的运动方向改变小球的中心位置pt += direction;Invalidate(FALSE);CView::OnTimer(nIDEvent);
}

在菜单响应函数OnGraph()中播放或停止动画:

void CTest2FootballTestView::OnGraph()
{// TODO: 在此添加命令处理程序代码//在菜单相应栏中播放或停止动画bPlay = !bPlay;if (bPlay){//如果播放,每隔10ms发送一个时钟脉冲来触发动画SetTimer(1, 10, NULL);}else{//暂停就关闭定时器KillTimer(1);}
}

在OnUpdateGraph(CCmdUI* pCmdUI)函数中添加对菜单项显示状态的控制代码:

//添加对菜单项显示状态的控制代码
void CTest2FootballTestView::OnUpdateGraph(CCmdUI* pCmdUI)
{// TODO: 在此添加命令更新用户界面处理程序代码//设置菜单项选中时图标是暗下状态if (bPlay){pCmdUI->SetCheck(TRUE);//菜单提示下一次按下会停止pCmdUI->SetText(_T("停止"));}else{//设置菜单项未选中时图标是弹起状态pCmdUI->SetCheck(FALSE);//菜单提示下一次按下会播放pCmdUI->SetText(_T("播放"));}}

运行结果如下:

双缓冲动画-小球碰撞

第二章:MFC绘图基础相关推荐

  1. 计算机的指令合成为,第二章计算机操作基础知识doc

    第二章计算机操作基础知识doc (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 23.9 积分 第二章  计算机操作基础知识第一节  计算机基础知识 ...

  2. 第二章 Mablab语言基础

    第二章 Mablab语言基础 2.1 Matlab的变量与常量 1) input:x=input('please enter a numb') 2) Inf/inf:正无穷大 3) pi:圆周率 4) ...

  3. 第二章:图像处理基础

    第二章:图像处理基础操作 一.图像的基本表示方法: 1. 二值图像: 2. 灰度图像: 3. 彩色图像: 二.像素处理: 1. 二值图像及灰度图像: 2.彩色图像: 3. 使用numpy.array访 ...

  4. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础

    第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass  interface ...

  5. 计算机图形学实验一 《MFC绘图基础》

    计算机图形学实验一 <MFC绘图基础> 视频讲解:无没啥讲的,有一些东西在实验二视频提了一下 一.MFC介绍 1.基本介绍: MFC是微软公司提供的一个类库,以C++类的形式封装了Wind ...

  6. 《吕鑫:VC++6.0就业培训宝典之MFC视频教程》学习笔记 -- 第二章 MFC原理介绍

    第二章 MFC原理介绍 2.1 第一个Win32软件 2.2 Win32对话框程序开发 2.3 程序资源管理和Windows数据类型 2.4 Win32环境下的多对话框管理 2.5 初步学习MFC软件 ...

  7. 第二章网页前端基础与HTTP协议

    第二章 网页前端基础与HTTP协议 爬虫需要遵循网络传输协议才能与服务器进行通信,当与服务器建立通信后,爬虫才能获取网页内容,从而获取想要爬取的内容.获取到的网页内容通常为HTML(HyperText ...

  8. 进击 !!第二章 JAVA编程基础

    第二章 JAVA编程基础 目标: 掌握java的基本语法,常量,变量,流程控制语句,方法以及数组 运用java运算符的使用 了解java代码的基本格式 2.1java 的基本语法 1. 代码的基本格式 ...

  9. 计算机绘图的最小单位,[工学]第2章 计算机绘图基础简洁版.ppt

    [工学]第2章 计算机绘图基础简洁版 * * 2.三角形面积累加法 考虑矢量的方向,取顺时针的顺序,即可得到由顶点坐标计算多边形的面积公式: 当i=n时, . * * 引申到闭合曲线求面积 由多边形面 ...

  10. 计算机绘图基础属于哪一类,第2章计算机绘图基础(简洁版).ppt

    第2章计算机绘图基础(简洁版) * * 2.三角形面积累加法 考虑矢量的方向,取顺时针的顺序,即可得到由顶点坐标计算多边形的面积公式: 当i=n时, . * * 引申到闭合曲线求面积 由多边形面积计算 ...

最新文章

  1. 看板与Scrum:哪个更适合你的团队?
  2. python填写excel-python读写Excel
  3. 以太币(Ether)的单位
  4. 2015 计算机考研大纲,2015年考研计算机大纲详解:操作系统
  5. cnpm在ubuntu19.10下面的安装以及vue.js中el的意思
  6. List - Map 工具类,list转为map
  7. 老公想入手一块10万左右的手表有哪些推荐?
  8. android语音识别服务,使用语音服务 API 的语音识别 - Xamarin | Microsoft Docs
  9. 链表相关的面试题型总结
  10. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)
  11. SuperMap iClient3D for WebGL实现三维管线分析
  12. Spring STS 修改启动Java VM
  13. 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
  14. 小程序全局悬浮窗_微信小程序中悬浮窗功能的实现代码
  15. 利用计算机Tracert,计算机网络 Tracert 命令
  16. 跳棋c语言课程设计,C语言课程设计(论文)-跳棋--154591860.doc
  17. 指纹识别-传感器原理
  18. 1/cos(x)、1/sin(x)的不定积分推导
  19. 大会员 python
  20. Micropython实现表情识别控制小车运行

热门文章

  1. dh算法 java_java密钥交换算法DH定义与应用实例分析
  2. php程序员 好书,PHP程序员要看的书单
  3. 记一次云主机如何挂载对象存储
  4. OSPF区域划分和区域间路由(三类LSA)
  5. 阿里云EMAS移动测试|快速掌握移动端兼容性测试技巧
  6. Vue报错:contains both .browserslistrc and package.json with browsers
  7. idea中Empty tag doesn‘t work in some browsers 浏览器中一片空白,没有渲染样式,
  8. 启用邪恶-使用XmlSerializer和一些魔术在Xml中隧道化Xml
  9. 好记性不如烂笔头之Maven使用小记
  10. 《SICP》习题第1章