计算机图形学:二维图形的几何变换(算法原理及代码实现)

这篇具有很好参考价值的文章主要介绍了计算机图形学:二维图形的几何变换(算法原理及代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实现方案

  对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。

  对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再结合二维矩阵的原理即可实现,如果图形需要对图形对象进行旋转和放缩两类变换进行多次操作,则可以首先将两变换矩阵合成一个复合变换矩阵。针对于平移是矩阵的相加,为了统一成相乘,可以用齐次坐标可以解决。

  如下为在齐次坐标下,各原点与变换矩阵形式。

计算机图形学:二维图形的几何变换(算法原理及代码实现)

  所以,若要完成更复杂的变换,可以通过将这些基本变换合成一个复合变换,将多次运算转换成的一次性矩阵与向量相乘即可完成复杂变换。

  如任一图形关于任意的反射轴y=a+bx的反射变换可以转换为(1)平移-a;(2)旋转至与x/y轴重合;(3)沿x/y轴对称;(3)旋转回(2)之前的位置;(4)平移a四步即可完成。

二、代码实现

// CMatrixView 绘图
//变换矩阵
struct Matrix {
	double a[10][10];
	Matrix() {
        memset(a, 0, sizeof(a));
	}
	void init(){
		for (int i = 0; i <= 4; i++) {
				a[i][i] = 1;
		}
	}
};
//坐标点
struct Point
{
	double x, y;
};

//矩阵相乘
Matrix get_mx(Matrix a, Matrix b) {
	Matrix tmp;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			double sum=0;
			for (int k = 0; k < 3; k++){
				sum += a.a[i][k] * b.a[k][j];
			}
			tmp.a[i][j] = sum;
		}
	}
	return tmp;
}

//得到与矩阵相乘后的点
Point matrix_point(Point p, Matrix m) {
	Matrix n;
	n.a[0][0] = p.x;
	n.a[1][0] = p.y;
	n.a[2][0] = 1;
	for (int i = 0; i < 3; i++) {
		double sum = 0;
		for (int j = 0; j < 3; j++) {
			sum+= m.a[i][j] * n.a[j][0];
		}
		n.a[i][1] = sum;
	}
	p.x = n.a[0][1] / n.a[2][1];
	p.y = n.a[1][1] / n.a[2][1];
	return p ;
}

//平移
Matrix translate(double Tx, double Ty, Matrix m) {
	Matrix tmp;
	tmp.init();
	tmp.a[0][2] = Tx;
	tmp.a[1][2] = Ty;
	tmp = get_mx(m, tmp);
	return tmp;
}
//放缩
Matrix Shrink(double Tx, double Ty, Matrix m){
	Matrix tmp;
	tmp.init();
	tmp.a[0][0] = Tx;
	tmp.a[1][1] = Ty;
	tmp = get_mx(m, tmp);
	return tmp;
}

//旋转
Matrix revolve(double cot, Matrix m) {
	Matrix tmp;
	tmp.init();
	tmp.a[0][0] = cos(cot);
	tmp.a[1][1] = cos(cot);
	tmp.a[0][1] = -(sin(cot));
	tmp.a[1][0] = sin(cot);
	tmp = get_mx(m, tmp);
	return tmp;
}

//轴对称
Matrix axisymmetric(int x, Matrix m) {
	Matrix tmp;
	tmp.init();
	//x==1为x轴对称
	if (x == 1) {
		tmp.a[1][1] = -1;
	}
	//否则为y轴对称
	else {
		tmp.a[0][0] = -1;
	}
	tmp = get_mx(m, tmp);
	return tmp;
}

//关于任意轴对称
Matrix symmetry(double k, double b, Matrix m) {
	Matrix tmp;
	tmp.init();
	//先平移
	double cot = atan(k);
	tmp = translate(0, -b, tmp);
	//再旋转
	tmp = revolve(cot, tmp);
	//再沿x轴对称
	tmp = axisymmetric(1, tmp);
	//再旋转
	tmp = revolve(-cot, tmp);
	//再平移
	tmp = translate(0, b, tmp);
	tmp = get_mx(m, tmp);
	return tmp;
}

void Line(CDC* pDC, Point p1, Point p2) {
	pDC->MoveTo(p1.x, p1.y);
	pDC->LineTo(p2.x, p2.y);
}

void Linepoly(CDC* pDC, Point p1, Point p2,Point p3,int color) {
	CPen m_newPen, * m_oldPen;
	//创建新画笔
	m_newPen.CreatePen(PS_SOLID, 3,color);
	//将新画笔选入设备上下文,并且保存旧画笔
	m_oldPen = pDC->SelectObject(&m_newPen);
	pDC->MoveTo(p1.x, p1.y);
	pDC->LineTo(p2.x, p2.y);
	pDC->MoveTo(p2.x, p2.y);
	pDC->LineTo(p3.x, p3.y);
	pDC->MoveTo(p3.x, p3.y);
	pDC->LineTo(p1.x, p1.y);
	pDC->SelectObject(m_oldPen);

}
//实现程序:
//沿任意轴对称
	Point p7 = { -10,10 };
	Point p8 = { -90,90 };
	Point p9 = { -20,50 };
	//变换前为棕红色
	Linepoly(pDC, p7, p8, p9,RGB(128,0,0));
	Point p10 = { -100,-100 };
	Point p11 = {100,100};
	Line(pDC, p10, p11);
	Matrix m4;
	m4.init();
	m4 = symmetry(1, 0, m4);
	p7 = matrix_point(p7, m4);
	p8 = matrix_point(p8, m4);
	p9 = matrix_point(p9, m4);
	//变换后为蓝色
	Linepoly(pDC, p7, p8, p9,RGB(0,51,153));

三、代码运行结果

计算机图形学:二维图形的几何变换(算法原理及代码实现)文章来源地址https://www.toymoban.com/news/detail-505192.html

到了这里,关于计算机图形学:二维图形的几何变换(算法原理及代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)

    一 实验目的 编写图形各种变换的算法 二 实验内容 1 :自行设计基本图案,完成1-5种简单变换 实验结果如下图所示: 图形初始化: 第一次点击左键,实现平移变换:     第二次点击左键,实现比例变换(同时伴有平移变换):   第三次点击左键,实现对称变换(以平行

    2024年02月05日
    浏览(46)
  • 【计算机图形学01】坐标变换

             将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个 过渡 坐标系(Intermediate Coor

    2024年02月10日
    浏览(40)
  • 计算机图形学(三) -- 3D 变换

    同样引入齐次坐标: 3D 点 = ( x , y , z , 1 ) T (x, y, z, 1)^T ( x , y , z , 1 ) T 3D 向量 = ( x , y , z , 0 ) T (x, y, z, 0)^T ( x , y , z , 0 ) T 通常, ( x , y , z , w ) (x, y, z, w) ( x , y , z , w ) (w != 0) 表示一个坐标为 ( x / w , y / w , z / w ) (x/w, y/w, z/w) ( x / w , y / w , z / w ) 的 3D 点 用一个 4x4 的矩阵来表示

    2024年02月08日
    浏览(41)
  • 计算机图形学 | 变换与观察

    华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 回顾几何阶段 整体流程: 这其中存在3种变换: 坐标系的变换 模型本身的运动 观察者的运动 几何变换 以上各种变换都可以通过以下变换的复合来计算: 平移 比例 旋转 对称 错切 图形的几何变换是指对图

    2023年04月27日
    浏览(44)
  • 【计算机图形学】图形变换(以任意直线为对称轴的对称变换)

    模块3-2 图形变换 一 实验目的 编写图形各种变换的算法 二 实验内容 1 :任意直线的对称变换。要求将变换矩阵写在实验报告中,并与代码匹配。求对任意直线Ax+By+C=0的对称变换矩阵。 实验结果如下图所示: 1:预设图形初始化 2:鼠标左键点击直线起点 3:鼠标右键点击直线

    2024年02月01日
    浏览(57)
  • 计算机图形学基础:2D/3D坐标变换(Transformation)

    本文讲解了2D变换和3D变换式如何用矩阵表示的 如何将线性和非线性变换进行一个统一表示形式 三维物体在二维空间上的映射 表示向量添加了一维,分别表示单位距离和平移不变形的方向 旋转默认都是以(0, 0)为中心

    2023年04月08日
    浏览(44)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(50)
  • 计算机图形学:详解法线与法线贴图原理

     再游戏中,渲染多面是比较消耗性能的,法线贴图可以让在一张平面图片上面模拟出凹凸的效果 首先看下wiki上的解释: 在三维计算机图形学中,法线贴图(英語:Normal mapping)是一种模拟凹凸处光照效果的技术,是凸凹贴图的一种实现。法线贴图可以在不添加多边形的前提

    2023年04月09日
    浏览(52)
  • 计算机视觉--距离变换算法的实战应用

    前言: Hello大家好,我是Dream。 计算机视觉CV是人工智能一个非常重要的领域 。 在本次的距离变换任务中,我们将使用 D4距离度量方法 来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算机视觉和图像处理有了更深入的

    2024年02月15日
    浏览(54)
  • Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景? 有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光

    2024年02月07日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包