DirectX 3D C++ 圆柱体的渲染(源代码)
作业内容 请勿抄袭
代码功能:渲染一个绕中心轴自转的圆柱体。要求该圆柱体高度为3.0,半径为0.5。
#include <windows.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dcompiler.h>
#include <xnamath.h>
#include <cmath>
#include <random>
#include "resource.h"
using namespace std;//自定义圆周率常量的近似值
const float pi = 3.1415926536;//设置基本的参数(包括圆面的顶点数量 圆柱体高度和底面半径)
float TotalHeight = 3.0;
float radius = 0.5;
const int RoundPointNum = 50;//通过结构体定义的方式来定义一个简单的顶点类型
struct SimpleVertex
{XMFLOAT3 Pos; //通过一个三维向量表示顶点的三维坐标信息XMFLOAT4 Color; //通过一个四维向量表示顶点的颜色信息(RGB和透明度)
};//通过结构体的方式定义常量缓冲区的数据格式
struct ConstantBuffer
{XMMATRIX mWorld; //存储世界矩阵,将顶点变换到世界空间XMMATRIX mView; //存储观察矩阵,将顶点变换到观察空间XMMATRIX mProjection; //存储投影矩阵,将顶点坐标变换到裁剪空间
};//全局变量定义区
HINSTANCE g_hInst = NULL; //存储应用程序的实例句柄
HWND g_hWnd = NULL; //存储应用程序的主窗口句柄
D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL; //存储Direct3D驱动类型
D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0; //指定Direct3D特性级别
ID3D11Device* g_pd3dDevice = NULL; //指定Direct3D设备对象
ID3D11DeviceContext* g_pImmediateContext = NULL;
IDXGISwapChain* g_pSwapChain = NULL;
ID3D11RenderTargetView* g_pRenderTargetView = NULL;
ID3D11VertexShader* g_pVertexShader = NULL;
ID3D11PixelShader* g_pPixelShader = NULL;
ID3D11InputLayout* g_pVertexLayout = NULL;
ID3D11Buffer* g_pVertexBuffer = NULL;
ID3D11Buffer* g_pIndexBuffer = NULL;
ID3D11Buffer* g_pConstantBuffer = NULL;
XMMATRIX g_World;
XMMATRIX g_View;
XMMATRIX g_Projection;//前向函数声明(用于后续的过程中)
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
HRESULT InitDevice();
void CleanupDevice();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Render();//程序入口:进行了初始化并进入消息循环,在空闲时间内进行场景渲染
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{//消除未使用参数的编译警告UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);//对窗口进行初始化if (FAILED(InitWindow(hInstance, nCmdShow)))return 0;//初始化Direct3D的设备和相关资源if (FAILED(InitDevice())){CleanupDevice();return 0;}//处理窗口消息和渲染场景MSG msg = { 0 };//循环一直运行知道窗口关闭while (WM_QUIT != msg.message){//判断消息队列中是否还有消息没有处理if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){//将未处理的消息转换为合适的形式发送给窗口过程TranslateMessage(&msg);DispatchMessage(&msg);}//空闲时间则进行渲染else{Render();}}//清理所占用的资源CleanupDevice();//消息循环的退出代码return (int)msg.wParam;
}//初始化窗口并注册窗口类
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow)
{//对窗口的相关属性进行设置WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TUTORIAL1);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wcex.lpszMenuName = NULL;wcex.lpszClassName = L"TutorialWindowClass";wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_TUTORIAL1);//对窗口进行创建if (!RegisterClassEx(&wcex))return E_FAIL;//完成创建窗口的过程g_hInst = hInstance;RECT rc = { 0, 0, 640, 480 };AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);g_hWnd = CreateWindow(L"TutorialWindowClass", L"Direct3D 11 Tutorial 4: 3D Spaces", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,NULL);if (!g_hWnd)return E_FAIL;ShowWindow(g_hWnd, nCmdShow);return S_OK;
}//用于编译着色器的辅助函数
HRESULT CompileShaderFromFile(WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut)
{HRESULT hr = S_OK;DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.// Setting this flag improves the shader debugging experience, but still allows // the shaders to be optimized and to run exactly the way they will run in // the release configuration of this program.dwShaderFlags |= D3DCOMPILE_DEBUG;
#endifID3DBlob* pErrorBlob;hr = D3DX11CompileFromFile(szFileName, NULL, NULL, szEntryPoint, szShaderModel,dwShaderFlags, 0, NULL, ppBlobOut, &pErrorBlob, NULL);if (FAILED(hr)){if (pErrorBlob != NULL)OutputDebugStringA((char*)pErrorBlob->GetBufferPointer());if (pErrorBlob) pErrorBlob->Release();return hr;}if (pErrorBlob) pErrorBlob->Release();return S_OK;
}// 初始化和设置一些与图形渲染相关的对象和参数
HRESULT InitDevice(void)
{//定义了一个名为hr的变量,类型为HRESULT,并将其初始化为S_OKHRESULT hr = S_OK;//定义了一个名为rc的变量,类型为RECT,用于存储窗口的矩形区域RECT rc;//调用GetClientRect函数,将窗口g_hWnd的客户区域的矩形信息存储到rc变量中GetClientRect(g_hWnd, &rc);//计算窗口宽度UINT width = rc.right - rc.left;//计算窗口高度UINT height = rc.bottom - rc.top;//存储创建Direct3D设备时的标志UINT createDeviceFlags = 0;//如果定义了_DEBUG宏,则执行#ifdef _DEBUG和#endif之间的代码块
#ifdef _DEBUG//如果处于调试模式,将D3D11_CREATE_DEVICE_DEBUG标志位按位或运算( |= )到createDeviceFlags变量上createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif//定义了一个名为driverTypes的数组,包含了三种Direct3D驱动类型:硬件驱动、WARP驱动和参考驱动D3D_DRIVER_TYPE driverTypes[] ={D3D_DRIVER_TYPE_HARDWARE,D3D_DRIVER_TYPE_WARP,D3D_DRIVER_TYPE_REFERENCE,};//计算driverTypes数组中驱动类型的数量UINT numDriverTypes = ARRAYSIZE(driverTypes);//定义了一个名为featureLevels的数组,包含了三种Direct3D功能级别:11.0、10.1和10.0D3D_FEATURE_LEVEL featureLevels[] ={D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_10_1,D3D_FEATURE_LEVEL_10_0,};//计算featureLevels数组中功能级别的数量UINT numFeatureLevels = ARRAYSIZE(featureLevels);//设置交换链的描述信息//包括缓冲区数量、尺寸、像素格式、刷新率、使用方式、输出窗口、抗锯齿采样等DXGI_SWAP_CHAIN_DESC sd;ZeroMemory(&sd, sizeof(sd));sd.BufferCount = 1;sd.BufferDesc.Width = width;sd.BufferDesc.Height = height;sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;sd.BufferDesc.RefreshRate.Numerator = 60;sd.BufferDesc.RefreshRate.Denominator = 1;sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;sd.OutputWindow = g_hWnd;sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0;sd.Windowed = TRUE;//使用一个循环来尝试不同的驱动类型,创建Direct3D设备和交换链for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++){g_driverType = driverTypes[driverTypeIndex];hr = D3D11CreateDeviceAndSwapChain(NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext);if (SUCCEEDED(hr))break;}//如果设备和交换链创建失败则返回错误代码if (FAILED(hr))return hr;//创建渲染目标视图ID3D11Texture2D* pBackBuffer = NULL;hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);if (FAILED(hr))return hr;hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView);pBackBuffer->Release();if (FAILED(hr))return hr;//将渲染目标视图设置为当前的渲染目标,以便将渲染的图像输出到该渲染目标g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL);//设置视口,定义了渲染目标上的可见区域D3D11_VIEWPORT vp;vp.Width = (FLOAT)width;vp.Height = (FLOAT)height;vp.MinDepth = 0.0f;vp.MaxDepth = 1.0f;vp.TopLeftX = 0;vp.TopLeftY = 0;g_pImmediateContext->RSSetViewports(1, &vp);//编译顶点着色器ID3DBlob* pVSBlob = NULL;hr = CompileShaderFromFile(L"Cylinder Rendering.fx", "VS", "vs_4_0", &pVSBlob);if (FAILED(hr)){MessageBox(NULL,L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK);return hr;}//创建顶点着色器hr = g_pd3dDevice->CreateVertexShader(pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &g_pVertexShader);if (FAILED(hr)){pVSBlob->Release();return hr;}// 定义输入布局,指定顶点数据的格式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);//创建输入布局,将输入布局元素与顶点着色器关联起来hr = g_pd3dDevice->CreateInputLayout(layout, numElements, pVSBlob->GetBufferPointer(),pVSBlob->GetBufferSize(), &g_pVertexLayout);pVSBlob->Release();if (FAILED(hr))return hr;//设置当前渲染管线中的输入布局g_pImmediateContext->IASetInputLayout(g_pVertexLayout);//编译像素着色器ID3DBlob* pPSBlob = NULL;hr = CompileShaderFromFile(L"Cylinder Rendering.fx", "PS", "ps_4_0", &pPSBlob);if (FAILED(hr)){MessageBox(NULL,L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK);return hr;}//创建像素着色器hr = g_pd3dDevice->CreatePixelShader(pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), NULL, &g_pPixelShader);pPSBlob->Release();if (FAILED(hr))return hr;//设置构成圆面的顶点的个数const int PointNum = 2 * RoundPointNum + 2;float angleUnit = 360.0 / RoundPointNum;float halfHeight = TotalHeight / 2;SimpleVertex vertices[PointNum];random_device device;mt19937 engine(device());uniform_real_distribution<float> getRandom(0.0f, 1.0f);//逐一为每一个顶点设置空间坐标和颜色for (int i(0); i < RoundPointNum; ++i){float x = radius * sin(i * angleUnit * pi / 180.0);float z = radius * cos(i * angleUnit * pi / 180.0);float R = getRandom(engine);float G = getRandom(engine);float B = getRandom(engine);vertices[i] = { XMFLOAT3(x,-halfHeight,z) ,XMFLOAT4(R,G,B,1.0f)};vertices[i + RoundPointNum] = { XMFLOAT3(x,halfHeight,z),XMFLOAT4(R,G,B,1.0f) };}float R1 = getRandom(engine);float G1 = getRandom(engine);float B1 = getRandom(engine);float R2 = getRandom(engine);float G2 = getRandom(engine);float B2 = getRandom(engine);vertices[2 * RoundPointNum] = { XMFLOAT3(0,halfHeight,0),XMFLOAT4(R1,G1,B1,1.0f) };vertices[2 * RoundPointNum + 1] = { XMFLOAT3(0,-halfHeight,0),XMFLOAT4(R2,G2,B2,1.0f) };D3D11_BUFFER_DESC bd;ZeroMemory(&bd, sizeof(bd));//设置缓冲区的使用方式为默认bd.Usage = D3D11_USAGE_DEFAULT;//设置缓冲区的字节宽度bd.ByteWidth = sizeof(SimpleVertex) * PointNum;//设置缓冲区的绑定标志为顶点缓冲区bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;//定义了一个D3D11_SUBRESOURCE_DATA结构体变量,并将其内存清零bd.CPUAccessFlags = 0;//将顶点数据数组的指针赋给InitData的pSysMem成员D3D11_SUBRESOURCE_DATA InitData;ZeroMemory(&InitData, sizeof(InitData));InitData.pSysMem = vertices;//创建顶点缓冲区hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer);//检查创建顶点缓冲区是否失败if (FAILED(hr))return hr;//将顶点缓冲区绑定到输入装配阶段,使得图形渲染管线能够使用该顶点缓冲区中的数据进行渲染UINT stride = sizeof(SimpleVertex);UINT offset = 0;g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);//创建一个索引数组WORD indices[12 * RoundPointNum];for (int i(0); i < RoundPointNum - 1; ++i){//渲染下面的部分indices[i * 12] = 2 * RoundPointNum;indices[i * 12 + 1] = i;indices[i * 12 + 2] = i + 1;//渲染上面的部分indices[i * 12 + 3] = 2 * RoundPointNum + 1;indices[i * 12 + 4] = i + RoundPointNum;indices[i * 12 + 5] = i + RoundPointNum + 1;//渲染侧面的第一个三角形indices[i * 12 + 6] = i;indices[i * 12 + 7] = i + 1;indices[i * 12 + 8] = i + RoundPointNum;//渲染侧面的第二个三角形indices[i * 12 + 9] = i + 1;indices[i * 12 + 10] = i + RoundPointNum;indices[i * 12 + 11] = i + RoundPointNum - 1;}//渲染边界的情况int i(RoundPointNum - 1);//渲染下面的部分indices[i * 12] = 2 * RoundPointNum;indices[i * 12 + 1] = 0;indices[i * 12 + 2] = RoundPointNum - 1;//渲染上面的部分indices[i * 12 + 3] = 2 * RoundPointNum + 1;indices[i * 12 + 4] = RoundPointNum;indices[i * 12 + 5] = 2 * RoundPointNum - 1;//渲染侧面的第一个三角形indices[i * 12 + 6] = RoundPointNum - 1;indices[i * 12 + 7] = 0;indices[i * 12 + 8] = 2 * RoundPointNum - 1;//渲染侧面的第二个三角形indices[i * 12 + 9] = 0;indices[i * 12 + 10] = RoundPointNum;indices[i * 12 + 11] = 2 * RoundPointNum - 1;//设置缓冲区的使用方式为默认bd.Usage = D3D11_USAGE_DEFAULT;//设置缓冲区的字节宽度,这里是每个索引的字节大小乘以索引数量(36个索引)bd.ByteWidth = sizeof(WORD) * (12 * RoundPointNum);bd.BindFlags = D3D11_BIND_INDEX_BUFFER;bd.CPUAccessFlags = 0;InitData.pSysMem = indices;hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer);if (FAILED(hr))return hr;//设置索引缓冲区g_pImmediateContext->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);//设置图元拓扑,表示要绘制的图元拓扑类型为三角形列表g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);//创建常量缓冲区bd.Usage = D3D11_USAGE_DEFAULT;bd.ByteWidth = sizeof(ConstantBuffer);bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;bd.CPUAccessFlags = 0;hr = g_pd3dDevice->CreateBuffer(&bd, NULL, &g_pConstantBuffer);if (FAILED(hr))return hr;//初始化世界矩阵g_World = XMMatrixIdentity();//初始化视图矩阵XMVECTOR Eye = XMVectorSet(0.0f, 1.0f, -5.0f, 0.0f);XMVECTOR At = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);XMVECTOR Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);g_View = XMMatrixLookAtLH(Eye, At, Up);//初始化投影矩阵g_Projection = XMMatrixPerspectiveFovLH(XM_PIDIV2, width / (FLOAT)height, 0.01f, 100.0f);return S_OK;
}//释放创建的对象的函数
void CleanupDevice()
{if (g_pImmediateContext) g_pImmediateContext->ClearState();if (g_pConstantBuffer) g_pConstantBuffer->Release();if (g_pVertexBuffer) g_pVertexBuffer->Release();if (g_pIndexBuffer) g_pIndexBuffer->Release();if (g_pVertexLayout) g_pVertexLayout->Release();if (g_pVertexShader) g_pVertexShader->Release();if (g_pPixelShader) g_pPixelShader->Release();if (g_pRenderTargetView) g_pRenderTargetView->Release();if (g_pSwapChain) g_pSwapChain->Release();if (g_pImmediateContext) g_pImmediateContext->Release();if (g_pd3dDevice) g_pd3dDevice->Release();
}//窗口过程函数,用于处理程序接收到的消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}//用于渲染一帧的函数
void Render(void)
{//记录时间流逝的变量static float t = 0.0f;//检查当前的驱动类型是否为参考驱动类型if (g_driverType == D3D_DRIVER_TYPE_REFERENCE){//如果使用参考驱动类型,将t增加一个固定的增量用于模拟动画效果。t += (float)XM_PI * 0.0125f;}//如果不是参考驱动类型,执行以下代码块else{//记录程序开始运行的时间static DWORD dwTimeStart = 0;//获取当前的系统时间DWORD dwTimeCur = GetTickCount();//如果dwTimeStart为0,表示是第一次执行Render函数,则将dwTimeStart设置为当前时间if (dwTimeStart == 0)dwTimeStart = dwTimeCur;//计算从程序开始运行到当前时间的经过的秒数t = (dwTimeCur - dwTimeStart) / 1000.0f;}//根据时间计算旋转矩阵用于物体的旋转变换g_World = XMMatrixRotationY(t);//定义一个清除元素数组(包含RGBA分量的值)float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f };//使用清除颜色清除后备缓冲区,准备渲染新的帧g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, ClearColor);//定义一个名为cb的常量缓冲区结构ConstantBuffer cb;//将g_World矩阵转置后赋值给cb结构的mWorld成员cb.mWorld = XMMatrixTranspose(g_World);//将g_View矩阵转置后赋值给cb结构的mView成员cb.mView = XMMatrixTranspose(g_View);//将g_Projection矩阵转置后赋值给cb结构的mProjection成员cb.mProjection = XMMatrixTranspose(g_Projection);//将cb结构的数据更新到常量缓冲区g_pConstantBuffer中g_pImmediateContext->UpdateSubresource(g_pConstantBuffer, 0, NULL, &cb, 0, 0);//设置顶点着色器为g_pVertexShaderg_pImmediateContext->VSSetShader(g_pVertexShader, NULL, 0);//将常量缓冲区g_pConstantBuffer绑定到顶点着色器的指定槽位g_pImmediateContext->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);//设置像素着色器为g_pPixelShaderg_pImmediateContext->PSSetShader(g_pPixelShader, NULL, 0);//使用索引缓冲区进行绘制//绘制36个顶点,形成12个三角形。这是一个绘制立方体的操作g_pImmediateContext->DrawIndexed(12*RoundPointNum, 0, 0);//将后备缓冲区的内容呈现到屏幕上,显示渲染结果g_pSwapChain->Present(0, 0);
}
相关文章:
DirectX 3D C++ 圆柱体的渲染(源代码)
作业内容 请勿抄袭 代码功能:渲染一个绕中心轴自转的圆柱体。要求该圆柱体高度为3.0,半径为0.5。 #include <windows.h> #include <d3d11.h> #include <d3dx11.h> #include <d3dcompiler.h> #include <xnamath.h> #incl…...
搭建前端框架
在终端进入web目录,然后创建vuecrud工程 创建工程并引入ElementUI和axios手把手教学>传送门:VueCLI脚手架搭建...
2310C++构造对象
原文 本文展示一个构造对象方式,用户无需显式调用构造器.对有参构造器类,该实现在构造改对象时传递默认值来构造. 当然用户也可指定(绑定)某个参数的值.实现思路参考boost-ext/di的实现.看下示例: 构 成员{整 x10; }; 构 成员1{整 x11; }; 类 例子1{ 公:例子1(成员 x,成员1 x…...
nginx多文件组织
背景: nginx的话,有时候,想部署多个配置,比如:使用不同的端口配置不同的web工程。 比如:8081部署:项目1的web页面。 8082部署:项目2的web页面。 1)nginx.conf worker_processes…...
扩容LVM卷导致lvm元数据丢失的恢复过程
一、问题描述 因某次MySQL binlog占用过高扩容时,是直接对云盘操作,而扩容直接操作了lvm卷而未操作云盘分区,并随后执行了扩容的partprobe,resize2fs卷等操作;最后,显示并未扩容成功,重启系统后…...
【MySQL教程】| (1-1) 2023MySQL-8.1.0 安装教程
文章目录 一、安装包下载二、安装配置1、解压安装包2、编写MySQL配置文件3、初始化MySQL数据库3、安装mysql服务并启动4、MySQL服务5、连接MySQL6、修改密码 三、配置环境变量四、防止mysql自启动拖慢开机时间 近日有粉丝问到mysql在win11的安装中遇到一些问题,应粉…...
数据大屏定时请求后端数据
需求: 因为大屏基本从上午展示到晚上,不会频繁去打开页面。 前端实现: 在Vue的created钩子函数中发送初次请求,并使用JavaScript中的setInterval函数来设置整点定时发送请求。以下是一个示例 <template><div><h1…...
数据结构--队列
一、队列是什么 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾&…...
Python绘图系统25:新增8种绘图函数
文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统: 前置源码: Python打造动态绘图系统📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制📈四 定制绘图风格 📈五 数据生成导…...
(二) gitblit用户使用教程
(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 网页访问git客户端设置推送错误配置查看当前配置 日常使用仓库分组my profile修改上传代码简洁 网页访问 点击Advanced... 点击Accept the Risk and Contiue 初始用户名和密码都是admin,点击login…...
8.3Jmeter使用json提取器提取数组值并循环(循环控制器)遍历使用
Jmeter使用json提取器提取数组值并循环遍历使用 响应返回值例如: {"code":0,"data":{"totalCount":11,"pageSize":100,"totalPage":1,"currPage":1,"list":[{"structuredId":&q…...
SNERT预备队招新CTF体验赛-Misc(SWCTF)
目录 1、最简单的隐写 2、旋转我 3、is_here 4、zip伪加密 5、压缩包密码爆破 6、我就藏在照片里 7、所以我放弃了bk 8、套娃 9、来自银河的信号 10、Track_Me 11、勇师傅的奇思妙想 1、最简单的隐写 下载附件后,图片格式并不支持打开 根据题目提示&…...
MySql017——组合查询
一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔ÿ…...
【0224】源码分析RelFileNode对smgr访问磁盘表文件的重要性(2)
1. RelFileNode的角色 RelFileNode 是一个结构体数据类型,声明于relfilenode.h(src\include\storage )头文件中,该数据类型十分重要,因为它 “提供所有我们需要知道的物理访问关系表的信息。” smgr要访问磁盘上面的数据表文件,则需要此RelFileNode提供必要信息。 可以说…...
2310C++λ中完美转发
原文 C11里面就引入了完美转发概念,通过它,可按参数实际类型转发参数. 元<型名 T>空 处理(T&t){输出<<"左值\n";} 元<型名 T>空 处理(T&&t){输出<<"右值\n";} 元<型名 T>空 测试转发(T&&t){处理(前向&…...
【C++11】std::function 包装器(又叫适配器),std::bind 绑定
文章目录 std::function 包装器1. 使用方法2. 包装器的应用场景:题目 - - 逆波兰表达式求值3. 成员函数 和 static 静态成员函数 使用 包装器 std::bind 适配器绑定1. 使用方法2. 调整参数 顺序3. 指定参数 / 参数个数的调整 std::function 包装器 std::function 包…...
Linux系统编程系列之线程
一、什么是线程 线程(Thread)是计算机中的基本执行单元,是操作系统调度的最小单位。线程是进程内的一个独立执行流程,一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程都有自己的独立栈空间以及…...
CV面试知识点总结
一.卷积操作和图像处理中的中值滤波操作有什么区别? 1.1卷积操作 卷积操作是一种线性操作,通常用于特征的提取,通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文: https://blog.csdn.net/weixin_51571728/article/detai…...
Centos一键安装、切换各版本JDK
查看服务中的安装的jdk rpm -qa | grep java获取jdk各版本信息 yum -y list java*查看指定版本 yum -y list java*|grep 1.8安装jdk yum install java-11-openjdk当服务器中有多个版本jdk,切换指定jdk版本 alternatives --config java按照提示输入编号即可切换&…...
JavaWeb项目:smbms(mysql)
1.准备工作,创建数据库 CREATE DATABASE smbms;USE smbms;CREATE TABLE smbms_address (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,contact VARCHAR(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 联系人姓名,addressDesc VARCHAR(50) COLLATE u…...
shell脚本的多线程介绍
shell脚本的多线程介绍 shell脚本中,实现多线程可以使用以下方法: 1)使用&符号 在Shell中,可以使用&符号将命令放在后台执行,这样就可以同时执行多个命令。例如: #!/bin/bash command1 & #…...
周记之反思
9.25 这篇总结我承认,是在26号上午写的,那昨天晚上又聊天了,但是对比之前来说好很多了,所以26号上午也就是今天我起了个大早,然后把昨天的尾巴收了一下,没收完,先说说成果: 完成了…...
信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)
信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴) 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…...
二极管的直流等效电路和微变等效电路
二级管的主要参数 1.IF(最大整流的电流) 二极管长期工作做能够通过电流的平均最大值:物理意义:功率电流值。 2.UR 二极管最高反向工作电压 需要留有裕度,通常能达到一半的裕度;UR不能等于UBR。 3.IR 未击穿…...
Python无废话-基础知识字典Dictionary详讲
“字典Dictionary” 是一种无序、可变且可嵌套的数据类型,用于存储键值对。字典使用花括号{}来定义,并用逗号分隔键值对。本文对字典常使用方法,创建字典、添加字典、删除字典、如何获取字典做了知识归纳。 字典有以下几个特征: …...
ChatGPT多模态升级,支持图片和语音,体验如何?
一、前言 9 月 25 日,ChatGPT 多模态增加了新的语音功能和图像功能。这些功能提供了一种新的、更直观的界面,允许我们与 ChatGPT 进行语音对话或展示我们正在谈论的内容。 ChatGPT 现在可以看、听、和说话了,而不单单是一个文本驱动的工具了。…...
(SAR)Sentinel-1影像自动下载
基于ASF网站提供的python代码,实现Sentinel-1影像的自动下载; 1、登录ASF网站 登录Sentinel-1影像ASF网站:https://search.asf.alaska.edu/; 点击网站最右侧Sign in图标,进行用户注册; 注册完用户之后&…...
设计模式10、外观模式Facade
解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用 外观(Facade)角色:为多个子系统对外提供…...
华为数通方向HCIP-DataCom H12-831题库(单选题:181-200)
第181题 以下关于OSPF的5类LSA中的转发地址(ForwardingAddress,FA) 的描述,正确的是哪一项? A、当FA地址为0.0.0.0时,收到该LSA的路由器认为到达目的网段的数据包应该发往对应的ABR,因此将到达ABR的下一跳地址作为这条外部路由的下一跳 B、当FA地址为0.0.0.0时,收到该LS…...
Java 中的参数传递方式
Java 中的参数传递方式通常被称为“值传递”,这意味着在方法调用时,实际上传递给方法的是变量的副本,而不是变量本身。尽管这被广泛称为“值传递”,但需要注意的是,这并不意味着 Java 不支持引用传递。事实上ÿ…...
桃城网站建设价格/百度推广一个点击多少钱
通过前面的学习我们已经能够通过遍历所有已知的函数及其指令来达到一种基本的搜索效果,这当然很有用,不过有时候我们需要搜索一些特定的字节,比如0x48 0xff 0xc2,这3个字节代表的汇编代码为inc rdx 我们可以选中该指令后右键-》synchronized with->hex view 1,可以看到…...
给别人做网站的销售叫什么/广州seo外包多少钱
获取AFP服务信息如果苹果系统开放TCP 548端口,说明其开启了AFP服务。这个时候,可以使用Nmap的afp-serverinfo脚本获取对应的服务信息。获取的信息包括服务名、机器类型、AFP版本、UAM、服务签名、MAC地址、安全策略等。转载于:https://www.cnblogs.com/d…...
seo 网站地图/青岛网
今天早晨,打开数据库一看,保存的数据全不见了,只剩下一个叫PLEASE_READ_ME_VVV的数据库。里面写着To recover your lost Database and avoid leaking it: Send us 0.045 Bitcoin (BTC) to our Bitcoin address 1McksxpysJGSG9a9zHvan5f8Y1nfp…...
做外贸首先要做网站/seo最新
护士站的客户端采用windows moblie,后台数据通过web service提供,在这次护士站的开发中,我负责的工作就是web service的开发。 首先介绍下什么叫web service,简单来说,web service相当于一种远程的函数调用。我们可以将…...
佛山专业网站营销/阿里大数据分析平台
领导力的36个关键 下载没有交易权 与生产线经理不同,您通常不以产品负责人的身份管理开发团队和利益相关者 ,个人也不向您报告。 因此,您没有任何交易权 :您无法告诉别人该怎么做; 您不能为其分配任务; 并且…...
做移动网站优化首页软/外贸网站免费推广
官网说明:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E8%AD%A6%E5%91%8A在linux下搭建nginx测试网页的时候,正常打开可以访问,当刷新后页面出现404 not found的问题说明:vue-router 默认 hash 模式 —— 使…...