Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Laborator Nr.2
La Grafica pe calculator
Tema: “Desenarea literei „R” in Visual Studio cu ajutorul bibliotecii
DirectX „
Chisinau, 2017
Conditie:
Sa se deseneze litera “R” ,din laboratorul 1, in Visual Studio cu ajutorul bibliotecii DirectX.
Cod:
#include <windows.h>
#include <tchar.h>
#include "d3d9.h"
#pragma comment(lib, "d3d9.lib")
HWND hwnd;
IDirect3D9* pDirect3D = NULL;
IDirect3DDevice9* pDirect3DDevice = NULL;
struct CUSTOMVERTEX
{
float x, y, z, rhv;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
point2D punt_c1[50] = {
//1
{ -0.04f, 0.2f },
{ 0.14f, -2.03f },
{ -0.45f, -2.19f },
{ -1.03f, -2.47f },
//2
{ -1.03f, -2.47f },
{ -1.45f, -3.14f },
{ 0.33f, -3.8f },
{ 0.48f, -1.9f },
//3
{ 0.48f, -1.9f },
{ 0.27f, -2.12f },
{ 0.18f, 0.16f },
{ 1.35f, 1.02f },
//4
{ 1.35f, 1.02f },
{ 2.37f, 2.1f },
{ -0.06f, 2.06f },
{ -0.04f, 0.2f },
};
point2D punt_c2[50] = {
//5
{ -2.03f, 0.87f },
{ -0.9f, 5.45f },
{ 5.04f, 2.48f },
{ 1.59f, -0.43f },
//6
{ 1.59f, -0.43f },
{ 2.43f, -1.28f },
{ 1.74f, -2.19f },
{ 2.54f, -2.88f },
//7/////
{ 2.54f, -2.88f },
{ 2.48f, -3.75f },
{ 1.11f, -2.99f },
{ 1.65f, -1.8f },
//8
{ 1.65f, -1.8f },
{ 1.63f, -2.69f },
{ 2.04f, -0.58f },
{ 1.11f, -0.65f },
//9
{ 1.11f, -0.65f },
{ 0.55f, -0.28f },
{ 1.9f, -0.52f },
{ 2.2f, 0.57f },
//10
{ 2.2f, 0.57f },
{ 2.7f, 2.39f },
{ -0.54f, 3.32f },
{ -1.25f, 1.46f },
//11
{ -1.25f, 1.46f },
{ -0.73f, 0.22f },
{ -1.86f, 0.07f },
{ -2.03f, 0.87f },
};
struct point3D
{
float x, y, z;
};
point3D pb1[2000];
point3D pb2[2000];
int fc1 = 0, fc2 = 0;
int NV1 = 150, NV2 = 150;
void MyBezier(point3D pb[], int &NV, int fc, point2D punt_c[], int nr_bezier)
{
for (int i = 0; i < 4 * nr_bezier; i = i + 4)
{
pb[fc].x = punt_c[i].x;
pb[fc].y = punt_c[i].y;
pb[fc].z = 0.0;
t = 0.0f;
for (int j = fc + 1; j < NV; j++)
{
t += tstep;
pb[j].x = ((a[0] * t + a[1]) * t + a[2]) * t + a[3];
pb[j].y = ((b[0] * t + b[1]) * t + b[2]) * t + b[3];
pb[j].z = 1.0;
}
fc = fc + 150 + 1;
NV = fc + 150;
}
}
HRESULT InitialDirect3D()
{
if ((pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return E_FAIL;
D3DDISPLAYMODE Display;
if (FAILED(pDirect3D->
GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParameter;
ZeroMemory(&Direct3DParameter, sizeof Direct3DParameter);
Direct3DParameter.Windowed = TRUE;
Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
Direct3DParameter.BackBufferFormat = Display.Format;
if (FAILED(pDirect3D->
CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&Direct3DParameter, &pDirect3DDevice)))
return E_FAIL;
return S_OK;
}
HRESULT InitialVertexBuffer()
{
CUSTOMVERTEX Vertexes[2000];
CUSTOMVERTEX Vertexes2[6000];
if (FAILED(pDirect3DDevice->CreateVertexBuffer(sizeof Vertexes, 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
&pVertexBuffer, NULL)))
return E_FAIL;
pVertexBuffer->Unlock();
if (FAILED(pDirect3DDevice->CreateVertexBuffer(sizeof Vertexes2, 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
&pVertexBuffer2, NULL)))
return E_FAIL;
pVertexBuffer2->Unlock();
return S_OK;
}
HRESULT RenderingDirect3D()
{
if (pDirect3DDevice == NULL)
return E_FAIL;
pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0, 0, 255), 1.f, 0);
pDirect3DDevice->BeginScene();
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pDirect3DDevice->SetStreamSource(0, pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
pDirect3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, NV1 - 151);
pDirect3DDevice->EndScene();
return S_OK;
}
void DeleteDirect3D()
{
if (pDirect3DDevice)
pDirect3DDevice->Release();
if (pDirect3D)
pDirect3D->Release();
}
WNDCLASSEX windowsclass;
windowsclass.cbSize = sizeof(WNDCLASSEX);
windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowsclass.lpfnWndProc = MainWinProc;
windowsclass.cbClsExtra = 0, windowsclass.cbWndExtra = 0;
windowsclass.hInstance = hinstance;
windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName = NULL;
windowsclass.lpszClassName = _T("WINDOWSCLASS");
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&windowsclass))
return 0;
if (!(hwnd = CreateWindowEx(
NULL,
_T("WINDOWSCLASS"),
_T("Litere R in DirectX"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 50,
// CW_USEDEFAULT, 0,
1000, 800,
// CW_USEDEFAULT, 0,
NULL,
NULL,
hinstance,
NULL)))
return 0;
MSG msg;
ZeroMemory(&msg, sizeof msg);
if (SUCCEEDED(InitialDirect3D()))
{
if (SUCCEEDED(InitialVertexBuffer()))
{
ShowWindow(hwnd, SW_SHOWDEFAULT); // desenam fereastra
UpdateWindow(hwnd); // reinoim fereastra
}
return msg.wParam;
}
Rezultat:
Concluzie:
Litera a fost realizata usor cu ajutorul curbei Bezier dandu-i punctele necesare.