收藏 分享(赏)

仿射变换.pdf

上传人:weiwoduzun 文档编号:1755682 上传时间:2018-08-22 格式:PDF 页数:12 大小:214.89KB
下载 相关 举报
仿射变换.pdf_第1页
第1页 / 共12页
仿射变换.pdf_第2页
第2页 / 共12页
仿射变换.pdf_第3页
第3页 / 共12页
仿射变换.pdf_第4页
第4页 / 共12页
仿射变换.pdf_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、1计算机与工程问题解决导论第18讲:实验课2D API中的变换Prof.Steven R.LermanDr.V.Judson Harward仿射变换 2D API支持仿射变换-仿射意味着线性一个仿射变换映射2D坐标系这样线条的直线性和平行性被保留了下来所有的仿射变换可以由一个33浮点矩阵来表示有几个“基本”的仿射变换:缩放,旋转和平移22D API中的仿射变换由java.awt.geom包中的AffineTransform类的实例来表示变换可以通过AffineTransform对象的无参数构造函数来创建一个新的AffineTransform对象AffineTransform at = new

2、AffineTransform();在你可以在AffineTransform对象上调用以下任意的方法:- at.scale(double sx, double sy)- at.translate(double tx, double ty)- at.rotate(double theta)- at.rotate(double theta, double x, double y)这些方法可以混合着创建复杂的变换平移3平移例子,1import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class Transfor

3、mPanel extends JPanel Rectangle2D.Double rect; public TransformPanel() rect = new Rectangle2D.Double(0, 0, 50, 100); public void paintComponent(Graphics g) Graphics2D g2 = (Graphics2D) g; g2.setPaint(Color.BLUE); AffineTransform baseXf = new AffineTransform(); / 往右移50象素,往下移50象素baseXf.translate(50,50

4、); Shape s = baseXf.createTransformedShape( rect ); g2.fill(rect);应用变换你可以对一个或几个形状进行变换并画出结果:或者你可以变换坐标空间以及坐标空间中的一切4平移例子,2import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class TransformPanel extends JPanel Rectangle2D.Double rect; public TransformPanel() rect = new Rectangle2D.D

5、ouble(0, 0, 50, 100); public void paintComponent(Graphics g) Graphics2D g2 = (Graphics2D) g; g2.setPaint(Color.BLUE); AffineTransform baseXf = new AffineTransform(); /往右移50象素,往下移50象素baseXf.translate(50,50); g2.transform(baseXf); g2.fill(rect);平移例子,3我们可以使用这个main方法在JFrame中创建并显示一个TransformPanel5缩放缩放练习首

6、先,使用RectanglePanel作为基础编写代码缩放位于原点的rect以translation实例中一样的步骤来进行。以scale方法来取代translate方法。scale有两个double型参数:一个是x坐标的缩放,一个是y坐标的缩放。对数目1的调用缩放。尝试数目0。最后试试0的数下一步,修改rect使得不在原点处。scale对不在原点的形状会产生什么样的作用?6缩放解答public class TransformPanel extends JPanel Rectangle2D.Double rect; public TransformPanel() rect = new Rectan

7、gle2D.Double(0, 0, 50, 100); / 或者不在原点:/ rect = new Rectangle2D.Double(100,200,50,100); public void paintComponent(Graphics g) Graphics2D g2 = (Graphics2D) g; g2.setPaint(Color.BLUE); AffineTransform baseXf = new AffineTransform(); baseXf.scale(1.25,1.25); g2.transform(baseXf); g2.fill(rect);缩放说明基本的缩

8、放操作着眼于原点。若形状位于原点,则产生缩放。若位于其他地方,产生缩放的同时也产生了移动。 sx,x方向的缩放不需要同sy,y方向的缩放相一致。例如,关于x轴垂直翻转,则sx=1,sy=-17旋转旋转练习使用RectanglePanel作为基础编写代码旋转rect。遵从缩放练习中相同的步骤。调用basexf.rotate(),取一个参数:角度,单位为弧度。相对于原点这个方法将不仅旋转而且移动矩形。你将会发现Math.PI或者Math.toRadians(double degrees)很有用为了避免把rect旋转出视野,取一个小点的量旋转(10或者20度)当rect位于原点的时候旋转rect是如

9、何改变的?什么时候不是呢?8旋转解答public void paintComponent(Graphics g) Graphics2D g2 = (Graphics2D) g;g2.setPaint(Color.BLUE);AffineTransform baseXf = new AffineTransform();/基于原点旋转baseXf.rotate(-Math.PI/12);g2.transform(baseXf);g2.fill(rect);组合变换假设我们需要缩放(x,y)2倍然后旋转90度旋转缩放9组合缩放,2因为矩阵乘法是相关的,我们可以重写为组合变换,3因为矩阵的乘法不能简单

10、的交换,所以转换的顺序便很重要。这同我们的几何直觉相一致。如果颠倒了矩阵次序,转换顺序也就相反了。10最大混合点当你使用转换来转换整个坐标空间的时候,它们会像你期望的那样合成当你使用转换来转换一个对象的时候,它们会以你应用的相反方向合成下面的代码将先缩放,然后平移转换和原点当我们转换一个形状时,转换了该形状的每一个定义点,然后重新把它们画出来。若缩放或旋转一个不在原点的形状,同时也发生了平移。若只需要缩放或旋转,我们需要线平移到原点,缩放或旋转,然后再平移回来。11转换和原点,21.平移到原点2.旋转3.平移回去转换捷径每个Graphics2D对象有一个与之相关的AffineTransform

11、。当我们调用g2.transform(baseXf)的时候,我们通过同baseXf的合成改变了相关的变换在Graphics2D类中有一些方法允许我们用g2直接影响相关的变换- g2.translate(double tx, double ty);- g2.scale(double sx, double sy);- g2.rotate(double theta);- g2.rotate(double theta, double x, double y)这些方法代表了一种可选择的简单的应用转换的方法12Compass练习下载并复习Compass.java这个程序监听鼠标单击,当事件发生时,它在点击的方向指出红色箭头在它的当前模式下,程序是没有功能的:箭头不会移动注意到我们已经计算好theta值(鼠标单击点相对原点的角度)Compass提示更新paintComponent这样箭头点在每次鼠标单击的方向上为了完成这个你需要添加一行代码。这行代码将在g2上调用rotate,这样当g2.fill(arrow)调用的时候,它能正确的画出箭头什么时候应该调用rotate?在平移和缩放之前,之后还是之间?需要传递什么参数到rotate?在你旋转之前记住得到箭头的方向

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报