6.1、坐标系变换

POSTSCRIPT图形操作是在一个坐标系中,这个坐标系被称为用户坐标系或用户空间,该坐标系独立于任何物理设备。POSTSCRIPT在用户空间中进行绘制,并将结果传输到特定的打印机设备(设备空间)中。
在程序中,通常使用默认的坐标系。在这个空间中,原点是在页面的左下角,量度是1/72英寸长度。
然而,用户空间是可塑性的,他的坐标系可能是在位置,方向,大小变化后的。

6.1.1、用户空间的平移

translation是从一个地方运动到另一个地方。这个运动是原点的运动。例如:

100 200 translate 

将会把原点右移100个单位,上移200个单位,随后的操作都是根据这个新的原点进行测量。

下面的程序将说明这个转化效果。

/Times-Roman findfont 30 scalefont setfont/square        %一个填充的方块 
{newpath         0 0 moveto90 0 lineto     %定义正方形的路径90 90 lineto0 90 linetoclosepath fill  %进行填充6 92 moveto     %文本显示(A Box) show } def square              %绘制一个方块
200 250 translate   %将原点移动x + 200 y + 250
square              %绘制第二个方块
200 250 translate   %原点再次移动x + 200 y + 250
square              %绘制第三个方块
showpage  

这个程序定义了一个方块,然后通过原点变换获得了三个方块。

注:原点的变换是相对于当前原点而不是起始原点。

6.1.2、用户空间的旋转

rotate是从栈中取出一个数然后进行逆时针旋转坐标轴。(旋转的单位是度)

/Times-Roman findfont 30 scalefont setfont/square
{newpath        0 0 moveto90 0 lineto    90 90 lineto0 90 linetoclosepath fill 6 92 moveto     (A Box) show } def square
300 150 translate
60 rotate           %逆时针旋转90度
square
300 150 translate
60 rotate           %逆时针旋转60度
square
showpage

在此,我们只是改变了坐标系的位置,方块实际上的定义从未改变。

6.1.3、用户空间的缩放

scale运算符允许更改坐标单元的大小,这个运算符获取两个参数,一个x缩放,一个y缩放,例:

3 3 scale

执行此操作,将会将x,y放大为原来的三倍。

在此通过小方块例子

/Times-Roman findfont 30 scalefont setfont/square
{newpath        0 0 moveto90 0 lineto    90 90 lineto0 90 linetoclosepath fill 6 92 moveto     (A Box) show } def square
300 150 translate
1.5 1.5 scale      %扩大1.5倍
square
300 150 translate
0.5 2 scale        %x 缩小到原来的1/2 y变为原来的2倍
square
showpage

6.2、绘图状态

目前为止,我们工作在当前的绘图状态中,构成当前环境包括(路径,点,灰度值,字体,线宽,用户坐标系)。

6.2.1、保存当前的图形状态 

有时候我们需要保存当前的图形状态,以便以后可以随时得到他。

例如:如果想要打印一个填充的图形,我们就必须要构建一个适合的路径,然后填充他。不幸的是fill操作符将会清除当前的路径。所以在执行fill前应先保存当前的路径,在fill之后再恢复保存的路径就可以了。

保存和恢复图形状态的操作符是gsave和grestore。

gsave操作符将当前图形状态的副本保存在图形状态的堆栈中。这个堆栈最多可保存32个图形状态(包括当前图形状态)。

grestore操作符恢复最新的gsave图形状态。包括当时的所有特征,路径,灰度,线宽,用户坐标系。

下面是一个五角星来演示这些操作符的使用

/starside
{ 72 0 lineto currentpoint translate -144 rotate } def /star %stack: x y
{ movetocurrentpoint translate4 {starside} repeatclosepathgsave.5 setgray fillgrestorestroke }def200 200 star
showpage

在这个程序,定义了两个步骤

starside绘制了组成该星星的一条直线。

star根据坐标点填充星星。

添加一条水平线

72 0 lineto       %星星的边长为72

将坐标系原点移动到水平线的末尾

currentpoint translate

再讲坐标系顺时针旋转144度

-144 rotate

repeat:这个运算符需要两个参数

一个数字(例子中的4)

一组用括号括起来的运算(starside)

意思为执行指定运算4次

4 {starside} repeat

然后跟上结束符,完成路径绘制

closepath          %画笔回到起点

进行图形的填充(填充操作会清空路径信息所以要提前保存,不保存的话1.路径被清空,不会显示变沿线以及中间的五边形,灰度清空所有线的灰度值会一样,看不出轮廓)

gsave
.5 setgray fill      %将灰度值设置为0.5进行填充
grestore         %恢复保存的默认状态 

以200 200的坐标点绘制当前图形,然后提交当前页面到纸张。

200 200 star
showpage

6.3、曲线

通常图形图像不仅仅是由直线构成,在postscript中可以使用运算符来定义任何期望的曲线。

6.3.1、圆弧

在本节中我们将讨论圆弧曲线arc  

arc操作符是将圆弧添加到当前路径,他需要五个参数

弧的曲率中心的x,y坐标、曲率半径、以及从正x轴逆时针测量的弧的起始和结束角。

例:中心在100 150 半径为36 从逆时针45到90

100 150 36 45 90 arc

arcn运算符和arc类似,只是在方向上相反,为顺时针

100 150 36 45 90 arcn

第一条线是画了一个圆弧

第二条线是先将图龟移动到300 365 然后以40度起点到60度起点画弧

newpath
300 400 54 40 140 arc stroke
newpath
300 365 moveto
340 345 54 40 140 arc stroke
showpage

6.3.2、椭圆

圆可以认为是一个0到360的弧线

椭圆可以认为是将坐标系非均匀缩放之后的圆

/doACircle
{   0 0 54 0 360 arc stroke } def
/doAnEllipse
{   1 .75 scale            %横坐标不变,纵坐标变为原来的0.75doACircle            %绘制圆  stroke } def
300 500 translate doACircle
4 {0 -72 translate        %不断缩放坐标系
doAnEllipse} repeat
showpage

6.3.3、圆角

相交线经常通过圆角进行连接,postscript的arcto运算符提供了一种方法。

操作员除了当前点意外需要两个点和一个半径

可以这样理解:以起始点开始,第一个点为线段连线,再将第一个点和第二个点连线,组成相交的一个角,以r为半径的圆相切与这两个直线,最后形成的弧度即为圆角。

  

例:列出了两个圆角,分别为两条线段的角度,相同,第一条线段的长度相同,第二条线段的长度不同,可以看到,两个弧度的大小是一样的。

/DrawAnX
{3 3 rmoveto-6 -6 rlineto0 6 rmoveto6 -6 rlinetostroke
}def50 50 moveto DrawAnX
50 150 moveto DrawAnX
150 150 moveto DrawAnX
50 50 moveto
50 150 150 150 36 arcto
4 {pop} repeat200 50 moveto DrawAnX
200 150 moveto DrawAnX
400 150 moveto DrawAnX200 50 moveto
200 150 400 150 36 arcto
4 {pop} repeatstroke
showpage

注意:在圆角绘制完成后,当前的图龟停留在最后一次相切的圆角的末端。以第一个圆弧为例,

起始点 50 50

圆规确定的点是 50 150 150 150 36

此时在arcto运算符执行后有一组数据保留在了堆栈中,分别是圆角的起始点和终止点。

起始点 50,150 - 36 = 114

终止点 50 + 36 = 86,150

这四个点对于我们来说是没有必要的,所以,我们要将其从堆栈中删除。

例:打印一个logo

% ------------ Define Procedures -------------
/Helvetica-Bold findfont 27 scalefont setfont/fourpops               %四次出栈
{ 4 {pop} repeat } def/background             %绘制背景
{ 0 18 moveto0 72 108 72 18  arcto fourpops108 72 108 0 18 arcto fourpops108 0 0 0 18    arcto fourpops0 0 0 72 18     arcto fourpopsfill } def/moon
{ .6 setgray          %绘制logo中的小圆81 45 18 0 360 arc fill} def/omaha                  %绘制字体
{ 1 setgray0 -1 moveto1 2 scale               %更改坐标系比例(OMAHA) stringwidth pop %获取OMAHA字符串的宽度108 exch sub 2 div      %108 - (字符宽度 / 2)作为x的偏移量0 rmoveto               %将图龟移动到该点进行字符串显示(目的为让字符串显示在logo的正中央)(OMAHA) show } def255 465 translatebackground
moon
omaha
showpage

6.4、总结

repeat

      重复执行程序n次

rotate  

      逆时针方向旋转坐标系

scale

      x,y方向缩放坐标系      

translate

      将坐标原点进行移动      

grestore

      恢复上一次保存的图形状态

gsave   

      保存当前图形状态 

arc      x y r ang1 ang2 -> —

      逆时针添加圆弧        

arcn      x y r ang1 ang2 -> —

      顺时针添加圆弧

arcto     x1 y1 x2 y2 r -> xt1 yt1 xt2 yt2

      绘制圆弧,参数五个,两点一个半径,返回值为圆弧的起始点和终止点  

currentpoint  — -> x y   

      返回当前点的坐标  

  

  

  

  

  

  

  

 

 

转载于:https://www.cnblogs.com/Ansing/p/9996005.html

PostScript语言教程(六、图形变换)相关推荐

  1. c语言二维图形变换程序,C语言图形编程(五、二维图形变换-01)(国外英文资料).doc...

    C语言图形编程(五.二维图形变换-01)(国外英文资料) C语言图形编程(五.二维图形变换-01)(国外英文资料) The first user coordinates to the screen c ...

  2. c语言二维图形变换程序,【计算机图形学】3-2 二维几何变换根本代码

    [计算机图形学]3-2 二维几何变换基本代码 返回目录 基本理论参见:[计算机图形学]3-1 二维几何变换基本理论 注:这里不考虑插值的问题. 全部的代码都在https://github.com/Cy ...

  3. 图形基本变换c语言代码,图形变换-C语言课程设计.doc

    学号 <> 课程设计报告 图形变换网络工程班级:16(3)姓名:指导教师:成绩: 计算机学院 2017 年 5月 10日 目录- 1 - 1 设计要求- 2 - 2 程序功能- 2 - 3 ...

  4. WebGL简易教程(五):图形变换(模型、视图、投影变换)

    文章目录 1. 概述 2. 详论 1) 模型变换 (1) 平移变换 (2) 缩放变换 (3) 旋转变换 (4) 组合变换 2) 视图变换 (1) 原理 (2) 推导 3) 投影变换 (1) 透视投影 ...

  5. R语言七天入门教程六:文件相关操作

    R语言七天入门教程六:文件相关操作 一.文件的读写 R 语言作为统计学编程语言,常常需要处理大量数据,而这些数据通常会从文件中进行读取,因此文件读写在R语言中是非常重要的操作.在R语言中,用到最多的文 ...

  6. 计算机图形学 第六章 图形变换

    计算机图形学 第六章 图形变换 这章一般只考一道题(10分左右) 数学基础 (都是线性代数的知识,这里略写) 齐次坐标: 将一个原本是 nnn 维的向量用一个 n+1n+1n+1 维向量来表示 如 ( ...

  7. 设计一个可以变换的c语言图案,关于图形和变换专题的数学试题

    关于图形和变换专题的数学试题 图形和变换训练试题(带答案) 一. 精心选一选(每题3分,共 30 分) 1.下列图中全等的图形是( ) 2.把一个正方形三次对折后沿虚线剪下, 如图所示: 则所得的图形 ...

  8. 实验六 2D图形变换

    ZZU的学弟学妹们不要抄作业哦~(`Д´) 一.实验目的 1.了解和掌握2D图形变换:学会使用OpenGL平移.旋转和比例缩放函数,掌握基本图形变换和复合图形变换实现的方法. 2.综合运用2D图形变换 ...

  9. c语言有趣的图形,数图形

    以问题为载体 以过程为核心--<数图形中的学问>教学反思新课程标准中指出"综合与实践"的实施是以问题为载体.以学生自主参与为主的学习活动.实施时,教师不仅要关注结果,更 ...

  10. Swift语言教程中文文档

    Swift语言教程中文文档 Swift语言教程(一)基础数据类型 Swift语言教程(二)基础数据类型 Swift语言教程(三)集合类型 Swift语言教程(四) 集合类型 Swift语言教程(五)控 ...

最新文章

  1. 代码质量第4层——健壮的代码!
  2. 雅可比迭代(Jocabi)
  3. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
  4. 大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式
  5. jquery file upload 后台收到的文件名中文乱码, filename中文乱码
  6. javascript代码总结
  7. Spring+MyBatis企业应用实战 - 笔记- Java EE应用
  8. 分布式存储系统学习笔记(一)—什么是分布式系统(6)—2PC和Paxos协议
  9. Android IOS WebRTC 音视频开发总结(二二)-- 多人视频架构模式
  10. 计算机终端保密检查 玩游戏,计算机终端保密检查系统
  11. python二维向量公式坐标叉乘_NumPy叉乘
  12. php高清晰度无损压缩
  13. 主板rgb接口是什么_什么是主板?
  14. 初识c语言—学习笔记
  15. 万能和弦与和弦走向浅析
  16. windows黑客编程技术之隐藏技术(进程伪装,傀儡进程,进程隐藏)
  17. PMP考试常见图表讲解:迭代燃尽图、S曲线图……
  18. UE4(unreal Engine)中使用蓝图类Actor创建开关门,并使用鼠标和键盘控制开关门
  19. 2021.3.24 正则表达式
  20. 梦幻单机游戏添加怪物lua

热门文章

  1. echarts 世界地图 国家 中英文数据 nameMap
  2. 3.28Javase笔记day01
  3. MySQL DUAL表的作用
  4. selenium满屏操作(浏览器最大化)
  5. 呕心编写的《金牌网管师——金牌网吧网管》
  6. 网管服务器系统巡检报告,网络设备巡检报告-20210730125215.docx-原创力文档
  7. Android字符小写转大写,大写转小写
  8. PIKA trouble02 -- (error) ERR Syntax error, try CLIENT (LIST [order by [addr|idle]| KILL ip:port)
  9. Layui Table格式化日期(表格)
  10. 未来中国最热门的十大职业