用MFC将正方体进行平移、比例、旋转、对称、错切变换c++代码
时间: 2023-09-17 16:10:17 浏览: 155
MFC计算机图形学基本变换(平移、错切、对称、旋转、比例)
5星 · 资源好评率100%
以下是一个基于 MFC 的简单示例代码,其中包括了正方体的平移、比例、旋转、对称和错切变换。这个示例代码使用 OpenGL 来绘制 3D 图形。你可以根据自己的需要进行修改。
```cpp
// My3DTransformView.h : CMy3DTransformView 类的声明
#pragma once
#include <gl/gl.h>
#include <gl/glu.h>
class CMy3DTransformView : public CView
{
protected: // 仅从序列化创建
CMy3DTransformView() noexcept;
DECLARE_DYNCREATE(CMy3DTransformView)
// 特性
public:
CMy3DTransformDoc* GetDocument() const;
// 操作
public:
// 平移
void Translate(float x, float y, float z);
// 比例
void Scale(float x, float y, float z);
// 旋转
void Rotate(float angle, float x, float y, float z);
// 对称
void Reflect(float x, float y, float z);
// 错切变换
void Shear(float x, float y, float z);
protected:
// OpenGL 相关的函数
void InitGL();
void DrawCube();
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以描绘该视图
// 实现
public:
virtual ~CMy3DTransformView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // My3DTransformView.cpp 中的调试版本
inline CMy3DTransformDoc* CMy3DTransformView::GetDocument() const
{ return reinterpret_cast<CMy3DTransformDoc*>(m_pDocument); }
#endif
```
```cpp
// My3DTransformView.cpp : CMy3DTransformView 类的实现文件
#include "pch.h"
#include "framework.h"
#include "My3DTransform.h"
#include "My3DTransformDoc.h"
#include "My3DTransformView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMy3DTransformView
IMPLEMENT_DYNCREATE(CMy3DTransformView, CView)
BEGIN_MESSAGE_MAP(CMy3DTransformView, CView)
END_MESSAGE_MAP()
// CMy3DTransformView 构造/析构
CMy3DTransformView::CMy3DTransformView() noexcept
{
}
CMy3DTransformView::~CMy3DTransformView()
{
}
BOOL CMy3DTransformView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CMy3DTransformView 绘制
void CMy3DTransformView::OnDraw(CDC* pDC)
{
CMy3DTransformDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// 初始化 OpenGL
InitGL();
// 绘制正方体
DrawCube();
// 交换缓冲区
SwapBuffers(pDC->m_ps.hdc);
}
// CMy3DTransformView 诊断
#ifdef _DEBUG
void CMy3DTransformView::AssertValid() const
{
CView::AssertValid();
}
void CMy3DTransformView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMy3DTransformDoc* CMy3DTransformView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy3DTransformDoc)));
return (CMy3DTransformDoc*)m_pDocument;
}
#endif //_DEBUG
// CMy3DTransformView 消息处理程序
void CMy3DTransformView::InitGL()
{
// 获取设备上下文
HDC hDC = ::GetDC(m_hWnd);
// 设置像素格式
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
24,
8,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
int nPixelFormat = ::ChoosePixelFormat(hDC, &pfd);
::SetPixelFormat(hDC, nPixelFormat, &pfd);
// 创建 OpenGL 上下文
HGLRC hGLRC = ::wglCreateContext(hDC);
::wglMakeCurrent(hDC, hGLRC);
// 设置视口
int nWidth, nHeight;
::GetClientRect(m_hWnd, &m_rcClient);
nWidth = m_rcClient.right - m_rcClient.left;
nHeight = m_rcClient.bottom - m_rcClient.top;
::glViewport(0, 0, nWidth, nHeight);
// 设置投影矩阵
::glMatrixMode(GL_PROJECTION);
::glLoadIdentity();
::gluPerspective(60, (float)nWidth / nHeight, 0.1f, 100.0f);
// 设置模型视图矩阵
::glMatrixMode(GL_MODELVIEW);
::glLoadIdentity();
::glTranslatef(0, 0, -5);
}
void CMy3DTransformView::DrawCube()
{
// 绘制正方体
glBegin(GL_QUADS);
// Front face
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
// Back face
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
// Top face
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
// Bottom face
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
// Right face
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
// Left face
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
}
void CMy3DTransformView::Translate(float x, float y, float z)
{
::glTranslatef(x, y, z);
}
void CMy3DTransformView::Scale(float x, float y, float z)
{
::glScalef(x, y, z);
}
void CMy3DTransformView::Rotate(float angle, float x, float y, float z)
{
::glRotatef(angle, x, y, z);
}
void CMy3DTransformView::Reflect(float x, float y, float z)
{
::glScalef(x, y, z);
}
void CMy3DTransformView::Shear(float x, float y, float z)
{
GLfloat matrix[16] = { 1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1 };
::glMultMatrixf(matrix);
}
```
在这个代码中,我们使用了 OpenGL 来绘制 3D 图形,我们首先初始化 OpenGL 上下文,然后使用 `DrawCube()` 函数绘制正方体。在正方体绘制之前,我们可以调用 `Translate()`、`Scale()`、`Rotate()`、`Reflect()` 和 `Shear()` 函数来进行平移、比例、旋转、对称和错切变换。在每次绘制之前,我们都需要调用 `glLoadIdentity()` 函数来加载单位矩阵,以确保每次变换都是相对于最初的状态进行的。
阅读全文