大神门,请用C++编程,快帮帮我吧

已知四边形ABCD的顶点坐标分别为A(0,0)、B(20,0)、C(20,15)、D(0,15),编程实现对该图形的比例、平移和旋转变换,并显示变换结果。要求:(1)缩放... 已知四边形ABCD的顶点坐标分别为A(0,0)、B(20,0)、C(20,15)、D(0,15),编程实现对该图形的比例、平移和旋转变换,并显示变换结果。
要求:
(1)缩放因子、平移量、旋转中心和角度由用户输入;
(2)显示变换后四边形的顶点坐标;
(3)以图形方式显示变换后的四边形
说明:三种变换可单独编程分别实现,但最好能集成在一个程序,并能实现比例、平移与旋转组合变换
展开
 我来答
匿名用户
2011-04-01
展开全部
/Direct3D程序不需的头文件
#include<d3dx9.h>//如果要使用D3DX库就必须加入这个头文件
#include<mmsystem.h>
#include<windows.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//4个本程序用到的全局变量
LPDIRECT3D9 g_pD3D = NULL; //Direct3D指针
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;//Direct3D设备
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;//顶点缓冲区指针
LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;//索引缓冲区指针

//定义使用到的顶点结构
struct CUSTOMVERTEX
{
FLOAT x,y,z;
DWORD color;
};

//定义上述顶点的FVF结构
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

//初始化Direct3D设备过程函数
HRESULT InitD3D(HWND hWnd)
{
//创建Direct3D对象
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
}

//填写创建Direct3D设备结构体
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));

d3dpp.Windowed = false;//运行在窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//最高效的工作方式
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;//屏幕缓冲区数据像素格式

//创建Direct3D设备
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
{
return E_FAIL;
}
return S_OK;
}

//初始化与本程序绘图相关的数据函数
HRESULT InitDraw()
{
//创建顶点缓冲区
g_pD3DDevice->CreateVertexBuffer( 8 * sizeof(CUSTOMVERTEX),
D3DUSAGE_WRITEONLY,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_pVB,
0);
//创建索引缓冲区
g_pD3DDevice->CreateIndexBuffer(36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&g_pIB,
0);
//创建立方体的8个顶点,注意每个顶点的颜色都不同
//在绘制时,Direct3D会根据顶点颜色对三角形内部像素进行插值,所以立方体看起来是彩色的
CUSTOMVERTEX source_vertices[] = {
,
,
,
,
,
,
,
,
};

// 把上面的顶点数据复制到创建的缓冲区内
CUSTOMVERTEX * pVertices;
if(FAILED(g_pVB->Lock(0,8*sizeof(CUSTOMVERTEX),(VOID **)&pVertices,0)))
{
return E_FAIL;
}

memcpy(pVertices,source_vertices,8 * sizeof(CUSTOMVERTEX));
g_pVB->Unlock();
//定义索引缓冲区内容,这里可以手动定义,也可以用数组设定好,然后内容复制,向上面顶点缓冲区一样
WORD *indices = 0;
g_pIB->Lock(0,0,(void **) & indices,0);
//正面
indices[0]=0;indices[1]=1;indices[2]=2;
indices[3]=0;indices[4]=2;indices[5]=3;
//背面
indices[6]=4;indices[7]=6;indices[8]=5;
indices[9]=4;indices[10]=7;indices[11]=6;
//左面
indices[12]=4;indices[13]=5;indices[14]=1;
indices[15]=4;indices[16]=1;indices[17]=0;
//右面
indices[18]=3;indices[19]=2;indices[20]=6;
indices[21]=3;indices[22]=6;indices[23]=7;
//顶面
indices[24]=1;indices[25]=5;indices[26]=6;
indices[27]=1;indices[28]=6;indices[29]=2;
//底面
indices[30]=4;indices[31]=0;indices[32]=3;
indices[33]=4;indices[34]=3;indices[35]=7;

g_pIB->Unlock();

//设置摄像机
D3DXVECTOR3 position(0.0f,0.0f,-3.0f);
D3DXVECTOR3 target(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMATRIX V;

D3DXMatrixLookAtLH(&V,&position,&target,&up);
g_pD3DDevice->SetTransform(D3DTS_VIEW,&V);

//设置投影矩阵
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(& proj,
D3DX_PI * 0.5f,
(float)800/(float) 600,
1.0f,
1000.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&proj);
//因为没有使用材质,纹理信息,所以关闭灯光显示出本身色彩
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}

void Cleanup()
{
if(g_pVB != NULL)
{
g_pVB->Release();
}
if(g_pIB != NULL)
{
g_pIB->Release();
}
if(g_pD3DDevice != NULL)
{
g_pD3DDevice->Release();
}
if(g_pD3D != NULL)
{
g_pD3D ->Release();
}
}

//渲染函数
void Render()
{
//清除屏幕缓冲区到蓝色屏幕
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
//开始绘制
if(SUCCEEDED(g_pD3DDevice->BeginScene()))
{
//创建沿3个轴渲染的矩阵
D3DXMATRIXA16 matWorld_X;
D3DXMatrixIdentity(&matWorld_X);
D3DXMatrixRotationX(&matWorld_X,timeGetTime()/500.0f);

D3DXMATRIXA16 matWorld_Y;
D3DXMatrixIdentity(&matWorld_Y);
D3DXMatrixRotationY(&matWorld_Y,timeGetTime()/500.0f);

D3DXMATRIXA16 matWorld_Z;
D3DXMatrixIdentity(&matWorld_Z);
D3DXMatrixRotationZ(&matWorld_Z,timeGetTime()/500.0f);

//设置物体的世界矩阵

g_pD3DDevice->SetTransform(D3DTS_WORLD,&(matWorld_X*matWorld_Y*matWorld_Z));

//挂接渲染流水线,设定FVF值,设置索引,渲染
g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof( CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->SetIndices(g_pIB);
g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);

//结束绘制
g_pD3DDevice->EndScene();
}
//显示到屏幕
g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
//消息回调函数。只处理退出消息,所以鼠标一直显示忙状态
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE , LPSTR,INT)
{
//注册窗口
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"D3D Tutorical",NULL
};
RegisterClassEx(&wc);

//创建窗口
HWND hWnd = CreateWindow("D3D Tutorical",
"3D立方体",
WS_OVERLAPPEDWINDOW,
100,
100,
800,
600,
GetDesktopWindow(),
NULL,
wc.hInstance,
NULL);

//嵌套if保证全部初始化成功才可以进入循环运行
if(SUCCEEDED (InitD3D(hWnd)))
{
if(SUCCEEDED(InitDraw()))
{
//显示窗口
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//优化的消息循环
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
}
UnregisterClass("D3D Tutorical",wc.hInstance);

return 0;
}
这个是CSDN上的一个立方体的C++代码,用D3D实现的
另外,虚机团上产品团购,超级便宜
the_friends
2011-04-01
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
用VC++,结合GDI+,GDI+中有相应的函数可以实现缩放、平移以及旋转。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
程小游
2011-03-31
知道答主
回答量:40
采纳率:0%
帮助的人:33.5万
展开全部
关注
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
twh69
2011-03-30 · 超过10用户采纳过TA的回答
知道答主
回答量:108
采纳率:0%
帮助的人:16.7万
展开全部
关注
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式