Sunteți pe pagina 1din 9

Universitatea de Stat din Moldova

Facultatea de “Matematica si Informatica”

Laborator Nr.2
la
Grafica pe calculator

Tema: Desenarea literei “N” in DirectX

A efectuat: Ho Ngoc Trung


A verificat: Ghenadie Marin

Chisinau, 2017
Conditii:
De desenat Litera “N” in DirectX.

PROGRAM:

#include <windows.h>
#include <tchar.h>

#include "d3d9.h"
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.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;


int x_center = 500;
int y_center = 400;
struct point2D
{
float x, y;
};
int nr_bezier = 6;

point2D punt_c[30] = {
//Punctul control pentru prima bezier
{ -2.4f, 0.0f },
{ -2.74f, -1.8f },
{ -0.85f, 0.5f },
{ -1.f, 3.f },

//Punctul control pentru bezier 2


{ -1.f, 3.f },
{ -0.5f, 2.5f },
{ -0.3f, 1.95f },
{ 0.0f, 0.0f },

//Punctul control pentru bezier 3


{ 0.f, 0.f },
{ 0.4f, 1.f },
{ 0.6f, 4.f },
{ 1.4f, 2.6f },

//Punctul control pentru bezier 4


{ 1.4f, 2.6f },
{ 0.8f, 2.89f },
{ 0.77f, 1.f },
{ 0.0f, -1.1f },

//Punctul control pentru bezier 5


{ 0.0f, -1.1f },
{ -0.6f, -0.49f },
{ -0.6f, 1.f },
{ -0.8f, 1.5f },

//Punctul control pentru bezier 6


{ -0.8f, 1.5f },
{ -1.0f, -0.25f },
{ -3.f, -2.5f },
{ -2.4f, 0.0f }, };

int fc = 0;
struct point3D
{
float x, y, z;
};

point3D pb[2000];
int NV = 150;
void MyBezier()
{
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];

MyBezier();

//Copia informatii despre coordonatele in Vertex Buffer

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


{

Vertexes[i].x = x_center + pb[i].x * 100;


Vertexes[i].y = y_center - pb[i].y * 80;
Vertexes[i].z = pb[i].z;
Vertexes[i].rhv = 1.0f;
Vertexes[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();

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->SetStreamSource(0, pVertexBuffer, 0,
sizeof(CUSTOMVERTEX));
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

pDirect3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, NV - 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 N 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;
}
Rezultatul Final:

S-ar putea să vă placă și