科学网

 找回密码
  注册

tag 标签: 对象图形法

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

IDL中绘制实心三角形
dongyanqing 2012-5-18 21:41
IDL中绘制实心三角形
看到了群里有人问这个问题,想了下。可以从直接图形法和对象图形法角度分别实现。 绘制类似的符号,可以通过系统字体的方式,如在 Word 中单击 - ,界面中选择相应符合,如 ▲ 。界面如下: 得到如下信息,字体“ Wingdings3 ”下十进制数值“ 112 ”对应的符号是“▲”。 IDL 中根据这些信息绘制三角形的相关代码如下: FUNCTION RGB2IDX, RGB RETURN, rgb + (rgb *2L^8) + (rgb *2L^16) END ; 直接图形法 sysFont = !p. FONT !P. FONT = 0 ; 创建窗口 WINDOW , 1 ,xsize = 400 ,ysize = 300 ; 使用 Wingdings 3 字体,大小为 50 (可任意修改) DEVICE ,set_font = 'Wingdings 3*50' ; 输出符号 XYOUTS , 0.5 , 0.5 ,$ STRING ( 112b ), $ /normal,$ CHARSIZE = 40 , $ color = RGB2IDX ( * 255 ) ; 恢复系统默认参数 !p. FONT = sysFont 对象图形法下也可以通过调用字体字符的方式来实现,代码如下: ; 对象图形法 oFont = Obj_New('IDLgrFont','Wingdings 3') oText = Obj_New('IDLgrText',string(112b),font = oFont) Xobjview,oText 除此之外,可以通过创建 IDLgrPolygon 或 IDLgrPolyline 对象的方式来实现,代码如下: ; 三角形的三顶点坐标 data = FLTARR(2,3) data = data = *2 ; 创建多边形对象 oPoly = OBJ_NEW('IDLgrPolygon',data,color = ) XOBJVIEW,oPoly
个人分类: IDL技术|14900 次阅读|0 个评论
IDL下同时显示不同分辨率图像的方式
dongyanqing 2011-11-16 22:49
IDL下同时显示不同分辨率图像的方式
问题出发点:两个图像分辨率不一致的时候,如何正确的同时进行显示呢。 分析:做一个假设,假设两幅图的地理坐标范围一致,图像分辨率不一致,图像的像素尺寸也不一致,那么显示的时候就不能以图像的像素尺寸为准了,需要考虑图像的地理坐标范围。这也是正确的显示多幅带地理坐标的图像所要考虑的内容。 解决:问题归结到显示坐标系上, IDL 中的坐标系分图像坐标系、归一化坐标系、数据坐标系三种。如果需要两幅图正确的显示在一起,那么需要统一到同一坐标系下。 下面以显示 IDL 自带的两个图像文件(全球范围)为例,分别按原始图像坐标(显示不匹配)、特定数据范围坐标(显示匹配)和归一化坐标(显示匹配)进行了显示。示例代码: PRO TEST_DPIO ; oWindow = OBJ_NEW ( 'IDLgrWindow' , $ retain = 2 , $ title = ' 原始图像坐标显示 ' ,$ DIMENSIONS = ) ; 设置显示区域坐标为归一化坐标 oView = OBJ_NEW ( 'IDLgrView' , viewPlane_Rect = ) imageModel1 = OBJ_NEW ( 'IDLgrModel' ) imageModel2= OBJ_NEW ( 'IDLgrModel' ) oTopModel= OBJ_NEW ( 'IDLgrModel' ) oTopModel- ADD , ; 对象显示体系结构示意图 ; oView ; | ; oTopModel ; / \ ; / \ ; imaeModel1 imageModel2 oView- ADD ,oTopModel ; 读取图像文件数据 file1 = filepath ( 'day.jpg' , SUBDIRECTORY= ) read_jpeg ,file1,data1 ; 图像大小 help ,data1 file2 = filepath ( 'avhrr.png' , SUBDIRECTORY= ) data2 = READ_PNG (file2,r,g,b) ; 图像大小 help ,data2 ; 创建图像对象 oImage1 = OBJ_NEW ( 'IDLgrImage' , $ data1) imageModel1- ADD ,oImage1 ; 创建颜色表对象 oPalette = OBJ_NEW ( 'IDLgrPalette' ,r,g,b) ; 创建图像对象 oImage2 = OBJ_NEW ( 'IDLgrImage' , $ PALETTE = oPalette,$ data2) imageModel2- ADD ,oImage2 ; 图像坐标显示 oView- SETPROPERTY , viewPlane_Rect = ; 闪烁显示 FOR i= 0 , 6 DO BEGIN wait , 0.5 oImage2- SETPROPERTY ,hide =(i MOD 2 ) oWindow- DRAW ,oView ENDFOR ; ; 方法 1 ----- 设置 image2 的显示范围为 image1 的范围 ; 如显示地理坐标数据一般采取此方法 ; oView- SETPROPERTY ,viewPlane_Rect = oWindow- SETPROPERTY ,title = ' 特定坐标范围显示 ' queryStatus = QUERY_IMAGE (file1, imageInfo) oImage2- SETPROPERTY ,dimension = imageInfo. DIMENSIONS ; 闪烁显示 FOR i= 0 , 6 DO BEGIN wait , 0.5 oImage2- SETPROPERTY ,hide =(i MOD 2 ) oWindow- DRAW ,oView ENDFOR ; ; ; 方法 2 ----- 两个图像不管大小,全部均一化显示 ; Obj_Destroy ,oImage2 ; 创建图像对象 oImage2 = OBJ_NEW ( 'IDLgrImage' , $ PALETTE = oPalette,$ data2) imageModel2- ADD ,oImage2 ; 获取当前图像对象的 X 、 Y 方向的范围 oImage1- GETPROPERTY , xRange = xRange,yRange = yRange ; 求出归一化系数 xr = NORM_COORD (xRange) yr = NORM_COORD (yRange) ;xr 和 yr 解析: xrange = ,xr 是两个参数 , , 通过设置该参数, ; 那么转换后 x 方向的原数据坐标为 xr +xr *xrange = -0+0.002777*0 = 0 ; xr +xr *xRange = -0+0.002777*360 =1 ; 可测试 Norm_Coord( ) = ; ; 归一化坐标显示 oImage1- SETPROPERTY , xCoord_conv = xr, $ yCoord_conv = yr ; 获取当前图像对象的 X 、 Y 方向的范围 oImage2- GETPROPERTY , xRange = xRange,yRange = yRange ; 求出归一化系数 xr = NORM_COORD (xRange) yr = NORM_COORD (yRange) ; 归一化坐标显示 oImage2- SETPROPERTY , xCoord_conv = xr, $ yCoord_conv = yr oView- SETPROPERTY ,viewPlane_Rect = oWindow- SETPROPERTY ,title = ' 归一化坐标显示 ' ; 闪烁显示 FOR i= 0 , 6 DO BEGIN wait , 0.5 oImage2- SETPROPERTY ,hide =(i MOD 2 ) oWindow- DRAW ,oView ENDFOR END 代码中的知识点: 1、 对象图形法显示图像的方式; 2、 对象图形法显示自带颜色表的 png 图像文件方式( IDLgrPalette 对象); 3、 不同坐标系统下的图像正确显示;
个人分类: IDL技术|6483 次阅读|0 个评论
[转载]IDL下绘制颜色棒(colorbar)
热度 1 dongyanqing 2011-4-26 00:17
[转载]IDL下绘制颜色棒(colorbar)
在IDL绘图过程中,经常使用颜色棒,对iTools和IDL8.0下的快速可视化非常容易,在直接图形法和对象图形法下实现颜色棒的绘制,特别是特殊颜 色棒,如两边带箭头标识的。下面colorbar对象类实现绘制颜色棒,调用参考类文件中COLORBAR_EXAMPLE,示例效果 见下图。 ;+ ; :Description: ; 析构函数 ;- PRO COLORBAR::CLEANUP COMPILE_OPT idl2 OBJ_DESTROY, self.OFONT PTR_FREE,self.STEPCOLOR self-IDLGRMODEL::CLEANUP END ;+ ;创建功能 ;- PRO COLORBAR::CreateColorBar COMPILE_OPT idl2 objPolys = OBJARR(2,self.SCALENUM) startLoc = self.LOCATION colors = *(self.STEPCOLOR) IF self.DIRECTION EQ 1 THEN eachDims = self.DIMENSION/ $ ELSE eachDims = self.DIMENSION/ IF self.FLOATLEN EQ 0 THEN format='(I0)' ELSE format='(f0.'+STRTRIM(self.FLOATLEN,2)+')' self.OFONT = OBJ_NEW('IDLgrFont','Times New Roman') ;带尖的 IF self.AXISSTYLE EQ 1 THEN BEGIN oTexts = OBJARR(self.SCALENUM-1) ;水平方向,10个颜色,10个多边形,9个刻度 eachValue = (self.MAXVALUE - self.MINVALUE)/self.SCALENUM oModel= OBJ_NEW('IDLgrModel') FOR i=0, self.SCALENUM-1 DO BEGIN ;竖直的话 IF self.DIRECTION EQ 1 THEN BEGIN xLen = eachDims /2 tmpx = startLoc tmpy = startLoc +eachDims *i IF i EQ 0 THEN BEGIN data = , ], ]] ENDIF ELSE IF i EQ self.SCALENUM-1 THEN BEGIN data = , ], ] ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *xLen, $ CHAR_DIMENSIONS = *xLen, $ font = self.OFONT) self-ADD,oTexts ENDIF ELSE BEGIN data = , ], ], ] ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *xLen, $ CHAR_DIMENSIONS = *xLen, $ font = self.OFONT) self-ADD,oTexts ENDELSE objPolys = OBJ_NEW('IDLgrPolygon',data,color =colors ) objPolys = OBJ_NEW('IDLgrPolygon',data,color = ,style =1,$ thick =2 ) ;水平方向,10个颜色,10个多边形,9个刻度 ENDIF ELSE BEGIN tmpx = startLoc +eachDims *i yLen = eachDims /2 tmpy = startLoc +yLen ;;最后的 表示可用X、Y,则颜色棒大小仅为X,Y/2,剩下为文字 IF i EQ 0 THEN BEGIN data = , ,tmpy], ,tmpy+yLen]] ENDIF ELSE IF i EQ self.SCALENUM-1 THEN BEGIN data = , ,tmpy+yLen/2], ] ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *yLen, $ CHAR_DIMENSIONS = *yLen, $ font = self.OFONT) self-ADD,oTexts ENDIF ELSE BEGIN ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *yLen, $ CHAR_DIMENSIONS = *yLen, $ font = self.OFONT) self-ADD,oTexts data = , ,tmpy], ,tmpy+yLen], ] ENDELSE objPolys = OBJ_NEW('IDLgrPolygon',data,color =colors ) objPolys = OBJ_NEW('IDLgrPolygon',data,color = ,style =1,$ thick =2 ) ENDELSE self-ADD, ,objPolys ] ENDFOR ENDIF ELSE BEGIN oTexts = OBJARR(self.SCALENUM+1) ;10个颜色,10个多边形,11个刻度 eachValue = (self.MAXVALUE - self.MINVALUE)/self.SCALENUM ;竖直的 IF self.DIRECTION EQ 1 THEN BEGIN xLen = eachDims /2 FOR i=0, self.SCALENUM-1 DO BEGIN tmpx = startLoc tmpy = startLoc +eachDims *i data = , , ], ]] objPolys = OBJ_NEW('IDLgrPolygon',data,color =colors ) objPolys = OBJ_NEW('IDLgrPolygon',data,color = ,style =1,$ thick =2 ) self-ADD, ,objPolys ] ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *xLen, $ CHAR_DIMENSIONS = *xLen, $ font = oFont) self-ADD,oTexts IF i EQ self.SCALENUM-1 THEN BEGIN i++ tmpy+=eachDims curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *xLen, $ CHAR_DIMENSIONS = *xLen, $ font = oFont) self-ADD,oTexts ENDIF ENDFOR ENDIF ELSE BEGIN yLen = eachDims /2 ;水平的 FOR i=0, self.SCALENUM-1 DO BEGIN tmpx = startLoc +eachDims *i tmpy = startLoc +yLen data = , ,tmpy], ,tmpy+yLen], ] objPolys = OBJ_NEW('IDLgrPolygon',data,color =colors ) objPolys = OBJ_NEW('IDLgrPolygon',data,color = ,style =1,$ thick =2 ) self-ADD, ,objPolys ] ;绘制刻度 curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *yLen, $ CHAR_DIMENSIONS = *yLen, $ font = oFont) self-ADD,oTexts IF i EQ self.SCALENUM-1 THEN BEGIN i++ tmpx+=eachDims curValue = self.MINVALUE+eachValue*i oTexts = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$ location = - *yLen, $ CHAR_DIMENSIONS = *yLen, $ font = oFont) self-ADD,oTexts ENDIF ENDFOR ENDELSE ENDELSE END ; ;颜色棒类初始化函数 FUNCTION COLORBAR::INIT,$ maxValue = maxValue, $ ;刻度最大值 minValue = minValue, $ ;刻度最小值 floatLen = floatLen, $ ;浮点数小数长度 direction = direction, $ ;方向,默认为水平,1为竖直 scaleNum = scaleNum, $ ;刻度个数,默认是10 stepColor = stepColor, $ ;刻度颜色,为 数组 Dimension = dimension, $ ;颜色表尺度,默认为 location = location , $ ;颜色表位置,左下角起点坐标 axisstyle = axisstyle , $ ;style=0默认普通,style=1带尖的颜色表 extra = extra IF (self-IDLGRMODEL::INIT(_Extra=extra) NE 1) THEN RETURN, 0 ;如不设置则调用默认参数 IF N_ELEMENTS(maxValue) GT 0 THEN self.MAXVALUE = maxValue ELSE self.MAXVALUE =1 IF N_ELEMENTS(minValue) GT 0 THEN self.MINVALUE = minValue ELSE self.MINVALUE =0 IF N_ELEMENTS(floatLen) GT 0 THEN self.FLOATLEN = floatLen ELSE self.FLOATLEN =2 IF N_ELEMENTS(scaleNum) GT 0 THEN self.SCALENUM = scaleNum ELSE self.SCALENUM = 10 IF N_ELEMENTS(axisstyle) GT 0 THEN self.AXISSTYLE = axisstyle IF N_ELEMENTS(direction) GT 0 THEN self.DIRECTION = direction IF N_ELEMENTS(Dimension) GT 0 THEN self.DIMENSION = Dimension ELSE BEGIN IF self.DIRECTION THEN self.DIMENSION = ELSE self.DIMENSION = ENDELSE IF N_ELEMENTS(location) GT 0 THEN self.LOCATION = location ;默认颜色表 IF N_ELEMENTS(stepColor) GT 0 THEN self.STEPCOLOR = PTR_NEW(stepColor,/No_Copy) ELSE BEGIN LOADCT,3 TVLCT,r,g,b,/get stepColor = BYTARR(3,self.SCALENUM) eachStep = FIX(256/self.SCALENUM) FOR i=0,self.SCALENUM-1 DO BEGIN stepColor = ,g ,b ] ENDFOR self.STEPCOLOR =PTR_NEW(stepColor,/No_Copy) ENDELSE ;创建 self-CREATECOLORBAR ;直接返回1了,不太严谨。 RETURN,1 END ;类初始化函数 PRO COLORBAR__DEFINE ;结构体 void = {colorBar, $ INHERITS IDLgrModel, $ polygon : PTR_NEW(), $ oFont : OBJ_NEW(), $ oModel: OBJ_NEW(), $ direction:0, $ maxValue:1., $ minValue:0., $ floatLen:2, $ scaleNum:10, $ axisstyle : 0b, $ location: ,$ dimension: ,$ stepcolor:PTR_NEW() } END ;+++ ;Write_By DYQ ;http://hi.baidu.com/dyqwrp ;http://blog.sciencenet.cn/?344887 ;QQ: /ty笑因快乐 ;调用示例程序,继承IDLgrModel,可以在程序中Add到oModel中或oView中。 ; PRO COLORBAR_EXAMPLE ;通常的颜色棒 XOBJVIEW, OBJ_NEW('colorBar') ;带尖的颜色棒 XOBJVIEW, OBJ_NEW('colorBar',/axisstyle) ;创建竖直带尖头的颜色棒 XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,/direction) ;给定最值的颜色棒,floatlen为浮点位数,0为整数显示 XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,/direction,maxValue= 10,minValue=0,floatLen=0) ;给定最值的颜色棒,floatlen为浮点位数 XOBJVIEW,OBJ_NEW('colorBar',axisstyle=0,/direction,maxValue= 10,minValue=0,floatLen=2) ;指定显示色段和颜色 XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,maxValue= 10,minValue=0,floatLen=2,$ scaleNum=3, $;三个颜色段 stepcolor = , , ]*255,$;三个颜色的RGB dimension = );颜色棒大小 END
个人分类: IDL技术|4653 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-18 03:20

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部