一、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 或 dst | Vsrc 或 Vdst | 意义 |
0 | n/a | 默认值。不透明。Cd' = Ci,即源文件像素值和目的文件像素值相同 |
1 | 1 | Vsrc 和 Vdst 取1,则上述公式一中括号内的计算值和原值相同 |
2 | 0 | Vsrc 和 Vdst 取0,则上述公式一中括号内的计算值为0 |
3 | Image'a | Vsrc 和 Vdst 取图像 alpha channel 的混合值 |
4 | 1-Image'a | Vsrc 和 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
然后就能得到了: