索引可以定义如何绘制几何体。比如,通过创建三角形来画一个四边形,每个三角形需要3个顶点,总共就需要6个顶点来创建一个四边形。若使用索引缓冲,则只需要4个顶点就可创建一个四边形。索引列表中第一个三角形的顶点为(0,1,2),第二个为(0,2,3)。类似如下帮助理解:

图片来自网址

一个索引列表通常是一个三角形列表。它们对绘制几何体是非常有用的,它们还能够保存顶点数。在加载模型时也是非常有用的。

索引:

若想要绘制一个四边形,在没有索引缓冲的情况下,需要绘制两个三角形。每个三角形包含3个顶点。因此顶点缓冲看起来类似这样的:{v0, v1, v2, v3, v4, v5}。三角形1定义为v0,v1,v2,三角形2定义为v3,v4,v5。

现在,假设有一个巨大的模型包含了上千个三角形,此时必须做好多重复的顶点。使用索引列表定义三角形,顶点缓冲就会类似于这样:{v0,v1,v2,v3}.三角形1定义为v0,v1,v2,三角形2定义为v0,v2,v3。

全局声明

将顶点缓冲的变量名改为四边形而不是之前的三角形。如下:

ID3D11Buffer* squareIndexBuffer;
ID3D11Buffer* squareVertBuffer;

顶点列表

已经修改该顶点列表,让它看起来像一个四边形并添加一个顶点。

Vertex v[] =
{Vertex( -0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f ),Vertex( -0.5f,  0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f ),Vertex(  0.5f,  0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f ),Vertex(  0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f ),
};

索引缓冲

首先,创建一个DWORD类型的数组来定义2个三角形。随后初始化并填充对象D3D11_BUFFER_DESC来定义索引缓冲。可看到字节宽度是DWORD长度的2*3倍。这是因为索引数组中的每个元素是DWORD类型的,因此必须获得DWORD类型的大小,并将它乘以面(或三角形)的数量,随后乘以3,因为每个三角形包含了3个顶点,或索引数组中的元素。随后设定绑定标志为D3D11_BIND_INDEX_BUFFER。这将告诉IA管线的阶段这是一个索引缓冲。

DWORD indices[] = {0, 1, 2,0, 2, 3,
};D3D11_BUFFER_DESC indexBufferDesc;
ZeroMemory( &indexBufferDesc, sizeof(indexBufferDesc) );indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;
indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indexBufferDesc.CPUAccessFlags = 0;
indexBufferDesc.MiscFlags = 0;

随后,将索引数组放入到D3D11_SUBRESOURCE_DATA中,调用D3D11DeviceContext::CreateBuffer()创建缓冲,随后调用函数D3D11DeviceContext::IASetIndexBuffer()将该缓冲绑定到管线的IA阶段。第一个参数是创建的索引缓冲,第二个参数是格式。指定为DXGI_FORMAT_R32_UINT格式,只是一个32位的浮点型格式,对16位的浮点型也可指定格式DXGI_FORMAT_R16_UINIT。最后一个参数是索引数组中的第一个要使用的索引的位置偏移。获取在索引缓冲中定义了不止一个对象,但是只想要绘制一个。在绘制对象之前,可将索引缓冲与物体的起始偏移绑定。

D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = indices;
d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &squareIndexBuffer);d3d11DevCon->IASetIndexBuffer( squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);

索引缓冲

由于添加了另一个顶点到顶点数组,必须更新缓冲大小为4个顶点的大小而不是3个。

vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof( Vertex ) * 4;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;

记得不要忘记释放COM对象

void CleanUp()
{//Release the COM Objects we createdSwapChain->Release();d3d11Device->Release();d3d11DevCon->Release();renderTargetView->Release();squareVertBuffer->Release();squareIndexBuffer->Release();VS->Release();PS->Release();VS_Buffer->Release();PS_Buffer->Release();vertLayout->Release();
}

索引缓冲

随后绘制四边形,可调用D3D11DeviceContext::DrawIndexed()函数绘制索引图元。第一个参数为要绘制的索引数量,第二个参数为从索引缓存起始处到开始绘制处的偏移。若只想绘制第二个三角形可指定为“4”。第三个参数为顶点缓冲的起始处到开始绘制处的偏移。可能会有两个索引缓冲,一个描述的是球,另一个描述的是盒子。但是可能将这两个都放在同一个顶点缓冲中,球是索引缓冲中的第一个顶点集,盒子是第二个。因此若要绘制盒子,在球内必须设置第三个参数为顶点数量,以便盒子是第一个开始绘制。

void DrawScene()
{//Clear our backbufferfloat bgColor[4] = {(0.0f, 0.0f, 0.0f, 0.0f)};d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);//Draw the triangled3d11DevCon->DrawIndexed( 6, 0, 0 );//Present the backbuffer to the screenSwapChain->Present(0, 0);
}

实例代码如下:

#include "stdafx.h"
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")#include <windows.h>
#include "Resource.h"
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>
#include <xnamath.h>//全局描述符
IDXGISwapChain* SwapChain;
ID3D11Device* d3d11Device;
ID3D11DeviceContext* d3d11DevCon;
ID3D11RenderTargetView* renderTargetView;//索引缓冲
ID3D11Buffer* squareIndexBuffer;
ID3D11Buffer* squareVertBuffer;//着色器
ID3D11Buffer* triangleVertBuffer;
ID3D11VertexShader* VS;
ID3D11PixelShader* PS;
ID3D10Blob* VS_Buffer;
ID3D10Blob* PS_Buffer;
ID3D11InputLayout* vertLayout;
#if 0
float red = 0.0f;
float green = 0.0f;
float blue = 0.0f;
int colormodr = 1;
int colormodg = 1;
int colormodb = 1;
#endif
/
LPCTSTR WndClassName = "firstwindow";
HWND hwnd = NULL;
HRESULT hr;const int Width = 800; //设置宽
const int Height = 800; // 设置高
//函数声明
bool InitializeDirect3d11App(HINSTANCE hInstance);
//void ReleaseObjects();
void CleanUp();
bool InitScene();
void UpdateScene();
void DrawScene();// 初始化窗口
bool InitializeWindow(HINSTANCE hInstance,int ShowWnd,int width, int height,bool windowed);//初始化消息循环函数
int messageloop();
//初始化窗口回调过程。Windows API是事件驱动型的编程模型。在该函数中捕获Windows消息,比如一个按键按下(也叫事件)以及程序操作流程。LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);//顶点结构体以及顶点布局(输入布局)
struct Vertex
{Vertex(){}Vertex(float x, float y, float z,float cr, float cg, float cb, float ca):pos(x, y, z), color(cr, cg, cb, ca){}XMFLOAT3 pos;XMFLOAT4 color;
};D3D11_INPUT_ELEMENT_DESC layout[] = {{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);//主函数,传入应用程序句柄hInstance,前一个应用程序句柄hPrevInstance,传给函数处理的命令行lpCmdLine以及窗口显示方式的nShowCmd
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{//创建并注册窗口if (!InitializeWindow(hInstance, nShowCmd, Width, Height, true)){MessageBox(0, "Window Initilization - Failed", "Error", MB_OK);return 0;}/newif (!InitializeDirect3d11App(hInstance)) // 初始化D3D{MessageBox(0, "Direct3D Initialization - Failed", "Error", MB_OK);return 0;}if (!InitScene()){MessageBox(0, "Scene Initialization - Failed", "Error", MB_OK);return 0;}messageloop();CleanUp();//ReleaseObjects();return 0;
}
// windowed 若为true则为窗口模式显示,若为false则为全屏模式显示
bool InitializeWindow(HINSTANCE hInstance,int ShowWnd,int width, int height,bool windowed)
{/*typedef struct _WNDCLASS{UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;}WNDCLASS;*/WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX); //window类的大小/********windows类风格*CS_CLASSDC 一个使用该类创建的在所有窗口间共享的设备上下文*CS_DBLCLKS 在窗口上使能双击功能*CS_HREDRAW 若窗口的宽度有改变或者窗口水平地移动,窗口将会刷新*CS_NOCLOSE 窗口菜单上禁止关闭选项*CS_OWNDC   为每个窗口创建自己的设备上下文。正好与CS_CLASSDC相反*CS_PARENTDC 这会设置创建的子窗口的剪裁四边形到父窗口,这允许子窗口能够在父窗口上绘画*CS_VERDRAW 若在窗口的高度或窗口在垂直方向有移动窗口会重绘**/wc.style = CS_HREDRAW | CS_VREDRAW;//lpfnWndProc是一个指向处理窗口消息函数的指针,设置窗口处理函数的函数名WndProcwc.lpfnWndProc = WndProc;//cbClsExtra是WNDCLASSEX之后额外申请的字节数wc.cbClsExtra = NULL;//cbWndExtra指定窗口实例之后所申请的字节数wc.cbWndExtra = NULL;//当前窗口应用程序的句柄,通过给函数GetModuleHandle()函数第一个参数传入NULL可获取当前窗口应用程序。wc.hInstance = hInstance;//hIcon用来指定窗口标题栏左上角的图标。以下是一些标准图标:/**IDI_APPLICATION 默认应用程序图标*IDI_HAND 手形状的图标*IDI_EXCLAMATION 感叹号图标*IDI_INFORMATION 星号图标*IDI_QUESTION 问号图标*IDI_WINLOGO 若使用的是XP则是默认应用程序图标,否则是窗口logo*/wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_SMALL);/*定义光标图标*IDC_APPSTARTING 标准箭头以及小型沙漏光标*IDC_ARROW 标准箭头光标*IDC_CROSS 十字线光标*IDC_HAND 手型光标*IDC_NO 斜线圈光标*IDC_WAIT 沙漏光标*/wc.hCursor = LoadCursor(NULL, IDC_ARROW);//hbrBackground是一个刷子的句柄,可使得背景黑色。wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW + 2);//附加到窗口的菜单名字,不需要的话设置为NULLwc.lpszMenuName = NULL;//对类进行命名wc.lpszClassName = WndClassName;//指定任务栏的图标,使用上面的IDI_图标wc.hIconSm = LoadIcon(NULL, (LPCTSTR)IDI_MYICON);//注册类。若失败则会获得一个错误,若成功,则继续创建窗口if (!RegisterClassEx(&wc)){MessageBox(NULL, "Error registering class", "Error", MB_OK | MB_ICONERROR);return 1;}//创建窗口hwnd = CreateWindowEx(NULL, WndClassName, "Drawing Square", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width,height, NULL, NULL, hInstance, NULL);if (!hwnd){MessageBox(NULL, "Error registering class", "Error", MB_OK | MB_ICONERROR);return 1;}//BOOL ShowWindow(HWND hWnd, int nCmdShow);//BOOL UpdateWindow(HWND hWnd);ShowWindow(hwnd, ShowWnd);UpdateWindow(hwnd);// 发送WM_PAINT消息到窗口过程,若窗口客户区没有任何东西要显示,则不发送消息。返回true,继续运行到mainloop中去。return true;
}bool InitializeDirect3d11App(HINSTANCE hInstance)
{//声明缓冲DXGI_MODE_DESC bufferDesc;ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));bufferDesc.Width = Width;bufferDesc.Height = Height;bufferDesc.RefreshRate.Numerator = 60;bufferDesc.RefreshRate.Denominator = 1;bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;//声明交换链DXGI_SWAP_CHAIN_DESC swapChainDesc;ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));swapChainDesc.BufferDesc = bufferDesc;swapChainDesc.SampleDesc.Count = 1;swapChainDesc.SampleDesc.Quality = 0;swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;swapChainDesc.BufferCount = 1;swapChainDesc.OutputWindow = hwnd;swapChainDesc.Windowed = TRUE;swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;//创建交换链D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL,D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, NULL, &d3d11DevCon);//创建后缓冲ID3D11Texture2D* BackBuffer;SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer);//创建渲染目标d3d11Device->CreateRenderTargetView(BackBuffer, NULL, &renderTargetView);BackBuffer->Release();//设置渲染目标d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, NULL);return true;
}void CleanUp()
{SwapChain->Release();d3d11Device->Release();d3d11DevCon->Release();renderTargetView->Release();squareVertBuffer->Release();squareIndexBuffer->Release();//triangleVertBuffer->Release();VS->Release();PS->Release();VS_Buffer->Release();PS_Buffer->Release();vertLayout->Release();
}void ReleaseObjects()
{
//释放创建的COM对象SwapChain->Release();d3d11Device->Release();d3d11DevCon->Release();
}bool InitScene()
{//编译着色器hr = D3DX11CompileFromFile("Effects.fx", 0, 0, "VS", "vs_4_0", 0, 0, 0, &VS_Buffer, 0, 0);hr = D3DX11CompileFromFile("Effects.fx", 0, 0, "PS", "ps_4_0", 0, 0, 0, &PS_Buffer, 0, 0);//创建着色器对象hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);//设置顶点和像素着色器d3d11DevCon->VSSetShader(VS, 0, 0);d3d11DevCon->PSSetShader(PS, 0, 0);//创建顶点缓冲Vertex v[] = {Vertex(-0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f),Vertex(-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f),Vertex(0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f),Vertex(0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f),};DWORD indices[] = {0,1,2,0,2,3,};D3D11_BUFFER_DESC indexBufferDesc;ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;indexBufferDesc.CPUAccessFlags = 0;indexBufferDesc.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = indices;d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &squareIndexBuffer);d3d11DevCon->IASetIndexBuffer(squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);D3D11_BUFFER_DESC vertexBufferDesc;ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;vertexBufferDesc.ByteWidth = sizeof(Vertex) * 4;vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;vertexBufferDesc.CPUAccessFlags = 0;vertexBufferDesc.MiscFlags = 0;D3D11_SUBRESOURCE_DATA vertexBufferData;ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));vertexBufferData.pSysMem = v;hr = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &squareVertBuffer);//设置顶点缓冲UINT stride = sizeof(Vertex);UINT offset = 0;d3d11DevCon->IASetVertexBuffers(0, 1, &squareVertBuffer, &stride, &offset);//创建输入布局d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),VS_Buffer->GetBufferSize(), &vertLayout);//设置输入布局d3d11DevCon->IASetInputLayout(vertLayout);//设置图元拓扑d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);//创建视口D3D11_VIEWPORT viewport;ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));viewport.TopLeftX = 0;viewport.TopLeftY = 0;viewport.Width = Width;viewport.Height = Height;//设置视口d3d11DevCon->RSSetViewports(1, &viewport);return true;
}void UpdateScene()
{// 更新场景颜色
#if 0red += colormodr * 0.00005f;green += colormodg * 0.00002f;blue += colormodb * 0.00001f;if (red >= 1.0f || red <= 0.0f)colormodr *= -1;if (green >= 1.0f || green <= 0.0f)colormodg *= -1;if (blue >= 1.0f || blue <= 0.0f)colormodb *= -1;
#endif
}void DrawScene()
{//将更新的颜色填充后缓冲
//  D3DXCOLOR bgColor(red, green, blue, 1.0f);float bgColor[4] = {(0.0f, 0.0f, 0.0f, 0.0f)};d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);//绘制三角形d3d11DevCon->DrawIndexed(6, 0, 0);//画三角形//d3d11DevCon->Draw(3, 0);//将后缓冲呈现到屏幕SwapChain->Present(0, 0);
}int messageloop(){MSG msg;ZeroMemory(&msg, sizeof(MSG));//清除结构体被设为NULL。while (true){//使用PeekMessage()检查是否有消息传进来/*LPMSG lpMsg 消息结构体的指针*HWND hWnd 发送消息的窗口句柄。若设为NULL,那么它会从当前程序中接收来自任何一个窗口的消息*UINT wMsgFilterMin 指定消息范围内第一个要检查的消息的值。若wMsgFilterMin和wMsgFilterMax都设为0,那么PeekMessage将会检查素有的消息*UINT wMsgFilterMax 指定消息范围内最后一个要检测的消息的值*UINT wRemoveMsg 指定消息的处理方式。若设置为PM_REMOVE,则在读取之后会被删除*/if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){if (msg.message == WM_QUIT){break;}//若消息为窗口消息,则解析并分发它。TranslateMessage()将会让窗口做一些解析,类似键盘的虚拟键值转换到字符形式。//而DispatchMessage()则发送消息到窗口过程WndProc。TranslateMessage(&msg);DispatchMessage(&msg);}else //若没有窗口消息,则运行游戏{// run game codeUpdateScene();DrawScene();}}return msg.wParam;
}//窗口消息处理函数
//HWND hwnd 获取消息的窗口句柄
//UINT msg 消息的内容
/*
*WM_ACTIVE 当窗口激活时发送的消息
*WM_CLOSE 当窗口关闭时发送的消息
*WM_CREATE 当窗口创建时发送的消息
*WM_DESTROY 当窗口销毁时发送的消息
*/
//wParam和lParam时消息的额外信息。使用wParam来检测键盘输入消息
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{// 这是事件检测消息的地方,若escape键被按下,会显示一个消息框,询问是否真的退出。若点击yes,则程序关闭。若不点击,则消息框关闭。若消息包含WM_DESTROY// 则意味着窗口正在被销毁,返回0并且程序关闭switch (msg){case WM_KEYDOWN:if (wParam == VK_ESCAPE){if (MessageBox(0, "Are you sure you want to exit?","Really?", MB_YESNO | MB_ICONASTERISK) == IDYES){DestroyWindow(hwnd);}return 0;}break;case WM_DESTROY:PostQuitMessage(0);break;default:break;}//调用默认窗口过程函数return DefWindowProc(hwnd,msg,wParam,lParam);
}

效果:

参考网址

D3D索引缓冲 - 画一个矩形相关推荐

  1. matlab 画一个矩形

    画一个矩形 %rectangle('Position',[x,y,w,h],'PropertyName',propertyvalue) %axis([xmin,xmax,ymin,ymax]) clc ...

  2. python在坐标轴上画矩形_Python使用matplotlib实现在坐标系中画一个矩形的方法

    本文实例讲述了Python使用matplotlib实现在坐标系中画一个矩形的方法.分享给大家供大家参考.具体实现方法如下: import matplotlib.pyplot as plt from m ...

  3. D2D 学习笔记第一课 初始化D2D 画一个矩形

    头文件 #include <D2D1.h> lib文件 #pragma comment(lib,"D2D1.lib") 首先 新建一个 win32 程序 加入头文件和l ...

  4. 计算机图形学(三)——画一个矩形

    画一个矩形 main.cpp #include <iostream>// GLEW #define GLEW_STATIC #include <GL/glew.h>// GLF ...

  5. WPF动态在画布(Canvas)上画一个矩形。

    应用背景,现在有一个用WPF定义好的画布, <Canvas Name="MapCanvas" Height="{Binding MapTrackCanvasHeig ...

  6. 怎么用Photoshop直接画一个矩形边框

    用Photoshop画矩形的时候,有时需要就画一个单一的边框,内部不需填充颜色,而且边框可以调节宽度和颜色.这时就可以用选择工具拉个矩形框,然后点主菜单,选编辑->描边,再在跳出的窗口选择相关的 ...

  7. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法

    使用HTML5 canvas绘制一个矩形的方法 发布时间:2020-08-29 11:23:12 来源:亿速云 阅读:102 作者:小新 这篇文章将为大家详细讲解有关使用HTML5 canvas绘制一 ...

  8. HTML在指定位置画一个矩形,CAD如何在指定位置绘制矩形?

    在CAD制图中,打好基础是非常重要的,在CAD中有很多基础操作,只有当我们牢牢掌握这些技巧的时候,绘制图纸的时候才能更加的得心应手,今天很大家分享一下澡CAD制动位置绘制举行的操作方法吧! 绘制矩形是 ...

  9. lisp 画一个矩形

    (defun c:tt ()(setq p1 (getpoint "第一点:"))(setq p2 (getpoint p1 "\n**第二点:"))(setq ...

最新文章

  1. 单例测试模式中【饿汉式】与【懒汉式】的区别
  2. java c3p0 连接 mysql_Java使用C3P0数据源链接数据库
  3. 在Apache的POI XWPFRun对象分隔文本行
  4. MySQL数据库之索引的应用
  5. 【学习笔记】吴恩达机器学习 WEEK1
  6. 程序员赚钱致富的6种方法
  7. svn的使用(Mac)
  8. 【leetcode】Min Stack -- python版
  9. 企业如果结合职工筑牢安全生产压舱石_山能枣矿集团柴里煤矿机电运输科扎实推进女职工“素质提升+岗位建功”竞赛活动...
  10. Mybaties入门介绍
  11. java 字节编码_java中字符与字节的编码关系
  12. ubuntu16.04安装monaco字体
  13. python是一门_人人用Python 篇一:Python是一门人人可掌握的手艺
  14. 【论文笔记】ego_planner
  15. 如何在计算机面试中牵着面试官鼻子走?
  16. 操作系统文件管理之FCB
  17. Vue 和 React 的diff有什么不同
  18. [家里蹲大学数学杂志]第389期中国科学院大学2014-2015-1微积分期中考试试题参考解答...
  19. 佳能Canon PIXMA MG5620 打印机驱动
  20. 构建光线跟踪器(Raytracer)

热门文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven (K短路算法模板)
  2. 古墓丽影合集9,10,11,以及十周年纪念
  3. [转]电影有时候不仅仅是娱乐,哈佛商学院和斯坦福要求学生必看的20部电影(当然你可以选择不看,没有人逼迫只有梦想只有天真和勇气的你)...
  4. window7下安装Docker方法
  5. window7安装hadoop2.7.5
  6. excel转实现pdf、图片、base64互转
  7. WINDOWS XP终极设置
  8. Web Components
  9. 宽带出租中节省带宽成本的妙招,一号双拨方案解析
  10. blackice病毒处理方法