找回密码
 注册
Simdroid-非首页
查看: 125|回复: 2

[图形图像] Mathematica对Plot对象进行变换基础教程

[复制链接]
发表于 2011-12-12 18:33:31 | 显示全部楼层 |阅读模式 来自 北京
本帖最后由 guocong89 于 2011-12-12 18:41 编辑

来源: http://www.cnblogs.com/dabaopku/archive/2011/12/12/2285176.html

请先阅读这篇文章
http://forum.simwe.com/forum.php?mod=viewthread&tid=981907&highlight=plot

假设我们有一个Plot结果,比如
  1. g = Plot[10 Sin[x]/x, {x, 0, 10}]
复制代码
现在我想对图像进行缩放,旋转,镜像操作,该怎么实现呢?

如果你仔细阅读了上篇文章,应该对Plot对象的结构有一定的理解. 简言之,Plot结果就是一个Graphics对象,但不是Graphics Primitive, 因此针对Line, Circle的函数对它是没法使用的.
有了上面的基础概念, 我们就可以随心所欲的控制Plot对象了.

最简单的问题,我想获得图像上的数据点坐标
  1. g[[1, 1, 3, 2, 1]]
复制代码
进而你可以用 Interpolation 得到插值函数

那么我们怎么对图像进行旋转呢?

实际上,我们通过g[[1, 1, 3, 2]] 就可以获得Line数据,对它实施Rotate变换即可.
  1. Rotate[g[[1, 1, 3, 2]], 90 Degree, {0, 0}]
复制代码


但这个代码似乎还有点问题. 没错, Graphics Primitives是无法渲染的,它需要包装在Graphics对象中才可以,因此
  1. Graphics[Rotate[g[[1, 1, 3, 2]], 90 Degree, {0, 0}]]
复制代码

稍微美化一下
  1. Graphics[{g[[1, 1, 3, 1]],
  2.   Rotate[g[[1, 1, 3, 2]], 90 Degree, {0, 0}]}, Axes -> True]
复制代码



把它们放在一起看看效果
  1. Show[{g, Graphics[{Red, Rotate[g[[1, 1, 3, 2]], 90 Degree, {0, 0}]}]},
  2.   PlotRange -> All]
复制代码


没问题吧

但是上述方法对图形结构限制太大,要求Line对象正好在索引{1,1,3,2}的位置,如果我们对图像渲染额外做点处理,比如
  1. h = Plot[10 Sin[x]/x, {x, 0, 10}, ColorFunction -> "Rainbow",
  2.   PlotStyle -> {Thick}]
复制代码


既然我们只是要变换Graphics里面的对象,使用Map即可
  1. fun := GeometricTransformation[#,
  2.    Composition[TranslationTransform[{10, 0}],
  3.     RotationTransform[90 Degree, {0, 0}]]] &

  4. Show[h, MapAt[fun, h, 1], PlotRange -> All]
复制代码


至此,Plot对象已经可以任由我们操纵了.


发表于 2011-12-12 21:42:54 | 显示全部楼层 来自 台湾
Simdroid开发平台
本帖最后由 chungyuandye 于 2011-12-13 17:50 编辑
  1. g=Plot[10Sin[x]/x,{x,0,10}]
  2. f[scale_,theta_,color_]:=g/.{Line[a___]:>Line[scale*RotationMatrix[theta*Degree].#&/@a],
  3. Hue[___]:>color}

  4. Manipulate[
  5. Show[g,f[s,t,Green],PlotRange->{{-20,20},{-20,20}},
  6. AspectRatio->1],{{s,1,"Scale"},0,2},{{t,45,"Degree"},0,360}]
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-12-13 14:17:50 | 显示全部楼层 来自 四川乐山
学习了,但是还有一点问题。
最终有这样一段代码
Show[h,MapAt[fun,h,1],PlotRange->All]
我也把h的结构看了几遍,需要操作的是line对象,然后h的第一层不只是line,只是line包含在第一层而已,为什么函数fun只对line对象起了作用呢?
另外,如果对于每一个Plot对象只需把fun作于在第一层,那么Map[fun,h]就行了吧
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 19:52 , Processed in 0.032494 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表