【IDL】获取參边形的最小外接矩形
原理很简单,就是通过循环旋转多边形,获取外接矩形,找到其中面积最小的即可。
效果图如下:
代码下载:https://pan.baidu.com/s/1ZLd9KLKQZQHEAAYSRtTwgQ
代码如下:
;+
; :Description:
; IDL中获取多边形的最小外接矩形
;
; :Author: duhj@geoscene.cn
;
; :Date: 2018-8-28 11:12:05
;-
PRO test_Minimum_Enclosing_Rectangle
COMPILE_OPT idl2
;输入多边形
x = [0,1,3,9,7,4,2,1]
y = [7,9,8,7,5,3,4,3]
oROI = IDLanROI(x, y)
;获取x、y范围,初始外接矩形
oROI.GetProperty, ROI_XRANGE=min_xrange, ROI_YRANGE=min_yrange
rect_x = min_xrange[1]-min_xrange[0] ;长
rect_y = min_yrange[1]-min_yrange[0] ;宽
min_rect_area = rect_x*rect_y ;面积
center = [MEAN(min_xrange), MEAN(min_yrange), 0] ;中心点
degree_per = 2 ;每次旋转的角度,理论上此值越小越精确
rotate_times = ROUND(90/degree_per) ;旋转次数
min_i = 0 ;记录获取最小外接矩形时的旋转次数
;开始旋转
FOR i=1,rotate_times DO BEGIN
;绕Z轴旋转
oROI.Rotate, [0,0,1], degree_per, center=center
oROI.GetProperty, ROI_XRANGE=xrange, ROI_YRANGE=yrange
;旋转后外接矩形面积
tmp_rect_area = (xrange[1]-xrange[0])*(yrange[1]-yrange[0])
;如果面积小于之前的,则记录下来
IF tmp_rect_area LT min_rect_area THEN BEGIN
min_xrange = xrange
min_yrange = yrange
min_rect_area = tmp_rect_area
min_i = i
ENDIF
ENDFOR
;旋转后的最小外接矩形,需要再旋转回去
min_x = [min_xrange[0],min_xrange[1],min_xrange[1],min_xrange[0]]
min_y = [min_yrange[1],min_yrange[1],min_yrange[0],min_yrange[0]]
MER = IDLanROI(min_x, min_y)
MER.Rotate, [0,0,1], -min_i*degree_per, center=center
MER.GetProperty, data=mer_data ;最小外接矩形的4个角点
;显示输入多边形和最小外接矩形
vROI = IDLgrROI(x, y)
vMER = IDLgrROI(mer_data, color=[255,0,0])
XOBJVIEW, [vROI, vMER]
END

本文来自地理遥感生态网平台www.gisrs.cn,作者:地理遥感生态网平台,转载请注明原文链接:https://www.cnblogs.com/gisrs365/p/18271177