首页 > 其他分享 >计算机图形:二维几何变换(2)

计算机图形:二维几何变换(2)

时间:2023-10-20 22:24:20浏览次数:43  
标签:反射 变换 tag 错切 sh 二维 几何变换 bmatrix 图形

目录

二维几何变换,分2部分:
计算机图形:二维几何变换(1)
计算机图形:二维几何变换(2)


平移、旋转、缩放这些属于基本变换,还有一些特殊二维变换如反射、错切。本文讲特殊二维变换。

特殊二维变换

反射

产生对象镜像的变换,称为反射(reflection)。

反射镜像如何得到?
通过将对象绕反射轴旋转180°。反射轴(axis of reflection)可以是xy平面内一条直线,或垂直于xy平面的一条直线。
当反射轴在xy平面内时,绕该轴旋转的路径在垂直于xy平面的平面中;
当反射轴⊥xy平面时,旋转路径在xy平面内。

特殊情况:

  1. 反射轴是x轴,即直线y=0

x值保持不变,y值为原来反号。于是,反射变换矩阵:

\[\tag{1} \begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

  1. 反射轴是y轴,即直线x=0

y值保持不变,x值为原来反号。于是,反射矩阵:

\[\tag{2} \begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 1\\ 0 & 0 & 1 \end{bmatrix} \]

  1. 同时翻转x、y坐标,即相对于原点的反射

反射矩阵:

\[\tag{3} \begin{bmatrix} -1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

相当于θ=180°的旋转矩阵R(θ),即将xy平面内的对象绕原点旋转180°。

关于y轴、x轴、原点反射示意图:

  1. 反射轴为直线y=x

反射矩阵:

\[\tag{4} \begin{bmatrix} 0 & 1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

两种方法:
Ⅰ 根据y=x对称性

任一点(x,y)关于y=x对称点为(y,x),于是

\[y'=x\\ x'=y \]

可得变换矩阵。

Ⅱ 复合变换

分三步:
①将直线y=x顺时针旋转45°(θ=45°),到x轴上,变换矩阵R(-θ);
②按x轴反射,变换矩阵\(R_{y=0}\)(式(1));
③逆时针旋转45°,将直线y=x旋转回原始位置,变换矩阵R(θ)。

复合变换矩阵:

\[\tag{5} \begin{bmatrix} 0 & 1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

  1. 关于任意直线y=mx+b的反射

可以用平移-旋转-反射的复合变换来完成:
先平移到经过原点,再旋转到x轴,进行x轴反射,最后逆旋转、逆平移回原位置。

错切

错切(shear)是一种使对象形状发生变化的变换,经过错切的对象好像是由已经相互滑动的内部夹层组成。

2种常用错切:
1)移动x坐标值的错切;
2)移动y坐标值的错切。

  • 相对于x轴的x方向错切

变换矩阵:

\[\tag{6} \begin{bmatrix} 1 & sh_x & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

对应坐标变换:

\[\tag{7} x'=x+sh_x\cdot y, y'=y \]

\(sh_x\)可以是任意实数。

例,\(sh_x=2\),正方形错切变换成平行四边形,如下图:

  • 相对于其他参考线的x方向错切

错切矩阵:

\[\tag{8} \begin{bmatrix} 1 & sh_x & -sh_x\cdot y_{ref}\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} \]

对应坐标变换:

\[\tag{9} x'=x+sh_x(y-y_{ref}), y'=y \]

例,错切参数\(sh_x={1\over 2}\)、相对于直线\(y_{ref}=-1\)的错切:

  • 相当于\(x=x_{ref}\)的y方向错切

错切矩阵:

\[\tag{10} \begin{bmatrix} 1 & 0 & 0\\ sh_y & 1 & -sh_y\cdot x_{ref}\\ 0 & 0 & 1 \end{bmatrix} \]

对应坐标变换:

\[\tag{11} x'=x, y'=y+sh_y(x-x_{ref}) \]

小结

反射能得到对象关于某个坐标轴,或某个点旋转后的镜像对象。
错切能将正方形变换成梯形,这在后面的透视投影的斜透视投影棱台中会有应用。

标签:反射,变换,tag,错切,sh,二维,几何变换,bmatrix,图形
From: https://www.cnblogs.com/fortunely/p/17778113.html

相关文章

  • 运用模板重载二维数组
    #include<iostream>#include<array>usingnamespacestd;//stack.htemplate<typenameT>classArray{public: Array(introw,intcol); T*operator[](introw);public: T*m_pT; intm_Row; intm_Col;};template<typenameT>Ar......
  • Git图形化操作软件:TortoiseGit
    问题不显示图片【打勾的那个或状态】解决参考:https://developer.aliyun.com/article/1191911效果图其它参考:https://www.bilibili.com/video/BV1xM41197PR/?vd_source=5fed6e8a7e3ad9f10860bf7a4540ba71......
  • 2023-10-04:用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你
    2023-10-04:用go语言,现有一棵无向、无根的树,树中有n个节点,按从0到n-1编号给你一个整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间存在一条边。每个节点都关联一个价格。给你一个整数数组price,其中price[i]是第i......
  • 【模板】二维计算几何初步
    template<classT>structpoint{Tx,y;point():point(0,0){}point(Tx,Ty):x(x),y(y){}friendpointoperator+(constpoint&lhs,constpoint&rhs){return{lhs.x+rhs.x,lhs.y+rhs.y};}friend......
  • WPF绘图(二):绘制图形
    WPF绘制图形有三种方式:使用FrameworkElement的派生类使用图元转换器绘制几何图形使用DrawingContext绘制1. 使用FrameworkElement派生类FrameworkElement类继承自UIElement类,意味它的派生类,都是UI元素,可以直接显示在界面上中。例如Shape的子类,Control的子类等。这是最简单......
  • 开源游戏 | 一款采用 Java开发的基于小孔成像原理与图形光栅化的字符 3D 画面框架构建
     去关注、不迷路一、项目概述       这是一款采用JavaSwing开发的基于小孔成像原理与图形光栅化的字符3D画面框架构建的空战游戏,简单说就是作者为了做个3D字符空战游戏,顺手写了个3D引擎,别人的本科毕设。注:dogfight为军事用语,是指战机近距离接战缠斗,可直接......
  • C#判断当前时间是否在规定时间段范围内(二维数组超简版)
    直接上C#代码TimeSpannowTime=DateTime.Now.TimeOfDay;string[,]arr={{"7:50","8:10"},{"9:55","10:15"},{"13:55","14:10"},{"15:55","16:10"},{"18:55",......
  • 子矩阵的和(二维前缀和)
    一、算法描述上一篇文章介绍了一维前缀和,也就是一个数组的前n项和,这篇文章来介绍一下什么是二维前缀和。含义一维的是前n项的和,那么二维的情况下,表示的则是与左上角形成的矩形和。怎么求一维的递推关系式是s[i]=s[i-1]+a[i];,我们根据含义来思考二维的递推关系式,读......
  • 初学Bokeh:修改图形符号(glyphs)的属性【10】跬步
    初学Bokeh:修改图形符号(glyphs)的属性【10】跬步如果在创建对象之后希望更改其属性,可以通过直接定义并覆盖对象的属性的方法进行修改。以上面【9】跬步的绘图例程为例。过参数设置fill_color="red"将圆的填充色定义为红色。若希望将圆的填充颜色从红色改为蓝色,首先需要调用circle(......
  • 初学Bokeh:修改图形符号属性【9】跬步
    初学Bokeh:修改图形符号属性【9】跬步例如,绘制圆形的函数circle()允许定义圆的颜色、直径等多种属性:fill_color:填充颜色;fill_alpha:填充颜色的透明度(0到1之间的任何值);line_color:轮廓线条的填充颜色;size:圆的尺寸(以屏幕单位或数据单位表示);legend_label:图例;在前面的示例......