文章目录

  • 一、实验目的
  • 二、实验要求
  • 三、实验步骤
    • 1.打开直线扫面转换MFC项目工程,及其中的直线类CLine。
    • 2.二维点类CP2添加齐次坐标
    • 3.设计实现二维图像几何变换类
      • 1、新建二维图形几何变换类CTrans2D头文件
      • 2、新建二维图形几何变换类CTrans2D源文件
      • 3、调用二维图形几何变换类转动、缩放菱形线框图
  • 实验结果

一、实验目的

  1. 掌握3*3矩阵乘法运算的编程实现;
  2. 掌握平移、比例、旋转三种基本二维几何变换矩阵的生成;
  3. 掌握相对于任意参考点的二维复合变换矩阵生成。

二、实验要求

  1. 设计实现二维图形变换类,具有平移、比例、旋转二位几何变换的功能,以及相对于任意参考点的二维复合变换功能;
  2. 将直线类所绘制的菱形线框,绕最上端A点匀速旋转,并要求相对于A点来回缩放;
  3. 使用双缓冲机制进行图形绘制,避免运动闪烁,所有图形先绘制到用户自定的DC,绘制完成后再统一拷贝到屏幕DC。

三、实验步骤

1.打开直线扫面转换MFC项目工程,及其中的直线类CLine。

2.二维点类CP2添加齐次坐标

代码如下:

#pragma once
class CP2
{public:CP2();virtual~CP2();CP2(double, double);
public:double x;double y;double w;
};class CLine
{public:CLine();virtual~CLine();void SetLineColor(COLORREF);void MoveTo(CP2);void MoveTo(double, double);void LineTo(CP2, CDC*);void LineTo(double, double, CDC*);
public:CP2 P0;CP2 P1;COLORREF clr;
};

3.设计实现二维图像几何变换类

1、新建二维图形几何变换类CTrans2D头文件

代码如下:

#pragma once
#include "Line.h"class CTrans2D // 二维几何转换
{public:CTrans2D();virtual~CTrans2D();void SetPoints(CP2*, int);void Identity();void Translate(double, double); // 平移变换矩阵void Rotate(double); // 旋转变换矩阵void Scale(double, double); // 比例变换矩阵void RotatePoint(double, CP2); // 相对于任意点的旋转变换矩阵void ScalePoint(double, double, CP2); // 相对于任意点的比例变换矩阵
protected:void MultiMatrix(); // 矩阵相乘
public:double m_aT[3][3];CP2* m_pPoints;int m_iNum;
};

2、新建二维图形几何变换类CTrans2D源文件

#include "pch.h"
#include "CTrans2D.h"
#include "math.h"
#define PI 3.14159
CTrans2D::CTrans2D()
{}
CTrans2D::~CTrans2D()
{}void CTrans2D::SetPoints(CP2* p, int n)
{m_pPoints = p;m_iNum = n;
}void CTrans2D::Identity() // 单位矩阵
{m_aT[0][0] = 1.0; m_aT[0][1] = 0.0; m_aT[0][2] = 0.0;m_aT[1][0] = 0.0; m_aT[1][1] = 1.0; m_aT[1][2] = 0.0;m_aT[2][0] = 0.0; m_aT[2][1] = 0.0; m_aT[2][2] = 1.0;
}
void CTrans2D::Translate(double tx, double ty) // 平移变换矩阵
{Identity();m_aT[2][0] = tx;m_aT[2][1] = ty;MultiMatrix();
}
void CTrans2D::Rotate(double beta) // 旋转变换矩阵
{Identity();double rad = beta * PI / 180;m_aT[0][0] = cos(rad);m_aT[0][1] = sin(rad);m_aT[1][0] = -sin(rad);m_aT[1][1] = cos(rad);MultiMatrix();
}void CTrans2D::Scale(double sx, double sy) // 比例变换矩阵
{Identity();m_aT[0][0] = sx;m_aT[1][1] = sy;MultiMatrix();
}void CTrans2D::RotatePoint(double beta, CP2 p) // 相对于任意点的旋转变换矩阵
{Translate(-p.x, -p.y);Rotate(beta);Translate(p.x, p.y);
}void CTrans2D::ScalePoint(double sx, double sy, CP2 p) // 相对于任意点的整体比例变换矩阵
{Translate(-p.x, -p.y);Scale(sx, sy);Translate(p.x, p.y);
}void CTrans2D::MultiMatrix() // 矩阵相乗
{CP2* PNew = new CP2[m_iNum];for (int i = 0; i < m_iNum; i++){PNew[i] = m_pPoints[i];}for (int j = 0; j < m_iNum; j++){m_pPoints[j].x = PNew[j].x * m_aT[0][0] + PNew[j].y * m_aT[1][0] + PNew[j].w * m_aT[2][0];m_pPoints[j].y = PNew[j].x * m_aT[0][1] + PNew[j].y * m_aT[1][1] + PNew[j].w * m_aT[2][1];m_pPoints[j].w = PNew[j].x * m_aT[0][2] + PNew[j].y * m_aT[1][2] + PNew[j].w * m_aT[2][2];}delete[]PNew;
}

3、调用二维图形几何变换类转动、缩放菱形线框图

#include "CTrans2D.h"
void CTestView::OnDraw(CDC* pDC)
{CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(), rect.Height());pDC->SetViewportExt(rect.Width(), -rect.Height());pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);/*rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);*/CDC MemDC; // 内存DCCBitmap NewBitmap, * pOldBitmap; // 内存中承载的临时位图MemDC.CreateCompatibleDC(pDC); // 建立与屏幕pDC兼容的MemDCNewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); // 创建兼容位图pOldBitmap = MemDC.SelectObject(&NewBitmap); // 将兼容位图选入MemDCMemDC.FillSolidRect(rect, pDC->GetBkColor()); // 按原来背景填充客户区,否则未黑色MemDC.SetMapMode(MM_ANISOTROPIC); // MemDC自定义坐标系与pDC相同MemDC.SetWindowExt(rect.Width(), rect.Height());MemDC.SetViewportExt(rect.Width(), -rect.Height());MemDC.SetViewportOrg(rect.Width() / 2, rect.Height() / 2);CLine* line = new CLine;line->SetLineColor(RGB(0, 0, 0));line->MoveTo(CP2(-rect.Width() / 2, 0));line->LineTo(CP2(rect.Width() / 2, 0), &MemDC);line->MoveTo(CP2(0, -rect.Height() / 2));line->LineTo(CP2(0, rect.Height() / 2), &MemDC);int a = 200;CP2 points[4];points[0].x = 0, points[0].y = a;points[1].x = a, points[1].y = 0;points[2].x = 0, points[2].y = -a;points[3].x = -a, points[3].y = 0;CP2 A(0, a);CTrans2D tans;tans.SetPoints(points, 4);static float s = 1.0;static float step = 0.01;if (s >= 2.0 || s <= 0.5)step = -step;s += step;tans.ScalePoint(s, s, A);static float theta = 0.0;theta += 1.0;if (theta >= 360.0)theta = 0.0;tans.RotatePoint(theta, A);line->SetLineColor(RGB(255, 0, 0));line->MoveTo(points[0]);line->LineTo(points[1], &MemDC);line->SetLineColor(RGB(0, 255, 0));line->LineTo(points[2], &MemDC);line->SetLineColor(RGB(0, 0, 255));line->LineTo(points[3], &MemDC);line->SetLineColor(RGB(255, 255, 0));line->LineTo(points[0], &MemDC);delete line;pDC->BitBlt(-rect.Width() / 2, -rect.Height() / 2, rect.Width(), rect.Height(), &MemDC, -rect.Width() / 2, -rect.Height() / 2, SRCCOPY);MemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();Invalidate(FALSE);
}

实验结果


计算机图形学——二维图形几何转换相关推荐

  1. 计算机图形学-二维图形变换 笔记总结与代码实战

    文章目录 1.向量基础知识 2.图形坐标系 3.二维图形变换原理 4.二维图形几何变换 5.窗口视区变换 基本二维几何变换代码 二维复合变换实战-五星红旗绘制 1.向量基础知识 为什么向量如此重要:在 ...

  2. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

  3. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  4. 计算机图形学--二维图形变换

    目录 概述 平移 对称 旋转 错切 缩放 概述 对于二维图形来讲,所有基本变换均可以通过确定图形的点的平移.对称.旋转.错切以及缩放几种变换组合得到,而在上述几种变换中,除对称变换外,其余变换均可通过 ...

  5. 计算机图形学二维图形基本变换实验原理,【实验课件】二维及三维图形基本变换的实现...

    实验二 二维及三维图形基本变换的实现 一.实验学时 4学时 二.实验类型 设计型实验 三.实验目的和要求 1. 掌握二维图形变换的原理,对一条直线实现二维基本变换(平移.错切.比例.旋转). 2. 掌 ...

  6. 计算机图形学-二维图形-几何变换

    几何变化 一.概述 图形变换:是一种几何变换,在二维图形处理过程中,常常需要对平面图形的形状,尺寸,显示方向和显示位置进行修改,来达到改变图形的目的. 几何变换:是一种先行变换,对原来图形中的一点坐标 ...

  7. 计算机图形学——二维图形变换裁剪

    算法描述 1.基本变换矩阵 (1).缩放矩阵 void ScaleMatrix(float Sx, float Sy, float m[3][2]) {for (int i = 0; i < 3 ...

  8. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt

    计算机图形学 二维变换及二维 第三章 二维变换及二维观察 本章主要内容 3.1二维图形的基本变换 3.2窗口视图变换 3.3复合变换 3.4二维图形裁剪 3.5本章小结 3.1 二维图形的基本变换 3 ...

  9. 计算机图形学——二维卡通人物交互设计

    根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制.使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制.实现对卡通人物轮廓的交互控制,点击鼠标左键可以对 ...

最新文章

  1. Linux时间同步+国内常用的NTP服务器地址
  2. Python 处理server返回gzip内容
  3. android官方夜间模式,Android夜间模式实践
  4. linux mysql tmp_linux下mysql的tmp_table_size改变大小方法
  5. 【Django】认证系统
  6. 英语口语-文章朗读Week10 Thursday
  7. (转)为Spring集成的Hibernate配置二级缓存
  8. python附加索引_python – 附加两个多索引的pandas数据帧
  9. 如何调整html中音乐播放器的大小,html5实现在线响应式音乐播放器
  10. opencv-api fit
  11. Linux手机研发要过五大难关
  12. Lightroom Classic 教程,如何在 Lightroom 中使用边界变形保留完整视图?
  13. java 数字信号_GitHub - Bazingaliu/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  14. mismatch,equal比较两序列
  15. 计算语言学之语法理论
  16. vb.net画上下左右方向的箭头
  17. 苹果电脑切换任务管理器快捷键
  18. csp2021-09-4 收集卡牌
  19. 亚马逊、Lazada、shopee、wish、ebay、速卖通、阿里国际站、mercari、newegg测评,补单自养号攻略(环境方案详解)
  20. 小型便携式AIS接收机dAI01

热门文章

  1. Markdown笔记学习
  2. 经典智力题:飞机加油问题
  3. python计算密集型提速_利用Cython加速计算密集型python任务
  4. 老师计算机组合照说说,有关于老师的说说句子
  5. 240. 搜索二维矩阵 II
  6. 人脸识别选这几家就对了!
  7. 笋干炖排骨 [转自TK's Blog]
  8. informatica使用问题汇总
  9. iOS开发之直播App流程介绍,直播资料收集汇总,视频推流,视频拉流,SMTP、RTMP、HLS、 PLPlayerKit
  10. HDU 3031 ToBe Or Not To Be(模拟)