Sei sulla pagina 1di 8

UNIVERSITATEA DE STAT DIN MOLDOVA

FACULTATEA DE “MATEMATICA SI INFORMATICA”

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)

LPDIRECT3DVERTEXBUFFER9 pVertexBuffer = NULL;


LPDIRECT3DVERTEXBUFFER9 pVertexBuffer2 = NULL;

int x_center = 450;


int y_center = 400;
struct point2D
{
float x, y;
};

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)
{

float a[4], b[4], t, tstep;

tstep = 1.0f / 150;

pb[fc].x = punt_c[i].x;
pb[fc].y = punt_c[i].y;
pb[fc].z = 0.0;

pb[NV].x = punt_c[i + 3].x;


pb[NV].y = punt_c[i + 3].y;
pb[NV].z = 0.0;

a[0] = -punt_c[i].x + 3.0f * punt_c[i + 1].x - 3.0f * punt_c[i + 2].x + punt_c[i +


3].x;
a[1] = 3.0f * punt_c[i].x - 6.0f * punt_c[i + 1].x + 3.0f * punt_c[i + 2].x;
a[2] = -3.0f * punt_c[i].x + 3.0f * punt_c[i + 1].x;
a[3] = punt_c[i].x;

b[0] = -punt_c[i].y + 3.0f * punt_c[i + 1].y - 3.0f * punt_c[i + 2].y + punt_c[i +


3].y;
b[1] = 3.0f * punt_c[i + 0].y - 6.0f * punt_c[i + 1].y + 3.0f * punt_c[i + 2].y;
b[2] = -3.0f * punt_c[i].y + 3.0f * punt_c[i + 1].y;
b[3] = punt_c[i].y;

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];

MyBezier(pb1, NV1, fc1, punt_c1, 4);


MyBezier(pb2, NV2, fc2, punt_c2, 7);

//Copia informatii despre coordonatele in Vertex Buffer

for (int i = 0; i < NV1; i++)


{

Vertexes[i].x = x_center + pb1[i].x * 60;


Vertexes[i].y = y_center - pb1[i].y * 48;
Vertexes[i].z = pb1[i].z;
Vertexes[i].rhv = 1.0f;
Vertexes[i].color = D3DCOLOR_ARGB(0, 255, 255, 255);
}

for (int i = 0; i < NV2; i++)


{

Vertexes2[i].x = x_center + pb2[i].x * 60;


Vertexes2[i].y = y_center - pb2[i].y * 48;
Vertexes2[i].z = pb2[i].z;
Vertexes2[i].rhv = 1.0f;
Vertexes2[i].color = D3DCOLOR_ARGB(0, 255, 255, 255);
}

if (FAILED(pDirect3DDevice->CreateVertexBuffer(sizeof Vertexes, 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
&pVertexBuffer, NULL)))
return E_FAIL;

void *pVB = NULL;


if (FAILED(pVertexBuffer->Lock(0, sizeof Vertexes,
(void**)&pVB, 0)))
return E_FAIL;

memcpy(pVB, Vertexes, sizeof Vertexes);

pVertexBuffer->Unlock();

if (FAILED(pDirect3DDevice->CreateVertexBuffer(sizeof Vertexes2, 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
&pVertexBuffer2, NULL)))
return E_FAIL;

void *pVB2 = NULL;


if (FAILED(pVertexBuffer2->Lock(0, sizeof Vertexes2,
(void**)&pVB2, 0)))
return E_FAIL;

memcpy(pVB2, Vertexes2, sizeof Vertexes2);

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->SetStreamSource(0, pVertexBuffer2, 0, sizeof(CUSTOMVERTEX));


pDirect3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, NV2 - 151);

pDirect3DDevice->EndScene();

pDirect3DDevice->Present(NULL, NULL, NULL, NULL);

return S_OK;
}

void DeleteDirect3D()
{
if (pDirect3DDevice)
pDirect3DDevice->Release();
if (pDirect3D)
pDirect3D->Release();
}

LRESULT CALLBACK MainWinProc(


HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
switch (msg)
{
//
case WM_PAINT:
RenderingDirect3D();
ValidateRect(hwnd, NULL);
break;
//
case WM_DESTROY:
DeleteDirect3D();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(


HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpunt_cmdLine,
int nCmdShow)
{

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

while (GetMessage(&msg, NULL, 0, 0))


{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

}
return msg.wParam;
}
Rezultat:

Concluzie:
Litera a fost realizata usor cu ajutorul curbei Bezier dandu-i punctele necesare.

Potrebbero piacerti anche