IDL 对象图形法 二维图形类(二):多边形对象 IDLgrPolygon 用例解析

一、IDLgrPolyline  和 IDLgrPolygon

线对象 IDLgrPolyline 和多边形对象 IDLgrPolygon 都可以绘制多边形,不过它俩绘制的多边形有个很明显的区别就是后者绘制的多边形是闭合填充的。

pro Grpolygon
  oWindow=OBJ_NEW('IDLgrWindow',DIMENSIONS=[400,400])
  oView=IDLgrView()
  oModel=IDLgrModel()
  oPolyline=IDLgrPolyline()
  oPolygon=IDLgrPolygon()
  oView.Add,oModel
  oModel.Add,[oPolygon,oPolyline]
  
  data=FLTARR(2,4);
  data[0,*]=[-.5,-.5,-.1,-.1]
  data[1,*]=[-.5,-.1,-.1,-.5]
  oPolyline.SetProperty,COLOR=[255,0,0],DATA=data
  oPolygon.SetProperty,COLOR=[0,0,255],DATA=data+0.5
  oWindow.Draw,oView
end

二、多边形的填充

多边形的填充需要用到另一个对象 IDLgrPattern 

  oPattern=IDLgrPattern(STYLE=2)
  oPolygon.SetProperty,FILL_PATTERN=oPattern
  oWindow.Draw,oView

IDLgrPattern 的 STYLE 有3种:

  • 0-全色填充
  • 1-线填充
  • 2-pattern(我也不知道翻译成啥好)

效果分别就是这样

 

它也可以用图片填充,需要用到它的一些属性和 IDLgrImage 对象

READ_PNG,'E:\YSUFourthYear\PracticalTrainingCompany\Project\GrPolygon\tree.png',imgData,/true  ;读入一张png图片到imgData中
oImage=IDLgrImage(imgData,BLEND_FUNCTION=[3,4])
;FILL_PATTERN=OBJ_NEW()重置之前设置的样式
oPolygon.SetProperty,TEXTURE_MAP=oImage,FILL_PATTERN=OBJ_NEW(),TEXTURE_COORD=$
    [[0,0],[0,1],[1,1],[1,0]],COLOR=[255,255,255]
oWindow.Draw,oView

 IDLgrImage图像对象提供了几种显示方式:

  • 单通道(每个像素点一个值;可以是灰度图或彩色图)
  • 双通道(灰度图+透明度(alpha))ji
  • 三通道(红绿蓝三色,又称RGB)
  • 四通道(红绿蓝+透明度,又称RGBA)

上述代码中的 BLEND_FUNCTION 属性是一个含两个元素的整型数组,第一个记为 src,第二个记为 dst,比如本例中 src=3,dst=4 。用来控制 alpha channel 值的解析方式,计算出窗口中各个像素点的值,计算公式如下:
                                                                  (公式一)

Ci 是源图片某一像素点的颜色值,Cd 是显示窗口的背景色像素值,Cd'是最终要显示的图片的像素值。

src 、dst 与Vsrc、Vdst的对应关系如下:

src 或 dstVsrc 或 Vdst意义
0n/a默认值。不透明。Cd' = Ci,即源文件像素值和目的文件像素值相同
11

Vsrc 和 Vdst 取1,则上述公式一中括号内的计算值和原值相同

20Vsrc 和 Vdst 取0,则上述公式一中括号内的计算值为0
3Image'aVsrc 和 Vdst 取图像 alpha channel 的混合值
41-Image'aVsrc 和 Vdst 等于一减去图像 alpha channel 的混合值

上述 BLEND_FUNCTION=[3,4] 则表明,我加载的源图片文件是含透明度因素的,因为我加载的是 png 格式的图片嘛。经由这种方式创建的图像,在该图像中,我们可以在前景图像的 alpha 通道值所定义的范围内,从前景图像看到背景,也就是说存在一定透明度。

oPolygon 的属性中,TEXTURE_MAP 是要填充到多边形中的图像对象,它的方向将由 TEXTURE_COORD 进行设定。

如果省略了 TEXTURE_MAP 属性,多边形将填充由 COLOR 或 VERT_COLORS 指定的颜色。

如果 TEXTURE_MAP 和 COLOR或VERT_COLORS 同时存在,最后图像的颜色将由对象的 base color进行调制,这意味着如果想要把图片最清晰的进行显示,COLOR属性应该设置为[255,255,255],要移除图像显示的话,把TEXTURE_MAP设置成空对象引用就行。

最终效果:

当 TEXTURE_COORD 中的值超出[0,1]范围时,会把图片进行平铺

  Texture_Coord=[[0,0],[0,2],[2,2],[2,0]]
  oPolygon.SetProperty,TEXTURE_COORD=Texture_Coord
  oWindow.Draw,oView

三、绘制凹多边形

利用 IDLgrPolygon 不能直接画出一个凹多边形,比如我们打算画一个这样的凹多边形:

代码理论上是这样的:
 

pro Grpolygon
  oWindow=OBJ_NEW('IDLgrWindow',DIMENSIONS=[400,300])
  oView=IDLgrView()
  oModel=IDLgrModel()  
  oPolygon=IDLgrPolygon()
  oView.Add,oModel
  oModel.Add,oPolygon
  
  data=FLTARR(2,8)
  data[0,*]=[-.75,.75,.75,.25,.25,-.25,-.25,-.75]
  data[1,*]=[-.75,-.75,.75,.75,0,0,.75,.75]
  oPolygon.SetProperty,COLOR=[0,0,255],DATA=data
  oWindow.Draw,oView
end

它的各个顶点分别如下:

但实际上画出来的图是这样的:

要绘制凹多边形,我们需要用到另一个对象 IDLgrTessellator

  oTessellator=IDLgrTessellator()
  oTessellator.AddPolygon,data   ;传入多边形顶点数据
  tmp=oTessellator.Tessellate(vert,poly)  ;它会把数据返回到 vert 和 poly中
  oPolygon.SetProperty,DATA=vert,POLYGONS=poly  ;再利用 vert 和 poly 进行绘制
  oWindow.Draw,oView

 

然后就能得到了:

第一章 起步篇 8 本章概述 8 书写本书的背景 8 运用本书 9 IDL所需的版本 9 IDL运行期间所需颜色的数量 9 本书的风格习惯 10 本书中所用的IDL程序和数据文件 12 获取更多的帮助 14 使用IDL命令 14 IDL命令解析 14 创建变量 17 使用IDL图形窗口 22 第章 简单的图形显示 25 本章概述 25 IDL中简单的图形显示 25 创建线画图 25 定制线画图 28 改变线条的线型和粗细 28 用符号代替线条显示数据 29 用不同的颜色绘制线画图 31 限定线画图的范围 31 改变线画图的风格 32 在线画图上绘出多种数据集 34 在多个轴的图上显示数据 35 创建曲面图 36 定制曲面图 38 旋转曲面图 38 为曲面赋色 39 修改曲面图外观 40 创建阴影曲面图 41 改变阴影处理参数 41 用其它数据集为阴影处理提供参数 42 创建等值线图 43 选择等值线数目 45 修改等值线图 46 改变等值线图的外观 47 给等值线图赋色 48 创建填充的等值线图 49 在显示窗口定位图形输出 51 设置图形边缘 52 设置图形位置 52 设置图形区域 53 创建多个图形 53 给图形显示添加文本 57 找出可用字体的名称 58 用XYOutS命令添加文本 58 用矢量字体使用XYOut 59 排列文本 60 删除文本 61 改变文本的方向 61 给图形显示添加线和符号 61 图形显示添加色彩 62 第三章 图像数据处理 65 本章概要 65 图像处理 65 显示图像 65 调整图像数据 67 显示24位图像 69 控制图像显示顺序 70 改变图像尺寸 70 在显示窗口中定位图像 72 从显示器中取图像 75 IDL中基本的图像处理 75 直方图均衡化 76 平滑图像 77 增强图像棱边 79 图像的频域滤波 80 第四章 图形显示技术 83 本章概要 83 IDL的颜色运用 83 使用索引颜色模式和RGB颜色模式 83 在24位显示设备上装载色谱表 88 获得色谱表的拷贝 88 修改和创建色谱表 89 保存自己的色谱表 90 创建自己的轴标注 91 调整轴刻度间隔 91 格式化轴的标注 92 用IDL处理残缺的数据 95 用IDL建立三维坐标系 97 建立三维散点图 97 从图形原点定位3D坐标轴 99 组合简单图形显示 100 IDL中的动画数据 102 建立动画工具 103 装载动画缓冲区 103 运行动画工具 103 动画的控制 103 存储动画的像素映射图 104 其它图形数据的动画 104 网格化数据以便图形显示 105 德洛内三角网格化 106 数据的球网格化 108 第五章 图形显示技巧 110 本章概要 110 将光标用于图形显示 110 什么时候返回的光标位置? 110 哪一个鼠标键和光标共同作用呢? 111 用光标标注图形输出 111 在图像上使用Cursor命令 113 在循环中使用Cursor命令 113 从显示中删除注释 114 删除注释的异或 114 删除注释的设备拷贝 116 Z图形缓冲区中的图形显示技巧 120 Z图形缓冲区的实现 121 一个Z图形缓冲区实:两个曲面 121 用Z图形缓冲区使图像变 123 Z图形缓冲区中的透明效果 126 将Z图形缓冲区效果与体数据着色相结合 127 第六章 在IDL写数据 129 本章概要 129 打开文件进行写 129 查找和选择数据文件 130 获取逻辑设备号 131 写格式化数据 132 写自由格式文件 133 写自由格式文件的实 136 用确定的文件格式写入 139 从字符串中取格式数据 141 写非格式化数据 141 取非格式化图像数据文件 142 写非格式化图像数据文件 142 非格式化数据文件的一些问题 144 用关联变量存取非格式化数据文件 144 写常用文件格式的文件 147 创建彩色GIF文件 147 创建彩色JPEG文件 148 查询图像文件信息 150 第七章 图形硬拷贝输出 151 本章概要 151 选择图形硬拷贝输出设备 151 配置图形硬拷贝输出设备 152 常用的Device命令关键字 153 创建PostScript文件 154 将图形送到硬拷贝设备中 154 打印PostScript文件 155 在运行MacOS系统的计算机上打印PostScript文件 156 在Windows计算机上打印PostScript文件 156 生成封装的PostScript文件输出 156 封装PostScript图形的预览 157 生成彩色的PostScript输出 157 PostScript中的彩色图像与灰度图像 158 在PostScript设备上创建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值