基于EasyX学习图形学中的三维几何变换【全】

这篇具有很好参考价值的文章主要介绍了基于EasyX学习图形学中的三维几何变换【全】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  • 本文开始学习几何变换中的三维变换,对于各种变换的定义方法基本和二维变换一样,在此我就不过多赘述了。
  • 三维变换矩阵
    由于二维变换矩阵为三阶矩阵,所以三维变换矩阵为四阶矩阵
  • 以下例子均在此正方体基础上

基于EasyX学习图形学中的三维几何变换【全】

一、平移变换

  • 坐标表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 矩阵表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 变换矩阵
    基于EasyX学习图形学中的三维几何变换【全】

#include "E_Point3.h"
class E_Transform3
{
public:
	double T[4][4];
	E_Point3* P;
	int PtrNum;
public:
	~E_Transform3() {}
	E_Transform3(){}

	void SetMatrix(E_Point3* P, int Pt);//获取顶点表和顶点个数
	void E_Translate(double tx, double ty, double tz);//平移函数

	void E_RotateX(double thet);//X轴旋转函数
	void E_RotateY(double thet);//Y轴旋转函数
	void E_RotateZ(double thet);//Z轴旋转函数
	void E_RotatePX(double thet, E_Point3 P);//绕点旋转函数
	void E_RotatePY(double thet, E_Point3 P);//绕点旋转函数
	void E_RotatePZ(double thet, E_Point3 P);//绕点旋转函数
	void E_RotatePXY(double thet, E_Point3 P);//绕点旋转函数

	void E_Scale(double dx, double dy, double dz);//缩放函数

	void E_ReflectZ();//Z轴反射
	void E_ReflectX();//X轴反射
	void E_ReflectY();//Y轴反射

	void E_ReflectZOX();//ZOX面反射
	void E_ReflectXOY();//XOY面反射
	void E_ReflectYOZ();//YOZ面反射

	void E_ShearX(double b, double c);//沿X方向错切变换
	void E_ShearY(double b, double c);//沿Y方向错切变换
	void E_ShearZ(double b, double c);//沿Z方向错切变换

	void Identity();//对变换矩阵进行单位化
	void MultiplyMatrix();//进行矩阵乘法
};
#include "E_Point3.h"
#include "E_Facet.h"
#include "E_Point.h"
#include<graphics.h>
class E_Cube
{
public:
	E_Cube(){}
	~E_Cube() {}
	void GetPoint();//获取正方体各顶点坐标
	void GetFacet();//根据面将顶点排序
	E_Point3* GetVertexArrayName();//返回顶点数组
	void Draw();//绘制正方体
private:
	E_Point3 P[8];//八个顶点
	E_Facet F[6];//六个面
};
  • 核心代码
void E_Transform3::SetMatrix(E_Point3* P, int Pt)
{
	this->P = P;
	this->PtrNum = Pt;
}

void E_Transform3::E_Translate(double tx, double ty, double tz)
{
	Identity();
	T[0][3] = tx; T[1][3] = ty; T[2][3] = tz;
	MultiplyMatrix();
}
///这是画正方体的函数
void E_Cube::Draw()
{
	E_Point ScreenPoint, temp;
	for (int nFacet = 0; nFacet < 6; nFacet++) {
		for (int nPoint = 0; nPoint < 4; nPoint++) {
			/*
			获取每个面上的点
			由于是直接投影到xoy平面所以本次投影为正交投影
			F[nFacet].Index[nPoint]表示每个面上的点的索引
			*/
			ScreenPoint.x = P[F[nFacet].Index[nPoint]].x;
			ScreenPoint.y = P[F[nFacet].Index[nPoint]].y;
			if (0 == nPoint) {//获取每个面的起始点
				moveto(ScreenPoint.x, ScreenPoint.y);
				temp = ScreenPoint;
			}
			else {
				lineto(ScreenPoint.x, ScreenPoint.y);
			}
		}
		lineto(temp.x, temp.y);//最后闭合四边形
	}
}
主函数
	HWND hwnd = initgraph(500, 500);
	setorigin(250, 250);
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID, 2);
	E_Cube Cube;
	E_Transform3 Translate;
	Cube.GetPoint();
	Cube.GetFacet();
	for (; 1;) {
		Cube.Draw();
		Sleep(500);
		cleardevice();
		Translate.SetMatrix(Cube.GetVertexArrayName(), 8);
		Translate.E_Translate(2,0,0);//沿x方向平移
	}
	closegraph();
	return 0;
  • 效果展示
    基于EasyX学习图形学中的三维几何变换【全】

二、比例变换

  • 坐标表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 矩阵表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 变换矩阵
    基于EasyX学习图形学中的三维几何变换【全】

  • 核心代码文章来源地址https://www.toymoban.com/news/detail-483846.html

void E_Transform3::E_Scale(double dx, double dy, double dz)
{
	Identity();
	T[0][0] = dx; T[1][1] = dy; T[2][2] = dz;
	MultiplyMatrix();
}
///主函数
	HWND hwnd = initgraph(500, 500);
	setorigin(250, 250);
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID, 2);
	E_Cube Cube;
	E_Transform3 Scale;
	Cube.GetPoint();
	Cube.GetFacet();
	for (; 1;) {
		Cube.Draw();
		Sleep(1000);
		cleardevice();
		Scale.SetMatrix(Cube.GetVertexArrayName(), 8);
		Scale.E_Scale(1.1,1.1,1.1);//正方体放大1.1倍
	}
	closegraph();
	return 0;
  • 效果展示
    基于EasyX学习图形学中的三维几何变换【全】

三、旋转变换

  • 坐标表示

在此我从二维旋转推一下三维坐标旋转变换

基于EasyX学习图形学中的三维几何变换【全】
从此图可以得出二维旋转变换的一系列表示

基于EasyX学习图形学中的三维几何变换【全】

在此基础上加一个z轴旋转并没有发生什么改变,则此二维旋转便可以看作是绕z轴旋转,则可以得出三维旋转中的绕z轴旋转

基于EasyX学习图形学中的三维几何变换【全】
基于EasyX学习图形学中的三维几何变换【全】

从绕z轴的旋转变换便可以得出绕其它轴的变换,原理很简单,将x,y,z的位置交换但要符合右手坐标系,再来推一个绕y轴变换的

基于EasyX学习图形学中的三维几何变换【全】
基于EasyX学习图形学中的三维几何变换【全】

基于EasyX学习图形学中的三维几何变换【全】

基于EasyX学习图形学中的三维几何变换【全】

同理便可得出绕x轴旋转的坐标表示

  • 矩阵表示
    根据坐标表示便可得出矩阵表示,在此列出绕z轴的矩阵表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 变换矩阵
    此处只列出绕z轴旋转的变换矩阵
    基于EasyX学习图形学中的三维几何变换【全】

  • 核心代码

void E_Transform3::E_RotateX(double thet)
{
	Identity();
	T[1][1] = cos(thet); T[1][2] = -sin(thet); T[2][1] = sin(thet); T[2][2] = cos(thet);
	MultiplyMatrix();
}

void E_Transform3::E_RotateY(double thet)
{
	Identity();
	T[0][0] = cos(thet); T[2][0] = -sin(thet); T[0][2] = sin(thet); T[2][2] = cos(thet);
	MultiplyMatrix();
}

void E_Transform3::E_RotateZ(double thet)
{
	Identity();
	T[0][0] = cos(thet); T[0][1] = -sin(thet); T[1][0] = sin(thet); T[1][1] = cos(thet);
	MultiplyMatrix();
}
///主函数
#include "E_Cube.h"
#include "E_Transform3.h"
#define PI 3.1415926
int main() {
	HWND hwnd = initgraph(500, 500);
	setorigin(250, 250);
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID, 2);
	E_Cube Cube;
	E_Transform3 Rotate;
	Cube.GetPoint();
	Cube.GetFacet();
	for (; 1;) {
		Cube.Draw();
		Sleep(1000);
		cleardevice();
		
		Rotate.SetMatrix(Cube.GetVertexArrayName(), 8);
		Rotate.E_RotateZ(PI / 6);
		Rotate.E_RotateY(PI / 6);
		Rotate.E_RotateX(PI / 6);
	}
	closegraph();
	return 0;
}
  • 效果展示
    基于EasyX学习图形学中的三维几何变换【全】

四、反射变换

  • 坐标表示

    • 以下依次为x轴、y轴、z轴的反射
      基于EasyX学习图形学中的三维几何变换【全】
    • 以下依次为xoy面、zox面、yoz面反射
      基于EasyX学习图形学中的三维几何变换【全】
  • 矩阵表示
    这里只以x轴反射为例
    基于EasyX学习图形学中的三维几何变换【全】

  • 变换矩阵
    这里只以x轴反射为例
    基于EasyX学习图形学中的三维几何变换【全】

  • 核心代码

void E_Transform3::E_ReflectZ()//z轴
{
	Identity();
	T[0][0] = -1; T[1][1] = -1; T[2][2] = 1;
	MultiplyMatrix();
}

void E_Transform3::E_ReflectX()//x轴
{
	Identity();
	T[0][0] = 1; T[1][1] = -1; T[2][2] = -1;
	MultiplyMatrix();
}

void E_Transform3::E_ReflectY()//y轴
{
	Identity();
	T[0][0] = -1; T[1][1] = 1; T[2][2] = -1;
	MultiplyMatrix();
}

void E_Transform3::E_ReflectZOX()//zox面
{
	Identity();
	T[0][0] = 1; T[1][1] = -1; T[2][2] = 1;
	MultiplyMatrix();
}

void E_Transform3::E_ReflectXOY()//xoy面
{
	Identity();
	T[0][0] = 1; T[1][1] = 1; T[2][2] = -1;
	MultiplyMatrix();
}

void E_Transform3::E_ReflectYOZ()//yoz面
{
	Identity();
	T[0][0] = -1; T[1][1] = 1; T[2][2] = 1;
	MultiplyMatrix();
}

五、错切变换

  • 坐标表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 矩阵表示
    基于EasyX学习图形学中的三维几何变换【全】

  • 变换矩阵
    基于EasyX学习图形学中的三维几何变换【全】

  • 核心代码

void E_Transform3::E_ShearX(double b, double c)
{
	Identity();
	T[0][2] = b; T[0][3] = c; 
	MultiplyMatrix();
}

void E_Transform3::E_ShearY(double b, double c)
{
	Identity();
	T[1][0] = b; T[1][3] = c;
	MultiplyMatrix();
}

void E_Transform3::E_ShearZ(double b, double c)
{
	Identity();
	T[2][0] = b; T[2][1] = c;
	MultiplyMatrix();
}

到了这里,关于基于EasyX学习图形学中的三维几何变换【全】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数在计算机图形学中的应用

    文章背景:本学期我学习了计算机图形学,我发现背后都是由线性代数的知识作为支撑的,于是我想把目前我了解到的一些数学知识总结出来。另外,本文在举例时主要采用计算机游戏的场景来进行举例,以更好地说明这些数学概念或公式的应用。 (本文章为课程作业)  

    2024年02月04日
    浏览(38)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(29)
  • CG3-v2.0-图形几何变换

    (1) 理解几何变换基本原理, 掌握平移、旋转、缩放变换的方法; (2) 根据平移算法原理补全translation、scale、rotation_x、rotation_y和rotation_z函数; (3) 根据几何变换基本原理,将main函数中的translation、scale、rotation_z参数补充完整。

    2024年02月08日
    浏览(42)
  • 计算机图形学中的曲线问题——拉格朗日插值曲线绘制实践

    限于篇幅,我们将在这篇文章中介绍拉格朗日插值曲线绘制实践,主文章链接: GGN_2015 计算机图形学中的曲线问题 在主文章中我们已经介绍了拉格朗日插值函数的绘制方法。给定一个函数必须通过的点的集合,保证任意两点 x x x 指不同,我们就能构造出一条拉格朗日插值函

    2024年02月14日
    浏览(30)
  • 计算机视觉 图像形成 几何图形和变换 3D到2D投影

            现在我们知道如何表示2D和3D几何图元以及如何在空间上转换它们,我们需要指定如何将 3D图元投影到图像平面上。 我们可以使用线性3D到2D投影矩阵来做到这一点。最简单的模型是正交法,它不需要除法就可以得到最终的(不均匀的)结果。更常用的模型是透视,

    2023年04月08日
    浏览(33)
  • 如何利用地面控制点实现倾斜摄影三维模型数据的几何坐标变换和纠正?

     倾斜摄影是一种在空中拍摄地表物体的技术,可以获得高分辨率、高精度的三维模型数据,广泛应用于城市规划、建筑设计、土地管理等领域。然而,由于航拍时无法避免姿态偏差和高程误差,导致摄影测量数据存在系统性误差,因此需要利用地面控制点进行几何坐标变换

    2024年02月07日
    浏览(33)
  • C++实现贪吃蛇(含源代码)—基于easyx图形库

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识: C++基础                                        ♈️ 今日夜电波:toge—あよ              

    2024年02月09日
    浏览(29)
  • 【C/C++小游戏】2048 大作战!(基于Easyx图形窗口实现)

    写在前面 游戏简介 Easyx 图形库 编写游戏 预编译代码 第一步:初始化棋盘 第二步:绘制棋盘 第三步:用户操作 第四步:封装函数 完整代码 效果展示 大家好! 本人是一个12岁六年级小学生,今年9月开始学习C++,曾经学过1年Python。 这是我的第一篇博客,决定分享一个游戏

    2024年02月10日
    浏览(30)
  • 【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识: C++基础                                        ♈️ 今日夜电波:toge—あよ              

    2024年02月10日
    浏览(31)
  • Python-OpenCV中的图像处理-几何变换

    对图像进行各种几个变换,例如移动,旋转,仿射变换等。 cv2.resize() cv2.INTER_AREA v2.INTER_CUBIC v2.INTER_LINEAR res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 或 height, width = img.shape[:2] res = cv2.resize(img, (2 width, 2 height), interpolation=cv2.INTER_CUBIC) OpenCV提供了使用函数cv2.warpAffine()实

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包